bool DeckBuilder::push_side(code_pointer pointer, int seq) { auto& container = deckManager.current_deck.side; if(!mainGame->is_siding && (int)container.size() >= 15) return false; if(seq >= 0 && seq < (int)container.size()) container.insert(container.begin() + seq, pointer); else container.push_back(pointer); 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; if(!mainGame->is_siding && (int)container.size() >= 15) return false; if(seq >= 0 && seq < (int)container.size()) container.insert(container.begin() + seq, pointer); else container.push_back(pointer); GetHoveredCard(); return true; }
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::OnEvent(const irr::SEvent& event) { if(mainGame->dField.OnCommonEvent(event)) return false; switch(event.EventType) { case irr::EET_GUI_EVENT: { s32 id = event.GUIEvent.Caller->getID(); if(mainGame->wCategories->isVisible() && id != BUTTON_CATEGORY_OK) break; if(mainGame->wQuery->isVisible() && id != BUTTON_YES && id != BUTTON_NO) break; if(mainGame->wLinkMarks->isVisible() && id != BUTTON_MARKERS_OK) break; switch(event.GUIEvent.EventType) { case irr::gui::EGET_BUTTON_CLICKED: { switch(id) { case BUTTON_CLEAR_DECK: { deckManager.current_deck.main.clear(); deckManager.current_deck.extra.clear(); deckManager.current_deck.side.clear(); break; } case BUTTON_SORT_DECK: { std::sort(deckManager.current_deck.main.begin(), deckManager.current_deck.main.end(), ClientCard::deck_sort_lv); std::sort(deckManager.current_deck.extra.begin(), deckManager.current_deck.extra.end(), ClientCard::deck_sort_lv); std::sort(deckManager.current_deck.side.begin(), deckManager.current_deck.side.end(), ClientCard::deck_sort_lv); break; } case BUTTON_SHUFFLE_DECK: { std::random_shuffle(deckManager.current_deck.main.begin(), deckManager.current_deck.main.end()); break; } case BUTTON_SAVE_DECK: { int sel = mainGame->cbDBDecks->getSelected(); if(sel >= 0 && deckManager.SaveDeck(deckManager.current_deck, mainGame->cbDBDecks->getItem(sel))) { mainGame->stACMessage->setText(dataManager.GetSysString(1335)); mainGame->PopupElement(mainGame->wACMessage, 20); } break; } case BUTTON_SAVE_DECK_AS: { const wchar_t* dname = mainGame->ebDeckname->getText(); if(*dname == 0) break; int sel = -1; for(size_t i = 0; i < mainGame->cbDBDecks->getItemCount(); ++i) { if(!wcscmp(dname, mainGame->cbDBDecks->getItem(i))) { sel = i; break; } } if(sel >= 0) mainGame->cbDBDecks->setSelected(sel); else { mainGame->cbDBDecks->addItem(dname); mainGame->cbDBDecks->setSelected(mainGame->cbDBDecks->getItemCount() - 1); } if(deckManager.SaveDeck(deckManager.current_deck, dname)) { mainGame->stACMessage->setText(dataManager.GetSysString(1335)); mainGame->PopupElement(mainGame->wACMessage, 20); } break; } case BUTTON_DELETE_DECK: { int sel = mainGame->cbDBDecks->getSelected(); if(sel == -1) break; mainGame->gMutex.Lock(); wchar_t textBuffer[256]; myswprintf(textBuffer, L"%ls\n%ls", mainGame->cbDBDecks->getItem(sel), dataManager.GetSysString(1337)); mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)textBuffer); mainGame->PopupElement(mainGame->wQuery); mainGame->gMutex.Unlock(); prev_operation = id; break; } case BUTTON_LEAVE_GAME: { Terminate(); break; } case BUTTON_EFFECT_FILTER: { mainGame->PopupElement(mainGame->wCategories); break; } case BUTTON_START_FILTER: { StartFilter(); break; } case BUTTON_CLEAR_FILTER: { ClearSearch(); break; } case BUTTON_CATEGORY_OK: { filter_effect = 0; long long filter = 0x1; for(int i = 0; i < 32; ++i, filter <<= 1) if(mainGame->chkCategory[i]->isChecked()) filter_effect |= filter; mainGame->HideElement(mainGame->wCategories); break; } case BUTTON_SIDE_OK: { if(deckManager.current_deck.main.size() != deckManager.pre_deck.main.size() || deckManager.current_deck.extra.size() != deckManager.pre_deck.extra.size() || deckManager.current_deck.side.size() != deckManager.pre_deck.side.size()) { mainGame->env->addMessageBox(L"", dataManager.GetSysString(1410)); break; } mainGame->imgCard->setImage(imageManager.tCover[0]); mainGame->stName->setText(L""); mainGame->stInfo->setText(L""); mainGame->stDataInfo->setText(L""); mainGame->stSetName->setText(L""); mainGame->stText->setText(L""); mainGame->showingcard = 0; mainGame->scrCardText->setVisible(false); char deckbuf[1024]; char* pdeck = deckbuf; BufferIO::WriteInt32(pdeck, deckManager.current_deck.main.size() + deckManager.current_deck.extra.size()); BufferIO::WriteInt32(pdeck, deckManager.current_deck.side.size()); for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i) BufferIO::WriteInt32(pdeck, deckManager.current_deck.main[i]->first); for(size_t i = 0; i < deckManager.current_deck.extra.size(); ++i) BufferIO::WriteInt32(pdeck, deckManager.current_deck.extra[i]->first); for(size_t i = 0; i < deckManager.current_deck.side.size(); ++i) BufferIO::WriteInt32(pdeck, deckManager.current_deck.side[i]->first); DuelClient::SendBufferToServer(CTOS_UPDATE_DECK, deckbuf, pdeck - deckbuf); break; } case BUTTON_SIDE_RELOAD: { deckManager.current_deck = deckManager.pre_deck; break; } case BUTTON_MSG_OK: { mainGame->HideElement(mainGame->wMessage); mainGame->actionSignal.Set(); break; } case BUTTON_YES: { mainGame->HideElement(mainGame->wQuery); if(!mainGame->is_building || mainGame->is_siding) break; if(prev_operation == BUTTON_DELETE_DECK) { int sel = mainGame->cbDBDecks->getSelected(); if(deckManager.DeleteDeck(deckManager.current_deck, mainGame->cbDBDecks->getItem(sel))) { mainGame->cbDBDecks->removeItem(sel); int count = mainGame->cbDBDecks->getItemCount(); if(sel >= count) sel = count - 1; mainGame->cbDBDecks->setSelected(sel); if(sel != -1) deckManager.LoadDeck(mainGame->cbDBDecks->getItem(sel)); mainGame->stACMessage->setText(dataManager.GetSysString(1338)); mainGame->PopupElement(mainGame->wACMessage, 20); prev_deck = sel; } } else if(prev_operation == BUTTON_LEAVE_GAME) { Terminate(); } else if(prev_operation == COMBOBOX_DBDECKS) { int sel = mainGame->cbDBDecks->getSelected(); deckManager.LoadDeck(mainGame->cbDBDecks->getItem(sel)); prev_deck = sel; } prev_operation = 0; break; } case BUTTON_NO: { mainGame->HideElement(mainGame->wQuery); if (prev_operation == COMBOBOX_DBDECKS) { mainGame->cbDBDecks->setSelected(prev_deck); } prev_operation = 0; break; } case BUTTON_MARKS_FILTER: { mainGame->PopupElement(mainGame->wLinkMarks); break; } case BUTTON_MARKERS_OK: { filter_marks = 0; if (mainGame->btnMark[0]->isPressed()) filter_marks |= 0100; if (mainGame->btnMark[1]->isPressed()) filter_marks |= 0200; if (mainGame->btnMark[2]->isPressed()) filter_marks |= 0400; if (mainGame->btnMark[3]->isPressed()) filter_marks |= 0010; if (mainGame->btnMark[4]->isPressed()) filter_marks |= 0040; if (mainGame->btnMark[5]->isPressed()) filter_marks |= 0001; if (mainGame->btnMark[6]->isPressed()) filter_marks |= 0002; if (mainGame->btnMark[7]->isPressed()) filter_marks |= 0004; mainGame->HideElement(mainGame->wLinkMarks); StartFilter(); break; } } break; } case irr::gui::EGET_EDITBOX_ENTER: { switch(id) { case EDITBOX_KEYWORD: { StartFilter(); break; } } break; } case irr::gui::EGET_EDITBOX_CHANGED: { switch (id) { case EDITBOX_KEYWORD: { stringw filter = mainGame->ebCardName->getText(); if (filter.size() > 2) { StartFilter(); } break; } case EDITBOX_DECK_NAME: { mainGame->ValidateName(mainGame->ebDeckname); break; } } break; } case irr::gui::EGET_COMBO_BOX_CHANGED: { switch(id) { case COMBOBOX_DBLFLIST: { filterList = deckManager._lfList[mainGame->cbDBLFList->getSelected()].content; break; } case COMBOBOX_DBDECKS: { int sel = mainGame->cbDBDecks->getSelected(); if(sel >= 0) deckManager.LoadDeck(mainGame->cbDBDecks->getItem(sel)); prev_deck = sel; break; } case COMBOBOX_MAINTYPE: { 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""); switch(mainGame->cbCardType->getSelected()) { case 0: { mainGame->cbCardType2->setEnabled(false); mainGame->cbCardType2->setSelected(0); mainGame->cbRace->setEnabled(false); mainGame->cbAttribute->setEnabled(false); mainGame->ebAttack->setEnabled(false); mainGame->ebDefense->setEnabled(false); mainGame->ebStar->setEnabled(false); mainGame->ebScale->setEnabled(false); break; } case 1: { wchar_t normaltuner[32]; wchar_t normalpen[32]; wchar_t syntuner[32]; mainGame->cbCardType2->setEnabled(true); mainGame->cbRace->setEnabled(true); mainGame->cbAttribute->setEnabled(true); mainGame->ebAttack->setEnabled(true); mainGame->ebDefense->setEnabled(true); mainGame->ebStar->setEnabled(true); mainGame->ebScale->setEnabled(true); mainGame->cbCardType2->clear(); mainGame->cbCardType2->addItem(dataManager.GetSysString(1080), 0); mainGame->cbCardType2->addItem(dataManager.GetSysString(1054), TYPE_MONSTER + TYPE_NORMAL); mainGame->cbCardType2->addItem(dataManager.GetSysString(1055), TYPE_MONSTER + TYPE_EFFECT); mainGame->cbCardType2->addItem(dataManager.GetSysString(1056), TYPE_MONSTER + TYPE_FUSION); mainGame->cbCardType2->addItem(dataManager.GetSysString(1057), TYPE_MONSTER + TYPE_RITUAL); mainGame->cbCardType2->addItem(dataManager.GetSysString(1063), TYPE_MONSTER + TYPE_SYNCHRO); mainGame->cbCardType2->addItem(dataManager.GetSysString(1073), TYPE_MONSTER + TYPE_XYZ); mainGame->cbCardType2->addItem(dataManager.GetSysString(1074), TYPE_MONSTER + TYPE_PENDULUM); mainGame->cbCardType2->addItem(dataManager.GetSysString(1076), TYPE_MONSTER + TYPE_LINK); mainGame->cbCardType2->addItem(dataManager.GetSysString(1075), TYPE_MONSTER + TYPE_SPSUMMON); myswprintf(normaltuner, L"%ls|%ls", dataManager.GetSysString(1054), dataManager.GetSysString(1062)); mainGame->cbCardType2->addItem(normaltuner, TYPE_MONSTER + TYPE_NORMAL + TYPE_TUNER); myswprintf(normalpen, L"%ls|%ls", dataManager.GetSysString(1054), dataManager.GetSysString(1074)); mainGame->cbCardType2->addItem(normalpen, TYPE_MONSTER + TYPE_NORMAL + TYPE_PENDULUM); myswprintf(syntuner, L"%ls|%ls", dataManager.GetSysString(1063), dataManager.GetSysString(1062)); mainGame->cbCardType2->addItem(syntuner, TYPE_MONSTER + TYPE_SYNCHRO + TYPE_TUNER); mainGame->cbCardType2->addItem(dataManager.GetSysString(1062), TYPE_MONSTER + TYPE_TUNER); mainGame->cbCardType2->addItem(dataManager.GetSysString(1061), TYPE_MONSTER + TYPE_DUAL); mainGame->cbCardType2->addItem(dataManager.GetSysString(1060), TYPE_MONSTER + TYPE_UNION); mainGame->cbCardType2->addItem(dataManager.GetSysString(1059), TYPE_MONSTER + TYPE_SPIRIT); mainGame->cbCardType2->addItem(dataManager.GetSysString(1071), TYPE_MONSTER + TYPE_FLIP); mainGame->cbCardType2->addItem(dataManager.GetSysString(1072), TYPE_MONSTER + TYPE_TOON); break; } case 2: { mainGame->cbCardType2->setEnabled(true); mainGame->cbRace->setEnabled(false); mainGame->cbAttribute->setEnabled(false); mainGame->ebAttack->setEnabled(false); mainGame->ebDefense->setEnabled(false); mainGame->ebStar->setEnabled(false); mainGame->ebScale->setEnabled(false); mainGame->cbCardType2->clear(); mainGame->cbCardType2->addItem(dataManager.GetSysString(1080), 0); mainGame->cbCardType2->addItem(dataManager.GetSysString(1054), TYPE_SPELL); mainGame->cbCardType2->addItem(dataManager.GetSysString(1066), TYPE_SPELL + TYPE_QUICKPLAY); mainGame->cbCardType2->addItem(dataManager.GetSysString(1067), TYPE_SPELL + TYPE_CONTINUOUS); mainGame->cbCardType2->addItem(dataManager.GetSysString(1057), TYPE_SPELL + TYPE_RITUAL); mainGame->cbCardType2->addItem(dataManager.GetSysString(1068), TYPE_SPELL + TYPE_EQUIP); mainGame->cbCardType2->addItem(dataManager.GetSysString(1069), TYPE_SPELL + TYPE_FIELD); break; } case 3: { mainGame->cbCardType2->setEnabled(true); mainGame->cbRace->setEnabled(false); mainGame->cbAttribute->setEnabled(false); mainGame->ebAttack->setEnabled(false); mainGame->ebDefense->setEnabled(false); mainGame->ebStar->setEnabled(false); mainGame->ebScale->setEnabled(false); mainGame->cbCardType2->clear(); mainGame->cbCardType2->addItem(dataManager.GetSysString(1080), 0); mainGame->cbCardType2->addItem(dataManager.GetSysString(1054), TYPE_TRAP); mainGame->cbCardType2->addItem(dataManager.GetSysString(1067), TYPE_TRAP + TYPE_CONTINUOUS); mainGame->cbCardType2->addItem(dataManager.GetSysString(1070), TYPE_TRAP + TYPE_COUNTER); break; } } StartFilter(); break; } case COMBOBOX_SECONDTYPE: case COMBOBOX_OTHER_FILT: { if (id==COMBOBOX_SECONDTYPE && mainGame->cbCardType->getSelected() == 1) { if (mainGame->cbCardType2->getSelected() == 8) { mainGame->ebDefense->setEnabled(false); mainGame->ebDefense->setText(L""); } else { mainGame->ebDefense->setEnabled(true); } } StartFilter(); break; } case COMBOBOX_SORTTYPE: { SortList(); mainGame->env->setFocus(0); break; } } break; } case irr::gui::EGET_CHECKBOX_CHANGED: { switch (id) { case CHECKBOX_SHOW_ANIME: { int prevLimit = mainGame->cbLimit->getSelected(); mainGame->cbLimit->clear(); mainGame->cbLimit->addItem(dataManager.GetSysString(1310)); mainGame->cbLimit->addItem(dataManager.GetSysString(1316)); mainGame->cbLimit->addItem(dataManager.GetSysString(1317)); mainGame->cbLimit->addItem(dataManager.GetSysString(1318)); mainGame->cbLimit->addItem(dataManager.GetSysString(1240)); mainGame->cbLimit->addItem(dataManager.GetSysString(1241)); mainGame->cbLimit->addItem(dataManager.GetSysString(1242)); if(mainGame->chkAnime->isChecked()) { mainGame->cbLimit->addItem(dataManager.GetSysString(1243)); mainGame->cbLimit->addItem(L"Illegal"); mainGame->cbLimit->addItem(L"VG"); mainGame->cbLimit->addItem(L"Custom"); } if (prevLimit < 8) mainGame->cbLimit->setSelected(prevLimit); StartFilter(); break; } } break; } default: break; } break; } case irr::EET_MOUSE_INPUT_EVENT: { switch(event.MouseInput.Event) { case irr::EMIE_LMOUSE_PRESSED_DOWN: { irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement(); if(root->getElementFromPoint(mouse_pos) != root) break; if(mainGame->wCategories->isVisible() || mainGame->wQuery->isVisible()) break; if(hovered_pos == 0 || hovered_seq == -1) break; click_pos = hovered_pos; dragx = event.MouseInput.X; dragy = event.MouseInput.Y; draging_pointer = dataManager.GetCodePointer(hovered_code); if(draging_pointer == dataManager._datas.end()) break; if(hovered_pos == 4) { if(!check_limit(draging_pointer)) break; } is_draging = true; if(hovered_pos == 1) pop_main(hovered_seq); else if(hovered_pos == 2) pop_extra(hovered_seq); else if(hovered_pos == 3) pop_side(hovered_seq); mouse_pos.set(event.MouseInput.X, event.MouseInput.Y); GetHoveredCard(); break; } case irr::EMIE_LMOUSE_LEFT_UP: { if(!is_draging) break; bool pushed = false; if(hovered_pos == 1) pushed = push_main(draging_pointer, hovered_seq); else if(hovered_pos == 2) pushed = push_extra(draging_pointer, hovered_seq + is_lastcard); else if(hovered_pos == 3) pushed = push_side(draging_pointer, hovered_seq + is_lastcard); else if(hovered_pos == 4 && !mainGame->is_siding) pushed = true; if(!pushed) { if(click_pos == 1) push_main(draging_pointer); else if(click_pos == 2) push_extra(draging_pointer); else if(click_pos == 3) push_side(draging_pointer); } is_draging = false; break; } case irr::EMIE_RMOUSE_LEFT_UP: { if(mainGame->is_siding) { if(is_draging) break; if(hovered_pos == 0 || hovered_seq == -1) break; auto pointer = dataManager.GetCodePointer(hovered_code); if(pointer == dataManager._datas.end()) break; if(hovered_pos == 1) { if(push_side(pointer)) pop_main(hovered_seq); } else if(hovered_pos == 2) { if(push_side(pointer)) pop_extra(hovered_seq); } else { if(push_extra(pointer) || push_main(pointer)) pop_side(hovered_seq); } break; } if(mainGame->wCategories->isVisible() || mainGame->wQuery->isVisible()) break; if(!is_draging) { if(hovered_pos == 0 || hovered_seq == -1) break; if(hovered_pos == 1) { pop_main(hovered_seq); } else if(hovered_pos == 2) { pop_extra(hovered_seq); } else if(hovered_pos == 3) { pop_side(hovered_seq); } else { auto pointer = dataManager.GetCodePointer(hovered_code); if(pointer == dataManager._datas.end()) break; if(event.MouseInput.Shift) push_side(pointer); else { if (!check_limit(pointer)) break; if (!push_extra(pointer) && !push_main(pointer)) push_side(pointer); } } } else { if(click_pos == 1) { push_side(draging_pointer); } else if(click_pos == 2) { push_side(draging_pointer); } else if(click_pos == 3) { if(!push_extra(draging_pointer)) push_main(draging_pointer); } else { push_side(draging_pointer); } is_draging = false; } break; } case irr::EMIE_MMOUSE_LEFT_UP: { if (mainGame->is_siding) break; if (mainGame->wCategories->isVisible() || mainGame->wQuery->isVisible()) break; if (hovered_pos == 0 || hovered_seq == -1) break; if (is_draging) break; auto pointer = dataManager.GetCodePointer(hovered_code); if(!check_limit(pointer)) break; if (hovered_pos == 1) { if(!push_main(pointer)) push_side(pointer); } else if (hovered_pos == 2) { if(!push_extra(pointer)) push_side(pointer); } else if (hovered_pos == 3) { if(!push_side(pointer) && !push_extra(pointer)) push_main(pointer); } else { if(!push_extra(pointer) && !push_main(pointer)) push_side(pointer); } break; } case irr::EMIE_MOUSE_MOVED: { mouse_pos.set(event.MouseInput.X, event.MouseInput.Y); GetHoveredCard(); break; } case irr::EMIE_MOUSE_WHEEL: { if(!mainGame->scrFilter->isVisible()) break; if(!mainGame->Resize(805, 160, 1020, 630).isPointInside(mouse_pos)) break; if(event.MouseInput.Wheel < 0) { if(mainGame->scrFilter->getPos() < mainGame->scrFilter->getMax()) mainGame->scrFilter->setPos(mainGame->scrFilter->getPos() + 1); } else { if(mainGame->scrFilter->getPos() > 0) mainGame->scrFilter->setPos(mainGame->scrFilter->getPos() - 1); } GetHoveredCard(); break; } default: break; } break; } default: break; } return false; }
void DeckBuilder::pop_side(int seq) { auto& container = deckManager.current_deck.side; container.erase(container.begin() + seq); GetHoveredCard(); }
void DeckBuilder::pop_extra(int seq) { auto& container = deckManager.current_deck.extra; container.erase(container.begin() + seq); is_modified = true; GetHoveredCard(); }