From 3129cb94a99a3696bc1e35a8b5e72892bca8b7f2 Mon Sep 17 00:00:00 2001 From: Yamato Date: Sat, 30 May 2020 21:23:14 -0300 Subject: [PATCH 1/5] Add HD source option --- gframe/data_handler.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/gframe/data_handler.cpp b/gframe/data_handler.cpp index b24b4ee3f..d9391a136 100644 --- a/gframe/data_handler.cpp +++ b/gframe/data_handler.cpp @@ -49,11 +49,24 @@ void DataHandler::LoadPicUrls() { auto type = obj["type"].get(); if(obj["url"].get() == "default") { if(type == "pic") { + if (configs->toggle_hd_card_pics) { +#ifdef DEFAULT_HD_PIC_URL + imageDownloader->AddDownloadResource({ DEFAULT_HD_PIC_URL, ImageDownloader::ART }); +#else #ifdef DEFAULT_PIC_URL - imageDownloader->AddDownloadResource({ DEFAULT_PIC_URL, ImageDownloader::ART }); + imageDownloader->AddDownloadResource({ DEFAULT_PIC_URL, ImageDownloader::ART }); #else - continue; + continue; +#endif +#endif + } + else { +#ifdef DEFAULT_PIC_URL + imageDownloader->AddDownloadResource({ DEFAULT_PIC_URL, ImageDownloader::ART }); +#else + continue; #endif + } } else if(type == "field") { #ifdef DEFAULT_FIELD_URL imageDownloader->AddDownloadResource({ DEFAULT_FIELD_URL, ImageDownloader::FIELD }); From 6f989d111a412491eb1b3e16af2535e00fd802aa Mon Sep 17 00:00:00 2001 From: Yamato Date: Sat, 30 May 2020 21:23:46 -0300 Subject: [PATCH 2/5] Add hd pics option on premake --- gframe/premake5.lua | 3 +++ premake5.lua | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/gframe/premake5.lua b/gframe/premake5.lua index a2581ea50..311f52994 100644 --- a/gframe/premake5.lua +++ b/gframe/premake5.lua @@ -6,6 +6,9 @@ local ygopro_config=function(static_core) excludes { "lzma/**", "sound_sdlmixer.*", "sound_irrklang.*", "irrklang_dynamic_loader.*", "Android/**" } defines "CURL_STATICLIB" + if _OPTIONS["hd-pics"] then + defines { "DEFAULT_HD_PIC_URL=" .. _OPTIONS["hd-pics"] } + end if _OPTIONS["pics"] then defines { "DEFAULT_PIC_URL=" .. _OPTIONS["pics"] } end diff --git a/premake5.lua b/premake5.lua index d52d9299f..a1952a0d6 100644 --- a/premake5.lua +++ b/premake5.lua @@ -11,6 +11,11 @@ newoption { { "sdl-mixer", "SDL2-mixer" } } } +newoption { + trigger = "hd-pics", + value = "url_template", + description = "Default URL for high quality card images" +} newoption { trigger = "pics", value = "url_template", From 7080c1172e2260db2746bc85e5576526cd0524d9 Mon Sep 17 00:00:00 2001 From: Yamato Date: Sat, 30 May 2020 21:24:20 -0300 Subject: [PATCH 3/5] Add toggle hq card pics option to options sub menu --- gframe/event_handler.cpp | 4 ++++ gframe/game.cpp | 24 +++++++++++++----------- gframe/game_config.cpp | 2 ++ gframe/game_config.h | 1 + gframe/menu_handler.h | 1 + gframe/settings_window.h | 1 + 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/gframe/event_handler.cpp b/gframe/event_handler.cpp index 93ef7a7e3..6a6bb9dcb 100644 --- a/gframe/event_handler.cpp +++ b/gframe/event_handler.cpp @@ -1969,6 +1969,10 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event, bool& stopPropagation) mainGame->fpsCounter->setVisible(gGameConfig->showFPS); return true; } + case CHECKBOX_TOGGLE_HD_CARD_PICS: { + gGameConfig->toggle_hd_card_pics = mainGame->gSettings.chkToggleHdCardPics->isChecked(); + return true; + } case CHECKBOX_DRAW_FIELD_SPELLS: { gGameConfig->draw_field_spell = mainGame->gSettings.chkDrawFieldSpells->isChecked(); return true; diff --git a/gframe/game.cpp b/gframe/game.cpp index 06062db10..f48b98c39 100644 --- a/gframe/game.cpp +++ b/gframe/game.cpp @@ -658,20 +658,22 @@ bool Game::Initialize() { defaultStrings.emplace_back(gSettings.chkHideSetname, 1354); gSettings.chkHidePasscodeScope = env->addCheckBox(gGameConfig->hidePasscodeScope, Scale(15, 185, 320, 210), sPanel, CHECKBOX_HIDE_PASSCODE_SCOPE, gDataManager->GetSysString(2063).c_str()); defaultStrings.emplace_back(gSettings.chkHidePasscodeScope, 2063); - gSettings.chkDrawFieldSpells = env->addCheckBox(gGameConfig->draw_field_spell, Scale(15, 215, 320, 240), sPanel, CHECKBOX_DRAW_FIELD_SPELLS, gDataManager->GetSysString(2068).c_str()); + gSettings.chkToggleHdCardPics = env->addCheckBox(gGameConfig->toggle_hd_card_pics, Scale(15, 215, 320, 240), sPanel, CHECKBOX_TOGGLE_HD_CARD_PICS, gDataManager->GetSysString(2081).c_str()); + defaultStrings.emplace_back(gSettings.chkToggleHdCardPics, 2081); + gSettings.chkDrawFieldSpells = env->addCheckBox(gGameConfig->draw_field_spell, Scale(15, 245, 320, 270), sPanel, CHECKBOX_DRAW_FIELD_SPELLS, gDataManager->GetSysString(2068).c_str()); defaultStrings.emplace_back(gSettings.chkDrawFieldSpells, 2068); - gSettings.chkFilterBot = env->addCheckBox(gGameConfig->filterBot, Scale(15, 245, 320, 270), sPanel, CHECKBOX_FILTER_BOT, gDataManager->GetSysString(2069).c_str()); + gSettings.chkFilterBot = env->addCheckBox(gGameConfig->filterBot, Scale(15, 275, 320, 300), sPanel, CHECKBOX_FILTER_BOT, gDataManager->GetSysString(2069).c_str()); defaultStrings.emplace_back(gSettings.chkFilterBot, 2069); - gSettings.stCurrentSkin = env->addStaticText(gDataManager->GetSysString(2064).c_str(), Scale(15, 275, 90, 300), false, true, sPanel); + gSettings.stCurrentSkin = env->addStaticText(gDataManager->GetSysString(2064).c_str(), Scale(15, 305, 90, 330), false, true, sPanel); defaultStrings.emplace_back(gSettings.stCurrentSkin, 2064); - gSettings.cbCurrentSkin = ADDComboBox(Scale(95, 275, 320, 300), sPanel, COMBOBOX_CURRENT_SKIN); + gSettings.cbCurrentSkin = ADDComboBox(Scale(95, 305, 320, 330), sPanel, COMBOBOX_CURRENT_SKIN); ReloadCBCurrentSkin(); - gSettings.btnReloadSkin = env->addButton(Scale(15, 305, 320, 330), sPanel, BUTTON_RELOAD_SKIN, gDataManager->GetSysString(2066).c_str()); + gSettings.btnReloadSkin = env->addButton(Scale(15, 335, 320, 360), sPanel, BUTTON_RELOAD_SKIN, gDataManager->GetSysString(2066).c_str()); defaultStrings.emplace_back(gSettings.btnReloadSkin, 2066); - gSettings.stCurrentLocale = env->addStaticText(gDataManager->GetSysString(2067).c_str(), Scale(15, 335, 90, 360), false, true, sPanel); + gSettings.stCurrentLocale = env->addStaticText(gDataManager->GetSysString(2067).c_str(), Scale(15, 365, 90, 390), false, true, sPanel); defaultStrings.emplace_back(gSettings.stCurrentLocale, 2067); PopulateLocales(); - gSettings.cbCurrentLocale = ADDComboBox(Scale(95, 335, 320, 360), sPanel, COMBOBOX_CURRENT_LOCALE); + gSettings.cbCurrentLocale = ADDComboBox(Scale(95, 365, 320, 390), sPanel, COMBOBOX_CURRENT_LOCALE); int selectedLocale = gSettings.cbCurrentLocale->addItem(L"English"); for(auto& _locale : locales) { auto& locale = _locale.first; @@ -681,12 +683,12 @@ bool Game::Initialize() { } } gSettings.cbCurrentLocale->setSelected(selectedLocale); - gSettings.stDpiScale = env->addStaticText(gDataManager->GetSysString(2070).c_str(), Scale(15, 365, 90, 390), false, false, sPanel); + gSettings.stDpiScale = env->addStaticText(gDataManager->GetSysString(2070).c_str(), Scale(15, 395, 90, 420), false, false, sPanel); defaultStrings.emplace_back(gSettings.stDpiScale, 2070); - gSettings.ebDpiScale = env->addEditBox(fmt::to_wstring(gGameConfig->dpi_scale * 100).c_str(), Scale(95, 365, 150, 390), true, sPanel, EDITBOX_NUMERIC); - env->addStaticText(L"%", Scale(155, 365, 170, 390), false, false, sPanel); + gSettings.ebDpiScale = env->addEditBox(fmt::to_wstring(gGameConfig->dpi_scale * 100).c_str(), Scale(95, 395, 150, 420), true, sPanel, EDITBOX_NUMERIC); + env->addStaticText(L"%", Scale(155, 395, 170, 420), false, false, sPanel); gSettings.ebDpiScale->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); - gSettings.btnRestart = env->addButton(Scale(175, 365, 320, 390), sPanel, BUTTON_APPLY_RESTART, gDataManager->GetSysString(2071).c_str()); + gSettings.btnRestart = env->addButton(Scale(175, 395, 320, 420), sPanel, BUTTON_APPLY_RESTART, gDataManager->GetSysString(2071).c_str()); defaultStrings.emplace_back(gSettings.btnRestart, 2071); gSettings.stAntiAlias = env->addStaticText(gDataManager->GetSysString(2075).c_str(), Scale(340, 5, 545, 30), false, true, sPanel); diff --git a/gframe/game_config.cpp b/gframe/game_config.cpp index 11927930b..5b07c225f 100644 --- a/gframe/game_config.cpp +++ b/gframe/game_config.cpp @@ -103,6 +103,7 @@ bool GameConfig::Load(const path_char* filename) DESERIALIZE_BOOL(loopMusic) DESERIALIZE_BOOL(noClientUpdates) DESERIALIZE_BOOL(alternative_phase_layout) + DESERIALIZE_BOOL(toggle_hd_card_pics) #ifdef WIN32 DESERIALIZE_BOOL(showConsole) #endif @@ -269,6 +270,7 @@ bool GameConfig::Save(const path_char* filename) conf_file << "mute_spectators = " << chkIgnore2 << "\n"; conf_file << "hide_setname = " << chkHideSetname << "\n"; conf_file << "hide_hint_button = " << chkHideHintButton << "\n"; + SERIALIZE(toggle_hd_card_pics); conf_file << "draw_field_spell = " << draw_field_spell << "\n"; conf_file << "quick_animation = " << quick_animation << "\n"; SERIALIZE(alternative_phase_layout); diff --git a/gframe/game_config.h b/gframe/game_config.h index 849667d8a..1c1944629 100644 --- a/gframe/game_config.h +++ b/gframe/game_config.h @@ -66,6 +66,7 @@ struct GameConfig bool chkIgnore2 = false; bool chkHideSetname = false; bool chkHideHintButton = true; + bool toggle_hd_card_pics = false; bool draw_field_spell = true; bool quick_animation = false; bool alternative_phase_layout = false; diff --git a/gframe/menu_handler.h b/gframe/menu_handler.h index db2056cfc..3d046e8e7 100644 --- a/gframe/menu_handler.h +++ b/gframe/menu_handler.h @@ -185,6 +185,7 @@ enum GUI { CHECKBOX_ACCURATE_BACKGROUND_RESIZE, CHECKBOX_HIDE_ARCHETYPES, CHECKBOX_HIDE_PASSCODE_SCOPE, + CHECKBOX_TOGGLE_HD_CARD_PICS, CHECKBOX_DRAW_FIELD_SPELLS, CHECKBOX_FILTER_BOT, CHECKBOX_VSYNC, diff --git a/gframe/settings_window.h b/gframe/settings_window.h index 3f7aaf385..0e6b85dd6 100644 --- a/gframe/settings_window.h +++ b/gframe/settings_window.h @@ -49,6 +49,7 @@ struct SettingsWindow { irr::gui::IGUICheckBox* chkAccurateBackgroundResize; irr::gui::IGUICheckBox* chkHideSetname; irr::gui::IGUICheckBox* chkHidePasscodeScope; + irr::gui::IGUICheckBox* chkToggleHdCardPics; irr::gui::IGUICheckBox* chkDrawFieldSpells; irr::gui::IGUICheckBox* chkFilterBot; irr::gui::IGUIStaticText* stCurrentSkin; From 1760a74cf588c2cecebc17712eae4eec661b0686 Mon Sep 17 00:00:00 2001 From: Yamato Date: Mon, 1 Jun 2020 04:10:21 -0300 Subject: [PATCH 4/5] Add hd pic url vector, also hd selector on functions --- gframe/data_handler.cpp | 26 ++++++++++---------------- gframe/image_downloader.cpp | 10 ++++++++-- gframe/image_downloader.h | 5 ++++- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/gframe/data_handler.cpp b/gframe/data_handler.cpp index d9391a136..8768a82b3 100644 --- a/gframe/data_handler.cpp +++ b/gframe/data_handler.cpp @@ -47,41 +47,35 @@ void DataHandler::LoadPicUrls() { if(config.size() && config["urls"].is_array()) { for(auto& obj : config["urls"].get>()) { auto type = obj["type"].get(); + bool is_hd = obj.contains("hd") ? obj["hd"].get() : false; if(obj["url"].get() == "default") { if(type == "pic") { - if (configs->toggle_hd_card_pics) { +#if defined(DEFAULT_HD_PIC_URL) || defined(DEFAULT_PIC_URL) #ifdef DEFAULT_HD_PIC_URL - imageDownloader->AddDownloadResource({ DEFAULT_HD_PIC_URL, ImageDownloader::ART }); -#else -#ifdef DEFAULT_PIC_URL - imageDownloader->AddDownloadResource({ DEFAULT_PIC_URL, ImageDownloader::ART }); -#else - continue; -#endif + imageDownloader->AddDownloadResource({ DEFAULT_HD_PIC_URL, ImageDownloader::ART }, true); #endif - } - else { + #ifdef DEFAULT_PIC_URL - imageDownloader->AddDownloadResource({ DEFAULT_PIC_URL, ImageDownloader::ART }); + imageDownloader->AddDownloadResource({ DEFAULT_PIC_URL, ImageDownloader::ART }, false); +#endif #else - continue; + continue; #endif - } } else if(type == "field") { #ifdef DEFAULT_FIELD_URL - imageDownloader->AddDownloadResource({ DEFAULT_FIELD_URL, ImageDownloader::FIELD }); + imageDownloader->AddDownloadResource({ DEFAULT_FIELD_URL, ImageDownloader::FIELD }, is_hd); #else continue; #endif } else if(type == "cover") { #ifdef DEFAULT_COVER_URL - imageDownloader->AddDownloadResource({ DEFAULT_COVER_URL, ImageDownloader::COVER }); + imageDownloader->AddDownloadResource({ DEFAULT_COVER_URL, ImageDownloader::COVER }, is_hd); #else continue; #endif } } else { - imageDownloader->AddDownloadResource({ obj["url"].get(), type == "field" ? ImageDownloader::FIELD : (type == "pic") ? ImageDownloader::ART : ImageDownloader::COVER }); + imageDownloader->AddDownloadResource({ obj["url"].get(), type == "field" ? ImageDownloader::FIELD : (type == "pic") ? ImageDownloader::ART : ImageDownloader::COVER }, is_hd); } } } diff --git a/gframe/image_downloader.cpp b/gframe/image_downloader.cpp index 1c164ad8c..242b0efe2 100644 --- a/gframe/image_downloader.cpp +++ b/gframe/image_downloader.cpp @@ -23,8 +23,14 @@ ImageDownloader::~ImageDownloader() { download_threads[i].join(); } } -void ImageDownloader::AddDownloadResource(PicSource src) { - pic_urls.push_back(src); +void ImageDownloader::AddDownloadResource(PicSource src, bool hd) { + if (hd) { + hd_pic_urls.push_back(src); + } + else + { + pic_urls.push_back(src); + } } #define PNG_HEADER 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a #define PNG_FILE 1 diff --git a/gframe/image_downloader.h b/gframe/image_downloader.h index 9d86154e5..b7d6d7ed0 100644 --- a/gframe/image_downloader.h +++ b/gframe/image_downloader.h @@ -9,6 +9,7 @@ #include #include #include "text_types.h" +#include "game_config.h" namespace ygo { @@ -39,12 +40,13 @@ class ImageDownloader { using downloading_map = std::map; /*if the value is not found, the download hasn't started yet*/ ImageDownloader(); ~ImageDownloader(); - void AddDownloadResource(PicSource src); + void AddDownloadResource(PicSource src, bool hd); downloadStatus GetDownloadStatus(uint32_t code, imgType type); path_string GetDownloadPath(uint32_t code, imgType type); void AddToDownloadQueue(uint32_t code, imgType type); private: void DownloadPic(); + void CurlDownload(path_string& name, PicSource& src, uint32_t& code, path_string& dest_folder, path_string& ext); downloading_map downloading_images[3]; std::queue to_download; std::vector downloading; @@ -54,6 +56,7 @@ class ImageDownloader { std::mutex mtx; std::condition_variable cv; std::atomic stop_threads; + std::vector hd_pic_urls; std::vector pic_urls; std::thread download_threads[8]; }; From 6e15994ef1a06b2bb6d18449eec7614b24bc134f Mon Sep 17 00:00:00 2001 From: Yamato Date: Mon, 1 Jun 2020 04:10:44 -0300 Subject: [PATCH 5/5] Refactor curl downloading for clarity --- gframe/image_downloader.cpp | 84 ++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/gframe/image_downloader.cpp b/gframe/image_downloader.cpp index 242b0efe2..cf14e8297 100644 --- a/gframe/image_downloader.cpp +++ b/gframe/image_downloader.cpp @@ -115,42 +115,21 @@ void ImageDownloader::DownloadPic() { } } auto& map = downloading_images[static_cast(type)]; + if(gGameConfig->toggle_hd_card_pics) { + for (auto& src : hd_pic_urls) { + if (src.type != type) + continue; + if (ext.size()) + break; + CurlDownload(name, src, code, dest_folder, ext); + } + } for(auto& src : pic_urls) { if(src.type != type) continue; - CURL *curl = NULL; - struct { - std::ofstream* stream; - char header[8] = { 0 }; - int header_written = 0; - } payload; - std::ofstream fp(name, std::ofstream::binary); - if(fp.is_open()) { - payload.stream = &fp; - CURLcode res; - curl = curl_easy_init(); - if(curl) { - curl_easy_setopt(curl, CURLOPT_URL, fmt::format(src.url, code).c_str()); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &payload); -#ifdef __ANDROID__ - curl_easy_setopt(curl, CURLOPT_CAINFO, (porting::internal_storage + "/cacert.cer").c_str()); -#endif - res = curl_easy_perform(curl); - curl_easy_cleanup(curl); - fp.close(); - if(res == CURLE_OK) { - ext = GetExtension(payload.header); - if(!Utils::FileMove(name, dest_folder + ext)) { - Utils::FileDelete(name); - ext.clear(); - } - break; - } else { - Utils::FileDelete(name); - } - } - } + if(ext.size()) + break; + CurlDownload(name, src, code, dest_folder, ext); } pic_download.lock(); if(ext.size()) { @@ -161,6 +140,45 @@ void ImageDownloader::DownloadPic() { pic_download.unlock(); } } + +void ImageDownloader::CurlDownload(path_string& name, PicSource& src, uint32_t& code, path_string& dest_folder, path_string& ext) { + CURL* curl = NULL; + struct { + std::ofstream* stream; + char header[8] = { 0 }; + int header_written = 0; + } payload; + + std::ofstream fp(name, std::ofstream::binary); + if (!fp.is_open()) + return; + + payload.stream = &fp; + curl = curl_easy_init(); + if (!curl) + return; + + curl_easy_setopt(curl, CURLOPT_URL, fmt::format(src.url, code).c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &payload); +#ifdef __ANDROID__ + curl_easy_setopt(curl, CURLOPT_CAINFO, (porting::internal_storage + "/cacert.cer").c_str()); +#endif + CURLcode res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + fp.close(); + if (res == CURLE_OK) { + ext = GetExtension(payload.header); + if (!Utils::FileMove(name, dest_folder + ext)) { + Utils::FileDelete(name); + ext.clear(); + } + } + else { + Utils::FileDelete(name); + } +} + void ImageDownloader::AddToDownloadQueue(uint32_t code, imgType type) { if(type == THUMB) type = ART;