|
| 1 | +#include <array> |
1 | 2 | #include "config.h" |
2 | 3 | #include "deck_con.h" |
3 | 4 | #include "myfilesystem.h" |
4 | | -#include "data_manager.h" |
5 | | -#include "deck_manager.h" |
6 | 5 | #include "image_manager.h" |
7 | 6 | #include "sound_manager.h" |
8 | 7 | #include "game.h" |
@@ -54,6 +53,14 @@ static inline void load_current_deck(irr::gui::IGUIComboBox* cbCategory, irr::gu |
54 | 53 | deckManager.LoadCurrentDeck(cbCategory->getSelected(), cbCategory->getText(), cbDeck->getText()); |
55 | 54 | } |
56 | 55 |
|
| 56 | +DeckBuilder::DeckBuilder() { |
| 57 | + std::random_device rd; |
| 58 | + std::array<uint32_t, 8> seed{}; |
| 59 | + for (auto& x : seed) |
| 60 | + x = rd(); |
| 61 | + std::seed_seq seq(seed.begin(), seed.end()); |
| 62 | + rnd.seed(seq); |
| 63 | +} |
57 | 64 | void DeckBuilder::Initialize() { |
58 | 65 | mainGame->is_building = true; |
59 | 66 | mainGame->is_siding = false; |
@@ -82,7 +89,6 @@ void DeckBuilder::Initialize() { |
82 | 89 | filterList = &deckManager._lfList.back(); |
83 | 90 | } |
84 | 91 | ClearSearch(); |
85 | | - rnd.reset((uint_fast32_t)std::time(nullptr)); |
86 | 92 | mouse_pos.set(0, 0); |
87 | 93 | hovered_code = 0; |
88 | 94 | hovered_pos = 0; |
@@ -175,7 +181,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { |
175 | 181 | break; |
176 | 182 | } |
177 | 183 | case BUTTON_SHUFFLE_DECK: { |
178 | | - rnd.shuffle_vector(deckManager.current_deck.main); |
| 184 | + std::shuffle(deckManager.current_deck.main.begin(), deckManager.current_deck.main.end(), rnd); |
179 | 185 | break; |
180 | 186 | } |
181 | 187 | case BUTTON_SAVE_DECK: { |
@@ -388,6 +394,29 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { |
388 | 394 | prev_operation = id; |
389 | 395 | break; |
390 | 396 | } |
| 397 | + case BUTTON_IMPORT_DECK_CODE: { |
| 398 | + time_t nowtime = std::time(nullptr); |
| 399 | + wchar_t timetext[40]; |
| 400 | + std::wcsftime(timetext, sizeof timetext / sizeof timetext[0], L"%Y-%m-%d %H-%M-%S", std::localtime(&nowtime)); |
| 401 | + mainGame->gMutex.lock(); |
| 402 | + mainGame->stDMMessage->setText(dataManager.GetSysString(1471)); |
| 403 | + mainGame->ebDMName->setVisible(true); |
| 404 | + mainGame->ebDMName->setText(timetext); |
| 405 | + mainGame->PopupElement(mainGame->wDMQuery); |
| 406 | + mainGame->gMutex.unlock(); |
| 407 | + prev_operation = id; |
| 408 | + break; |
| 409 | + } |
| 410 | + case BUTTON_EXPORT_DECK_CODE: { |
| 411 | + std::stringstream textStream; |
| 412 | + deckManager.SaveDeck(deckManager.current_deck, textStream); |
| 413 | + wchar_t text[0x10000]; |
| 414 | + BufferIO::DecodeUTF8(textStream.str().c_str(), text); |
| 415 | + mainGame->env->getOSOperator()->copyToClipboard(text); |
| 416 | + mainGame->stACMessage->setText(dataManager.GetSysString(1480)); |
| 417 | + mainGame->PopupElement(mainGame->wACMessage, 20); |
| 418 | + break; |
| 419 | + } |
391 | 420 | case BUTTON_DM_OK: { |
392 | 421 | switch(prev_operation) { |
393 | 422 | case BUTTON_NEW_CATEGORY: { |
@@ -464,17 +493,28 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { |
464 | 493 | } |
465 | 494 | break; |
466 | 495 | } |
467 | | - case BUTTON_NEW_DECK: { |
| 496 | + case BUTTON_NEW_DECK: |
| 497 | + case BUTTON_IMPORT_DECK_CODE: { |
468 | 498 | const wchar_t* deckname = mainGame->ebDMName->getText(); |
469 | 499 | wchar_t catepath[256]; |
470 | 500 | DeckManager::GetCategoryPath(catepath, mainGame->cbDBCategory->getSelected(), mainGame->cbDBCategory->getText()); |
471 | 501 | wchar_t filepath[256]; |
472 | 502 | myswprintf(filepath, L"%ls/%ls.ydk", catepath, deckname); |
473 | 503 | bool res = false; |
474 | 504 | if(!FileSystem::IsFileExists(filepath)) { |
475 | | - deckManager.current_deck.main.clear(); |
476 | | - deckManager.current_deck.extra.clear(); |
477 | | - deckManager.current_deck.side.clear(); |
| 505 | + if(prev_operation == BUTTON_NEW_DECK) { |
| 506 | + deckManager.current_deck.main.clear(); |
| 507 | + deckManager.current_deck.extra.clear(); |
| 508 | + deckManager.current_deck.side.clear(); |
| 509 | + } else { |
| 510 | + const wchar_t* txt = mainGame->env->getOSOperator()->getTextFromClipboard(); |
| 511 | + if(txt) { |
| 512 | + char text[0x10000]; |
| 513 | + BufferIO::EncodeUTF8(txt, text); |
| 514 | + std::istringstream textStream(text); |
| 515 | + deckManager.LoadCurrentDeck(textStream); |
| 516 | + } |
| 517 | + } |
478 | 518 | res = DeckManager::SaveDeck(deckManager.current_deck, filepath); |
479 | 519 | RefreshDeckList(); |
480 | 520 | ChangeCategory(mainGame->lstCategories->getSelected()); |
|
0 commit comments