Commit 2a0cf61c authored by VanillaSalt's avatar VanillaSalt

update deck_con

parent 08dd3309
...@@ -58,6 +58,45 @@ static bool check_set_code(const CardDataC& data, int set_code) { ...@@ -58,6 +58,45 @@ static bool check_set_code(const CardDataC& data, int set_code) {
return res; return res;
} }
void DeckBuilder::Initialize() {
mainGame->is_building = true;
mainGame->is_siding = false;
mainGame->wInfos->setVisible(true);
mainGame->wCardImg->setVisible(true);
mainGame->wDeckEdit->setVisible(true);
mainGame->wFilter->setVisible(true);
mainGame->wSort->setVisible(true);
mainGame->btnLeaveGame->setVisible(true);
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1306));
mainGame->btnSideOK->setVisible(false);
filterList = deckManager._lfList[0].content;
mainGame->cbDBLFList->setSelected(0);
ClearSearch();
is_draging = false;
prevID = 0;
is_modified = false;
mainGame->device->setEventReceiver(&mainGame->deckBuilder);
}
void DeckBuilder::Terminate() {
mainGame->is_building = false;
mainGame->wDeckEdit->setVisible(false);
mainGame->wCategories->setVisible(false);
mainGame->wFilter->setVisible(false);
mainGame->wSort->setVisible(false);
mainGame->wCardImg->setVisible(false);
mainGame->wInfos->setVisible(false);
mainGame->btnLeaveGame->setVisible(false);
mainGame->PopupElement(mainGame->wMainMenu);
mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->wACMessage->setVisible(false);
imageManager.ClearTexture();
mainGame->scrFilter->setVisible(false);
int sel = mainGame->cbDBDecks->getSelected();
if(sel >= 0)
BufferIO::CopyWStr(mainGame->cbDBDecks->getItem(sel), mainGame->gameConf.lastdeck, 64);
if(exit_on_return)
mainGame->device->closeDevice();
}
bool DeckBuilder::OnEvent(const irr::SEvent& event) { bool DeckBuilder::OnEvent(const irr::SEvent& event) {
switch(event.EventType) { switch(event.EventType) {
case irr::EET_GUI_EVENT: { case irr::EET_GUI_EVENT: {
...@@ -76,7 +115,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -76,7 +115,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)dataManager.GetSysString(1339)); mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)dataManager.GetSysString(1339));
mainGame->PopupElement(mainGame->wQuery); mainGame->PopupElement(mainGame->wQuery);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
is_clearing = true; prevID = id;
break; break;
} }
case BUTTON_SORT_DECK: { case BUTTON_SORT_DECK: {
...@@ -91,9 +130,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -91,9 +130,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_SAVE_DECK: { case BUTTON_SAVE_DECK: {
int sel = mainGame->cbDBDecks->getSelected(); int sel = mainGame->cbDBDecks->getSelected();
if(sel>-1 && deckManager.SaveDeck(deckManager.current_deck, mainGame->cbDBDecks->getItem(sel))) { if(sel >= 0 && deckManager.SaveDeck(deckManager.current_deck, mainGame->cbDBDecks->getItem(sel))) {
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;
} }
break; break;
} }
...@@ -117,6 +157,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -117,6 +157,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(deckManager.SaveDeck(deckManager.current_deck, dname)) { if(deckManager.SaveDeck(deckManager.current_deck, dname)) {
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;
} }
break; break;
} }
...@@ -130,28 +171,19 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -130,28 +171,19 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)textBuffer); mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)textBuffer);
mainGame->PopupElement(mainGame->wQuery); mainGame->PopupElement(mainGame->wQuery);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
is_deleting = true; prevID = id;
break; break;
} }
case BUTTON_LEAVE_GAME: { case BUTTON_LEAVE_GAME: {
mainGame->is_building = false; if(is_modified && mainGame->gameConf.prompt_to_discard_deck_changes) {
mainGame->wDeckEdit->setVisible(false); mainGame->gMutex.Lock();
mainGame->wCategories->setVisible(false); mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)dataManager.GetSysString(1356));
mainGame->wFilter->setVisible(false); mainGame->PopupElement(mainGame->wQuery);
mainGame->wSort->setVisible(false); mainGame->gMutex.Unlock();
mainGame->wCardImg->setVisible(false); prevID = id;
mainGame->wInfos->setVisible(false); break;
mainGame->btnLeaveGame->setVisible(false);
mainGame->PopupElement(mainGame->wMainMenu);
mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->wACMessage->setVisible(false);
imageManager.ClearTexture();
mainGame->scrFilter->setVisible(false);
if(mainGame->cbDBDecks->getSelected() != -1) {
BufferIO::CopyWStr(mainGame->cbDBDecks->getItem(mainGame->cbDBDecks->getSelected()), mainGame->gameConf.lastdeck, 64);
} }
if(exit_on_return) Terminate();
mainGame->device->closeDevice();
break; break;
} }
case BUTTON_EFFECT_FILTER: { case BUTTON_EFFECT_FILTER: {
...@@ -205,11 +237,11 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -205,11 +237,11 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->HideElement(mainGame->wQuery); mainGame->HideElement(mainGame->wQuery);
if(!mainGame->is_building || mainGame->is_siding) if(!mainGame->is_building || mainGame->is_siding)
break; break;
if(is_clearing) { if(prevID == BUTTON_CLEAR_DECK) {
deckManager.current_deck.main.clear(); deckManager.current_deck.main.clear();
deckManager.current_deck.extra.clear(); deckManager.current_deck.extra.clear();
deckManager.current_deck.side.clear(); deckManager.current_deck.side.clear();
} else if(is_deleting) { } else if(prevID == BUTTON_DELETE_DECK) {
int sel = mainGame->cbDBDecks->getSelected(); int sel = mainGame->cbDBDecks->getSelected();
if (deckManager.DeleteDeck(deckManager.current_deck, mainGame->cbDBDecks->getItem(sel))) { if (deckManager.DeleteDeck(deckManager.current_deck, mainGame->cbDBDecks->getItem(sel))) {
mainGame->cbDBDecks->removeItem(sel); mainGame->cbDBDecks->removeItem(sel);
...@@ -221,16 +253,17 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -221,16 +253,17 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
deckManager.LoadDeck(mainGame->cbDBDecks->getItem(sel)); deckManager.LoadDeck(mainGame->cbDBDecks->getItem(sel));
mainGame->stACMessage->setText(dataManager.GetSysString(1338)); mainGame->stACMessage->setText(dataManager.GetSysString(1338));
mainGame->PopupElement(mainGame->wACMessage, 20); mainGame->PopupElement(mainGame->wACMessage, 20);
is_modified = false;
} }
} else if(prevID == BUTTON_LEAVE_GAME) {
Terminate();
} }
is_clearing = false; prevID = 0;
is_deleting = false;
break; break;
} }
case BUTTON_NO: { case BUTTON_NO: {
mainGame->HideElement(mainGame->wQuery); mainGame->HideElement(mainGame->wQuery);
is_deleting = false; prevID = 0;
is_clearing = false;
break; break;
} }
case BUTTON_MARKS_FILTER: { case BUTTON_MARKS_FILTER: {
...@@ -298,6 +331,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -298,6 +331,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
case COMBOBOX_DBDECKS: { case COMBOBOX_DBDECKS: {
deckManager.LoadDeck(mainGame->cbDBDecks->getItem(mainGame->cbDBDecks->getSelected())); deckManager.LoadDeck(mainGame->cbDBDecks->getItem(mainGame->cbDBDecks->getSelected()));
is_modified = false;
break; break;
} }
case COMBOBOX_MAINTYPE: { case COMBOBOX_MAINTYPE: {
...@@ -417,7 +451,6 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -417,7 +451,6 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
case irr::EET_MOUSE_INPUT_EVENT: { case irr::EET_MOUSE_INPUT_EVENT: {
switch(event.MouseInput.Event) { switch(event.MouseInput.Event) {
case irr::EMIE_LMOUSE_PRESSED_DOWN: { case irr::EMIE_LMOUSE_PRESSED_DOWN: {
irr::core::position2di mouse_pos(event.MouseInput.X, event.MouseInput.Y);
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement(); irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
if(root->getElementFromPoint(mouse_pos) != root) if(root->getElementFromPoint(mouse_pos) != root)
break; break;
...@@ -431,100 +464,38 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -431,100 +464,38 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
draging_pointer = dataManager.GetCodePointer(hovered_code); draging_pointer = dataManager.GetCodePointer(hovered_code);
if(draging_pointer == dataManager._datas.end()) if(draging_pointer == dataManager._datas.end())
break; break;
unsigned int limitcode = draging_pointer->second.alias ? draging_pointer->second.alias : draging_pointer->first;
if(hovered_pos == 4) { if(hovered_pos == 4) {
int limit = 3; if(!check_limit(draging_pointer))
if(filterList->count(limitcode))
limit = (*filterList)[limitcode];
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
if(deckManager.current_deck.main[i]->first == limitcode
|| deckManager.current_deck.main[i]->second.alias == limitcode)
limit--;
for(size_t i = 0; i < deckManager.current_deck.extra.size(); ++i)
if(deckManager.current_deck.extra[i]->first == limitcode
|| deckManager.current_deck.extra[i]->second.alias == limitcode)
limit--;
for(size_t i = 0; i < deckManager.current_deck.side.size(); ++i)
if(deckManager.current_deck.side[i]->first == limitcode
|| deckManager.current_deck.side[i]->second.alias == limitcode)
limit--;
if(limit <= 0)
break; break;
} }
if(hovered_pos == 1) if(hovered_pos == 1)
deckManager.current_deck.main.erase(deckManager.current_deck.main.begin() + hovered_seq); pop_main(hovered_seq);
else if(hovered_pos == 2) else if(hovered_pos == 2)
deckManager.current_deck.extra.erase(deckManager.current_deck.extra.begin() + hovered_seq); pop_extra(hovered_seq);
else if(hovered_pos == 3) else if(hovered_pos == 3)
deckManager.current_deck.side.erase(deckManager.current_deck.side.begin() + hovered_seq); pop_side(hovered_seq);
is_draging = true; is_draging = true;
break; break;
} }
case irr::EMIE_LMOUSE_LEFT_UP: { case irr::EMIE_LMOUSE_LEFT_UP: {
if(!is_draging) if(!is_draging)
break; break;
if(!mainGame->is_siding) { bool pushed = false;
if((hovered_pos == 1 && (draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK))) if(hovered_pos == 1)
|| (hovered_pos == 2 && !(draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)))) pushed = push_main(draging_pointer, hovered_seq);
hovered_pos = 0; else if(hovered_pos == 2)
if((hovered_pos == 1 || (hovered_pos == 0 && click_pos == 1)) && deckManager.current_deck.main.size() < 60) { pushed = push_extra(draging_pointer, hovered_seq);
if(hovered_seq == -1) else if(hovered_pos == 3)
deckManager.current_deck.main.push_back(draging_pointer); pushed = push_side(draging_pointer, hovered_seq);
else if(hovered_seq < (int)deckManager.current_deck.main.size() && hovered_pos) else if(hovered_pos == 4 && !mainGame->is_siding)
deckManager.current_deck.main.insert(deckManager.current_deck.main.begin() + hovered_seq, draging_pointer); pushed = true;
else deckManager.current_deck.main.push_back(draging_pointer); if(!pushed) {
is_draging = false;
} else if((hovered_pos == 2 || (hovered_pos == 0 && click_pos == 2)) && deckManager.current_deck.extra.size() < 15) {
if(hovered_seq == -1)
deckManager.current_deck.extra.push_back(draging_pointer);
else if(hovered_seq < (int)deckManager.current_deck.extra.size() && hovered_pos)
deckManager.current_deck.extra.insert(deckManager.current_deck.extra.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.extra.push_back(draging_pointer);
is_draging = false;
} else if((hovered_pos == 3 || (hovered_pos == 0 && click_pos == 3)) && deckManager.current_deck.side.size() < 15) {
if(hovered_seq == -1)
deckManager.current_deck.side.push_back(draging_pointer);
else if(hovered_seq < (int)deckManager.current_deck.side.size() && hovered_pos)
deckManager.current_deck.side.insert(deckManager.current_deck.side.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.side.push_back(draging_pointer);
is_draging = false;
} else if (hovered_pos == 4)
is_draging = false;
} else {
if((hovered_pos == 1 && (draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)))
|| (hovered_pos == 2 && !(draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)))
|| hovered_pos == 4)
hovered_pos = 0;
if((hovered_pos == 1 || (hovered_pos == 0 && click_pos == 1)) && deckManager.current_deck.main.size() < 65) {
if(hovered_seq == -1)
deckManager.current_deck.main.push_back(draging_pointer);
else if(hovered_seq < (int)deckManager.current_deck.main.size() && hovered_pos)
deckManager.current_deck.main.insert(deckManager.current_deck.main.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.main.push_back(draging_pointer);
is_draging = false;
} else if((hovered_pos == 2 || (hovered_pos == 0 && click_pos == 2)) && deckManager.current_deck.extra.size() < 20) {
if(hovered_seq == -1)
deckManager.current_deck.extra.push_back(draging_pointer);
else if(hovered_seq < (int)deckManager.current_deck.extra.size() && hovered_pos)
deckManager.current_deck.extra.insert(deckManager.current_deck.extra.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.extra.push_back(draging_pointer);
is_draging = false;
} else if((hovered_pos == 3 || (hovered_pos == 0 && click_pos == 3)) && deckManager.current_deck.side.size() < 20) {
if(hovered_seq == -1)
deckManager.current_deck.side.push_back(draging_pointer);
else if(hovered_seq < (int)deckManager.current_deck.side.size() && hovered_pos)
deckManager.current_deck.side.insert(deckManager.current_deck.side.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.side.push_back(draging_pointer);
is_draging = false;
}
}
if(is_draging) {
if(click_pos == 1) if(click_pos == 1)
deckManager.current_deck.main.push_back(draging_pointer); push_main(draging_pointer);
else if(click_pos == 2) else if(click_pos == 2)
deckManager.current_deck.extra.push_back(draging_pointer); push_extra(draging_pointer);
else if(click_pos == 3) else if(click_pos == 3)
deckManager.current_deck.side.push_back(draging_pointer); push_side(draging_pointer);
} }
is_draging = false; is_draging = false;
break; break;
...@@ -535,99 +506,53 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -535,99 +506,53 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
if(hovered_pos == 0 || hovered_seq == -1) if(hovered_pos == 0 || hovered_seq == -1)
break; break;
draging_pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
if(draging_pointer == dataManager._datas.end()) if(pointer == dataManager._datas.end())
break; break;
if(hovered_pos == 1) { if(hovered_pos == 1) {
if(deckManager.current_deck.side.size() < 20) { if(push_side(pointer))
deckManager.current_deck.main.erase(deckManager.current_deck.main.begin() + hovered_seq); pop_main(hovered_seq);
deckManager.current_deck.side.push_back(draging_pointer);
}
} else if(hovered_pos == 2) { } else if(hovered_pos == 2) {
if(deckManager.current_deck.side.size() < 20) { if(push_side(pointer))
deckManager.current_deck.extra.erase(deckManager.current_deck.extra.begin() + hovered_seq); pop_extra(hovered_seq);
deckManager.current_deck.side.push_back(draging_pointer);
}
} else { } else {
if((draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) && deckManager.current_deck.extra.size() < 20) { if(push_extra(pointer) || push_main(pointer))
deckManager.current_deck.side.erase(deckManager.current_deck.side.begin() + hovered_seq); pop_side(hovered_seq);
deckManager.current_deck.extra.push_back(draging_pointer);
}
if(!(draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) && deckManager.current_deck.main.size() < 64) {
deckManager.current_deck.side.erase(deckManager.current_deck.side.begin() + hovered_seq);
deckManager.current_deck.main.push_back(draging_pointer);
}
} }
break; break;
} }
if(mainGame->wCategories->isVisible() || mainGame->wQuery->isVisible()) if(mainGame->wCategories->isVisible() || mainGame->wQuery->isVisible())
break; break;
if(hovered_pos == 0 || hovered_seq == -1)
break;
if(!is_draging) { if(!is_draging) {
draging_pointer = dataManager.GetCodePointer(hovered_code); if(hovered_pos == 0 || hovered_seq == -1)
if(draging_pointer == dataManager._datas.end())
break; break;
} if(hovered_pos == 1) {
if(hovered_pos == 1) { pop_main(hovered_seq);
if(!is_draging) } else if(hovered_pos == 2) {
deckManager.current_deck.main.erase(deckManager.current_deck.main.begin() + hovered_seq); pop_extra(hovered_seq);
else if(deckManager.current_deck.side.size() < 15) { } else if(hovered_pos == 3) {
deckManager.current_deck.side.push_back(draging_pointer); pop_side(hovered_seq);
is_draging = false; } else {
} auto pointer = dataManager.GetCodePointer(hovered_code);
} else if(hovered_pos == 2) { if(pointer == dataManager._datas.end())
if(!is_draging) break;
deckManager.current_deck.extra.erase(deckManager.current_deck.extra.begin() + hovered_seq); if(!check_limit(pointer))
else if(deckManager.current_deck.side.size() < 15) { break;
deckManager.current_deck.side.push_back(draging_pointer); if(!push_extra(pointer) && !push_main(pointer))
is_draging = false; push_side(pointer);
}
} else if(hovered_pos == 3) {
if(!is_draging)
deckManager.current_deck.side.erase(deckManager.current_deck.side.begin() + hovered_seq);
else {
if((draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) && deckManager.current_deck.extra.size() < 15) {
deckManager.current_deck.extra.push_back(draging_pointer);
is_draging = false;
} else if(!(draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) && deckManager.current_deck.main.size() < 60) {
deckManager.current_deck.main.push_back(draging_pointer);
is_draging = false;
}
} }
} else { } else {
if(is_draging) { if(click_pos == 1) {
if(deckManager.current_deck.side.size() < 15) { push_side(draging_pointer);
deckManager.current_deck.side.push_back(draging_pointer); } else if(click_pos == 2) {
is_draging = false; push_side(draging_pointer);
} } else if(click_pos == 3) {
if(!push_extra(draging_pointer))
push_main(draging_pointer);
} else { } else {
unsigned int limitcode = draging_pointer->second.alias ? draging_pointer->second.alias : draging_pointer->first; push_side(draging_pointer);
int limit = 3;
if(filterList->count(limitcode))
limit = (*filterList)[limitcode];
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
if(deckManager.current_deck.main[i]->first == limitcode
|| deckManager.current_deck.main[i]->second.alias == limitcode)
limit--;
for(size_t i = 0; i < deckManager.current_deck.extra.size(); ++i)
if(deckManager.current_deck.extra[i]->first == limitcode
|| deckManager.current_deck.extra[i]->second.alias == limitcode)
limit--;
for(size_t i = 0; i < deckManager.current_deck.side.size(); ++i)
if(deckManager.current_deck.side[i]->first == limitcode
|| deckManager.current_deck.side[i]->second.alias == limitcode)
limit--;
if(limit <= 0)
break;
if((draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) && deckManager.current_deck.extra.size() < 15) {
deckManager.current_deck.extra.push_back(draging_pointer);
} else if(!(draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) && deckManager.current_deck.main.size() < 60) {
deckManager.current_deck.main.push_back(draging_pointer);
} else if (deckManager.current_deck.side.size() < 15) {
deckManager.current_deck.side.push_back(draging_pointer);
}
} }
is_draging = false;
} }
break; break;
} }
...@@ -640,129 +565,27 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -640,129 +565,27 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
if (is_draging) if (is_draging)
break; break;
draging_pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
unsigned int limitcode = draging_pointer->second.alias ? draging_pointer->second.alias : draging_pointer->first; if(!check_limit(pointer))
int limit = 3;
if (filterList->count(limitcode))
limit = (*filterList)[limitcode];
for (size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
if (deckManager.current_deck.main[i]->first == limitcode
|| deckManager.current_deck.main[i]->second.alias == limitcode)
limit--;
for (size_t i = 0; i < deckManager.current_deck.extra.size(); ++i)
if (deckManager.current_deck.extra[i]->first == limitcode
|| deckManager.current_deck.extra[i]->second.alias == limitcode)
limit--;
for (size_t i = 0; i < deckManager.current_deck.side.size(); ++i)
if (deckManager.current_deck.side[i]->first == limitcode
|| deckManager.current_deck.side[i]->second.alias == limitcode)
limit--;
if (limit <= 0)
break; break;
if (hovered_pos == 1) { if (hovered_pos == 1) {
if (deckManager.current_deck.main.size() < 60) if(!push_main(pointer))
deckManager.current_deck.main.push_back(draging_pointer); push_side(pointer);
else if (deckManager.current_deck.side.size() < 15)
deckManager.current_deck.side.push_back(draging_pointer);
} else if (hovered_pos == 2) { } else if (hovered_pos == 2) {
if (deckManager.current_deck.extra.size() < 15) if(!push_extra(pointer))
deckManager.current_deck.extra.push_back(draging_pointer); push_side(pointer);
else if (deckManager.current_deck.side.size() < 15)
deckManager.current_deck.side.push_back(draging_pointer);
} else if (hovered_pos == 3) { } else if (hovered_pos == 3) {
if (deckManager.current_deck.side.size() < 15) if(!push_side(pointer) && !push_extra(pointer))
deckManager.current_deck.side.push_back(draging_pointer); push_main(pointer);
else {
if ((draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) && deckManager.current_deck.extra.size() < 15)
deckManager.current_deck.extra.push_back(draging_pointer);
else if (!(draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) && deckManager.current_deck.main.size() < 60)
deckManager.current_deck.main.push_back(draging_pointer);
}
} else { } else {
if ((draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) && deckManager.current_deck.extra.size() < 15) if(!push_extra(pointer) && !push_main(pointer))
deckManager.current_deck.extra.push_back(draging_pointer); push_side(pointer);
else if (!(draging_pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) && deckManager.current_deck.main.size() < 60)
deckManager.current_deck.main.push_back(draging_pointer);
else if (deckManager.current_deck.side.size() < 15)
deckManager.current_deck.side.push_back(draging_pointer);
} }
break; break;
} }
case irr::EMIE_MOUSE_MOVED: { case irr::EMIE_MOUSE_MOVED: {
int x = event.MouseInput.X; mouse_pos.set(event.MouseInput.X, event.MouseInput.Y);
int y = event.MouseInput.Y; GetHoveredCard();
irr::core::position2di mouse_pos(x, y);
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
if(root->getElementFromPoint(mouse_pos) != root)
break;
int pre_code = hovered_code;
if(x >= 314 && x <= 794 && y >= 164 && y <= 435) {
int lx = 10, px, py = (y - 164) / 68;
hovered_pos = 1;
if(deckManager.current_deck.main.size() > 40)
lx = (deckManager.current_deck.main.size() - 41) / 4 + 11;
if(x >= 750)
px = lx - 1;
else px = (x - 314) * (lx - 1) / 436;
if(py*lx + px >= (int)deckManager.current_deck.main.size()) {
hovered_seq = -1;
hovered_code = 0;
} else {
hovered_seq = py * lx + px;
hovered_code = deckManager.current_deck.main[hovered_seq]->first;
}
} else if(x >= 314 && x <= 794 && y >= 466 && y <= 530) {
int lx = deckManager.current_deck.extra.size();
hovered_pos = 2;
if(lx < 10)
lx = 10;
if(x >= 750)
hovered_seq = lx - 1;
else hovered_seq = (x - 314) * (lx - 1) / 436;
if(hovered_seq >= (int)deckManager.current_deck.extra.size()) {
hovered_seq = -1;
hovered_code = 0;
} else {
hovered_code = deckManager.current_deck.extra[hovered_seq]->first;
}
} else if (x >= 314 && x <= 794 && y >= 564 && y <= 628) {
int lx = deckManager.current_deck.side.size();
hovered_pos = 3;
if(lx < 10)
lx = 10;
if(x >= 750)
hovered_seq = lx - 1;
else hovered_seq = (x - 314) * (lx - 1) / 436;
if(hovered_seq >= (int)deckManager.current_deck.side.size()) {
hovered_seq = -1;
hovered_code = 0;
} else {
hovered_code = deckManager.current_deck.side[hovered_seq]->first;
}
} else if(x >= 810 && x <= 995 && y >= 165 && y <= 626) {
hovered_pos = 4;
hovered_seq = (y - 165) / 66;
if(mainGame->scrFilter->getPos() + hovered_seq >= (int)results.size()) {
hovered_seq = -1;
hovered_code = 0;
} else {
hovered_code = results[mainGame->scrFilter->getPos() + hovered_seq]->first;
}
} else {
hovered_pos = 0;
hovered_code = 0;
}
if(is_draging) {
dragx = x;
dragy = y;
}
if(!is_draging && pre_code != hovered_code) {
if(hovered_code) {
mainGame->ShowCardInfo(hovered_code);
}
if(pre_code)
imageManager.RemoveTexture(pre_code);
}
break; break;
} }
case irr::EMIE_MOUSE_WHEEL: { case irr::EMIE_MOUSE_WHEEL: {
...@@ -775,9 +598,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -775,9 +598,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(mainGame->scrFilter->getPos() > 0) if(mainGame->scrFilter->getPos() > 0)
mainGame->scrFilter->setPos(mainGame->scrFilter->getPos() - 1); mainGame->scrFilter->setPos(mainGame->scrFilter->getPos() - 1);
} }
SEvent e = event; GetHoveredCard();
e.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
mainGame->device->postEventFromUser(e);
break; break;
} }
default: break; default: break;
...@@ -804,6 +625,85 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -804,6 +625,85 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
return false; return false;
} }
void DeckBuilder::GetHoveredCard() {
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
if(root->getElementFromPoint(mouse_pos) != root)
return;
int x = mouse_pos.X;
int y = mouse_pos.Y;
int pre_code = hovered_code;
hovered_pos = 0;
hovered_code = 0;
if(x >= 314 && x <= 794) {
if(y >= 164 && y <= 435) {
int lx = 10, px, py = (y - 164) / 68;
hovered_pos = 1;
if(deckManager.current_deck.main.size() > 40)
lx = (deckManager.current_deck.main.size() - 41) / 4 + 11;
if(x >= 750)
px = lx - 1;
else
px = (x - 314) * (lx - 1) / 436;
hovered_seq = py * lx + px;
if(hovered_seq >= (int)deckManager.current_deck.main.size()) {
hovered_seq = -1;
hovered_code = 0;
} else {
hovered_code = deckManager.current_deck.main[hovered_seq]->first;
}
} else if(y >= 466 && y <= 530) {
int lx = deckManager.current_deck.extra.size();
hovered_pos = 2;
if(lx < 10)
lx = 10;
if(x >= 750)
hovered_seq = lx - 1;
else
hovered_seq = (x - 314) * (lx - 1) / 436;
if(hovered_seq >= (int)deckManager.current_deck.extra.size()) {
hovered_seq = -1;
hovered_code = 0;
} else {
hovered_code = deckManager.current_deck.extra[hovered_seq]->first;
}
} else if (y >= 564 && y <= 628) {
int lx = deckManager.current_deck.side.size();
hovered_pos = 3;
if(lx < 10)
lx = 10;
if(x >= 750)
hovered_seq = lx - 1;
else
hovered_seq = (x - 314) * (lx - 1) / 436;
if(hovered_seq >= (int)deckManager.current_deck.side.size()) {
hovered_seq = -1;
hovered_code = 0;
} else {
hovered_code = deckManager.current_deck.side[hovered_seq]->first;
}
}
} else if(x >= 810 && x <= 995 && y >= 165 && y <= 626) {
hovered_pos = 4;
hovered_seq = (y - 165) / 66;
int pos = mainGame->scrFilter->getPos() + hovered_seq;
if(pos >= (int)results.size()) {
hovered_seq = -1;
hovered_code = 0;
} else {
hovered_code = results[pos]->first;
}
}
if(is_draging) {
dragx = x;
dragy = y;
}
if(!is_draging && pre_code != hovered_code) {
if(hovered_code)
mainGame->ShowCardInfo(hovered_code);
if(pre_code)
imageManager.RemoveTexture(pre_code);
}
}
void DeckBuilder::StartFilter() { void DeckBuilder::StartFilter() {
filter_type = mainGame->cbCardType->getSelected(); filter_type = mainGame->cbCardType->getSelected();
filter_type2 = mainGame->cbCardType2->getItemData(mainGame->cbCardType2->getSelected()); filter_type2 = mainGame->cbCardType2->getItemData(mainGame->cbCardType2->getSelected());
...@@ -1030,4 +930,85 @@ bool DeckBuilder::CardNameContains(const wchar_t *haystack, const wchar_t *needl ...@@ -1030,4 +930,85 @@ bool DeckBuilder::CardNameContains(const wchar_t *haystack, const wchar_t *needl
} }
return false; return false;
} }
bool DeckBuilder::push_main(code_pointer pointer, int seq) {
if(pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK))
return false;
auto& container = deckManager.current_deck.main;
int maxc = mainGame->is_siding ? 64 : 60;
if((int)container.size() >= maxc)
return false;
if(seq >= 0 && seq < (int)container.size())
container.insert(container.begin() + seq, pointer);
else
container.push_back(pointer);
is_modified = true;
GetHoveredCard();
return true;
}
bool DeckBuilder::push_extra(code_pointer pointer, int seq) {
if(!(pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)))
return false;
auto& container = deckManager.current_deck.extra;
int maxc = mainGame->is_siding ? 20 : 15;
if((int)container.size() >= maxc)
return false;
if(seq >= 0 && seq < (int)container.size())
container.insert(container.begin() + seq, pointer);
else
container.push_back(pointer);
is_modified = true;
GetHoveredCard();
return true;
}
bool DeckBuilder::push_side(code_pointer pointer, int seq) {
auto& container = deckManager.current_deck.side;
int maxc = mainGame->is_siding ? 20 : 15;
if((int)container.size() >= maxc)
return false;
if(seq >= 0 && seq < (int)container.size())
container.insert(container.begin() + seq, pointer);
else
container.push_back(pointer);
is_modified = true;
GetHoveredCard();
return true;
}
void DeckBuilder::pop_main(int seq) {
auto& container = deckManager.current_deck.main;
container.erase(container.begin() + seq);
is_modified = true;
GetHoveredCard();
}
void DeckBuilder::pop_extra(int seq) {
auto& container = deckManager.current_deck.extra;
container.erase(container.begin() + seq);
is_modified = true;
GetHoveredCard();
}
void DeckBuilder::pop_side(int seq) {
auto& container = deckManager.current_deck.side;
container.erase(container.begin() + seq);
is_modified = true;
GetHoveredCard();
}
bool DeckBuilder::check_limit(code_pointer pointer) {
unsigned int limitcode = pointer->second.alias ? pointer->second.alias : pointer->first;
int limit = 3;
auto flit = filterList->find(limitcode);
if(flit != filterList->end())
limit = flit->second;
for(auto it = deckManager.current_deck.main.begin(); it != deckManager.current_deck.main.end(); ++it) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode)
limit--;
}
for(auto it = deckManager.current_deck.extra.begin(); it != deckManager.current_deck.extra.end(); ++it) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode)
limit--;
}
for(auto it = deckManager.current_deck.side.begin(); it != deckManager.current_deck.side.end(); ++it) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode)
limit--;
}
return limit > 0;
}
} }
...@@ -11,6 +11,9 @@ namespace ygo { ...@@ -11,6 +11,9 @@ namespace ygo {
class DeckBuilder: public irr::IEventReceiver { class DeckBuilder: public irr::IEventReceiver {
public: public:
virtual bool OnEvent(const irr::SEvent& event); virtual bool OnEvent(const irr::SEvent& event);
void Initialize();
void Terminate();
void GetHoveredCard();
void FilterCards(); void FilterCards();
void StartFilter(); void StartFilter();
void ClearFilter(); void ClearFilter();
...@@ -18,7 +21,15 @@ public: ...@@ -18,7 +21,15 @@ public:
void SortList(); void SortList();
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_extra(code_pointer pointer, int seq = -1);
bool push_side(code_pointer pointer, int seq = -1);
void pop_main(int seq);
void pop_extra(int seq);
void pop_side(int seq);
bool check_limit(code_pointer pointer);
long long filter_effect; long long filter_effect;
unsigned int filter_type; unsigned int filter_type;
unsigned int filter_type2; unsigned int filter_type2;
...@@ -34,6 +45,7 @@ public: ...@@ -34,6 +45,7 @@ public:
unsigned int filter_scl; unsigned int filter_scl;
unsigned int filter_marks; unsigned int filter_marks;
int filter_lm; int filter_lm;
position2di mouse_pos;
int hovered_code; int hovered_code;
int hovered_pos; int hovered_pos;
int hovered_seq; int hovered_seq;
...@@ -45,9 +57,9 @@ public: ...@@ -45,9 +57,9 @@ public:
size_t pre_extrac; size_t pre_extrac;
size_t pre_sidec; size_t pre_sidec;
code_pointer draging_pointer; code_pointer draging_pointer;
bool is_deleting; s32 prevID;
bool is_clearing; bool is_modified;
std::unordered_map<int, int>* filterList; std::unordered_map<int, int>* filterList;
std::vector<code_pointer> results; std::vector<code_pointer> results;
wchar_t result_string[8]; wchar_t result_string[8];
......
...@@ -911,6 +911,7 @@ void Game::LoadConfig() { ...@@ -911,6 +911,7 @@ void Game::LoadConfig() {
gameConf.draw_field_spell = 1; gameConf.draw_field_spell = 1;
gameConf.separate_clear_button = 1; gameConf.separate_clear_button = 1;
gameConf.auto_search_limit = -1; gameConf.auto_search_limit = -1;
gameConf.prompt_to_discard_deck_changes = 1;
fseek(fp, 0, SEEK_END); fseek(fp, 0, SEEK_END);
int fsize = ftell(fp); int fsize = ftell(fp);
fseek(fp, 0, SEEK_SET); fseek(fp, 0, SEEK_SET);
...@@ -969,6 +970,8 @@ void Game::LoadConfig() { ...@@ -969,6 +970,8 @@ void Game::LoadConfig() {
gameConf.separate_clear_button = atoi(valbuf); gameConf.separate_clear_button = atoi(valbuf);
} else if(!strcmp(strbuf, "auto_search_limit")) { } else if(!strcmp(strbuf, "auto_search_limit")) {
gameConf.auto_search_limit = atoi(valbuf); gameConf.auto_search_limit = atoi(valbuf);
} else if(!strcmp(strbuf, "prompt_to_discard_deck_changes")) {
gameConf.prompt_to_discard_deck_changes = atoi(valbuf);
} else { } else {
// options allowing multiple words // options allowing multiple words
sscanf(linebuf, "%s = %240[^\n]", strbuf, valbuf); sscanf(linebuf, "%s = %240[^\n]", strbuf, valbuf);
...@@ -1025,6 +1028,7 @@ void Game::SaveConfig() { ...@@ -1025,6 +1028,7 @@ void Game::SaveConfig() {
fprintf(fp, "separate_clear_button = %d\n", gameConf.separate_clear_button); fprintf(fp, "separate_clear_button = %d\n", gameConf.separate_clear_button);
fprintf(fp, "#auto_search_limit >= 0: Start search automatically when the user enters N chars\n"); fprintf(fp, "#auto_search_limit >= 0: Start search automatically when the user enters N chars\n");
fprintf(fp, "auto_search_limit = %d\n", gameConf.auto_search_limit); fprintf(fp, "auto_search_limit = %d\n", gameConf.auto_search_limit);
fprintf(fp, "prompt_to_discard_deck_changes = %d\n", gameConf.prompt_to_discard_deck_changes);
fclose(fp); fclose(fp);
} }
void Game::ShowCardInfo(int code) { void Game::ShowCardInfo(int code) {
......
...@@ -38,6 +38,7 @@ struct Config { ...@@ -38,6 +38,7 @@ struct Config {
int draw_field_spell; int draw_field_spell;
int separate_clear_button; int separate_clear_button;
int auto_search_limit; int auto_search_limit;
int prompt_to_discard_deck_changes;
}; };
struct DuelInfo { struct DuelInfo {
......
...@@ -244,46 +244,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -244,46 +244,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->ebDeckname->setText(L""); mainGame->ebDeckname->setText(L"");
} }
mainGame->HideElement(mainGame->wMainMenu); mainGame->HideElement(mainGame->wMainMenu);
mainGame->is_building = true; mainGame->deckBuilder.Initialize();
mainGame->is_siding = false;
mainGame->wInfos->setVisible(true);
mainGame->wCardImg->setVisible(true);
mainGame->wDeckEdit->setVisible(true);
mainGame->wFilter->setVisible(true);
mainGame->wSort->setVisible(true);
mainGame->btnLeaveGame->setVisible(true);
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1306));
mainGame->btnSideOK->setVisible(false);
mainGame->deckBuilder.filterList = deckManager._lfList[0].content;
mainGame->cbDBLFList->setSelected(0);
mainGame->cbCardType->setSelected(0);
mainGame->cbCardType2->setSelected(0);
mainGame->cbAttribute->setSelected(0);
mainGame->cbRace->setSelected(0);
mainGame->ebAttack->setText(L"");
mainGame->ebDefense->setText(L"");
mainGame->ebStar->setText(L"");
mainGame->ebScale->setText(L"");
mainGame->cbCardType2->setEnabled(false);
mainGame->cbAttribute->setEnabled(false);
mainGame->cbRace->setEnabled(false);
mainGame->ebAttack->setEnabled(false);
mainGame->ebDefense->setEnabled(false);
mainGame->ebStar->setEnabled(false);
mainGame->ebScale->setEnabled(false);
mainGame->deckBuilder.filter_effect = 0;
mainGame->deckBuilder.filter_marks = 0;
mainGame->deckBuilder.result_string[0] = L'0';
mainGame->deckBuilder.result_string[1] = 0;
mainGame->deckBuilder.results.clear();
mainGame->deckBuilder.is_draging = false;
mainGame->deckBuilder.is_deleting = false;
mainGame->deckBuilder.is_clearing = false;
mainGame->device->setEventReceiver(&mainGame->deckBuilder);
for(int i = 0; i < 32; ++i)
mainGame->chkCategory[i]->setChecked(false);
for(int i = 0; i < 8; i++)
mainGame->btnMark[i]->setPressed(false);
break; break;
} }
} }
......
...@@ -356,6 +356,7 @@ ...@@ -356,6 +356,7 @@
!system 1353 播放起始于回合: !system 1353 播放起始于回合:
!system 1354 不显示卡片系列 !system 1354 不显示卡片系列
!system 1355 不显示提示按钮 !system 1355 不显示提示按钮
!system 1356 是否要放弃改变?
!system 1360 上一步 !system 1360 上一步
!system 1370 星数↑ !system 1370 星数↑
!system 1371 攻击↑ !system 1371 攻击↑
......
...@@ -26,3 +26,4 @@ draw_field_spell = 1 ...@@ -26,3 +26,4 @@ draw_field_spell = 1
separate_clear_button = 1 separate_clear_button = 1
#auto_search_limit >= 0: Start search automatically when the user enters N chars. #auto_search_limit >= 0: Start search automatically when the user enters N chars.
auto_search_limit = -1 auto_search_limit = -1
prompt_to_discard_deck_changes = 1
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment