From 7daf564629e86b74014b330e33ee34e394ddf2d6 Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Sun, 1 Mar 2026 14:10:20 -0500 Subject: [PATCH 1/2] load menu detection for soft reset --- .../Menus/PokemonFRLG_LoadMenuDetector.cpp | 51 +++++++++++++++++++ .../Menus/PokemonFRLG_LoadMenuDetector.h | 50 ++++++++++++++++++ .../PokemonFRLG/PokemonFRLG_Navigation.cpp | 10 ++-- SerialPrograms/cmake/SourceFiles.cmake | 2 + 4 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.cpp create mode 100644 SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.h diff --git a/SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.cpp b/SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.cpp new file mode 100644 index 000000000..95e65da14 --- /dev/null +++ b/SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.cpp @@ -0,0 +1,51 @@ +/* Load Menu Detector + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#include "CommonTools/Images/SolidColorTest.h" +#include "CommonTools/Images/ImageFilter.h" +#include "CommonFramework/ImageTools/ImageBoxes.h" +#include "CommonFramework/ImageTypes/ImageRGB32.h" +#include "CommonFramework/ImageTools/ImageStats.h" +#include "CommonFramework/ImageTypes/ImageViewRGB32.h" +#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h" +#include "CommonTools/Images/SolidColorTest.h" +#include "CommonTools/Images/WaterfillUtilities.h" +#include "CommonTools/ImageMatch/WaterfillTemplateMatcher.h" +#include "CommonFramework/VideoPipeline/VideoOverlay.h" +#include "PokemonFRLG_LoadMenuDetector.h" + +namespace PokemonAutomation{ +namespace NintendoSwitch{ +namespace PokemonFRLG{ + +LoadMenuDetector::LoadMenuDetector(Color color) + : m_right_box(0.898, 0.751, 0.003, 0.195) + , m_left_box(0.854, 0.019, 0.047, 0.938) + , m_save_box(0.773, 0.062, 0.047, 0.072) +{} +void LoadMenuDetector::make_overlays(VideoOverlaySet& items) const{ + items.add(COLOR_RED, m_right_box); + items.add(COLOR_RED, m_left_box); + items.add(COLOR_RED, m_save_box); +} +bool LoadMenuDetector::detect(const ImageViewRGB32& screen){ + ImageViewRGB32 right_image = extract_box_reference(screen, m_right_box); + ImageViewRGB32 left_image = extract_box_reference(screen, m_left_box); + ImageViewRGB32 save_image = extract_box_reference(screen, m_save_box); + + if (is_solid(right_image, { 0.244, 0.282, 0.474 }) //blue + && is_solid(left_image, { 0.244, 0.282, 0.474 }) //blue + && is_solid(save_image, { 0.25, 0.38, 0.369 }) //white + ){ + return true; + } + return false; +} + + +} +} +} diff --git a/SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.h b/SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.h new file mode 100644 index 000000000..1fcdf7631 --- /dev/null +++ b/SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.h @@ -0,0 +1,50 @@ +/* Load Menu Detector + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#ifndef PokemonAutomation_PokemonFRLG_LoadMenuDetector_H +#define PokemonAutomation_PokemonFRLG_LoadMenuDetector_H + +#include +#include +#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h" +#include "Common/Cpp/Color.h" +#include "CommonFramework/ImageTools/ImageBoxes.h" +#include "CommonTools/VisualDetector.h" +#include "CommonTools/InferenceCallbacks/VisualInferenceCallback.h" + +namespace PokemonAutomation{ + class CancellableScope; + class VideoFeed; +namespace NintendoSwitch{ +namespace PokemonFRLG{ + +// Detect save load menu by looking for the blue on the sides and the white of the save file +// Untested on new game, assumes there's a save. +class LoadMenuDetector : public StaticScreenDetector{ +public: + LoadMenuDetector(Color color); + + virtual void make_overlays(VideoOverlaySet& items) const override; + virtual bool detect(const ImageViewRGB32& screen) override; + +private: + ImageFloatBox m_right_box; + ImageFloatBox m_left_box; + ImageFloatBox m_save_box; +}; +class LoadMenuWatcher : public DetectorToFinder{ +public: + LoadMenuWatcher(Color color) + : DetectorToFinder("LoadMenuWatcher", std::chrono::milliseconds(250), color) + {} +}; + + +} +} +} + +#endif diff --git a/SerialPrograms/Source/PokemonFRLG/PokemonFRLG_Navigation.cpp b/SerialPrograms/Source/PokemonFRLG/PokemonFRLG_Navigation.cpp index 1a2f7a7b6..f33f827de 100644 --- a/SerialPrograms/Source/PokemonFRLG/PokemonFRLG_Navigation.cpp +++ b/SerialPrograms/Source/PokemonFRLG/PokemonFRLG_Navigation.cpp @@ -17,6 +17,7 @@ #include "PokemonFRLG/Inference/Dialogs/PokemonFRLG_DialogDetector.h" #include "PokemonFRLG/Inference/Sounds/PokemonFRLG_ShinySoundDetector.h" #include "PokemonFRLG/Inference/Menus/PokemonFRLG_StartMenuDetector.h" +#include "PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.h" #include "PokemonFRLG/PokemonFRLG_Settings.h" #include "PokemonFRLG_Navigation.h" @@ -40,6 +41,7 @@ void soft_reset(ConsoleHandle& console, ProControllerContext& context){ //Mash A until white screen to game load menu WhiteScreenOverWatcher whitescreen(COLOR_RED, {0.282, 0.064, 0.448, 0.871}); + LoadMenuWatcher load_menu(COLOR_BLUE); int ls = run_until( console, context, @@ -48,11 +50,13 @@ void soft_reset(ConsoleHandle& console, ProControllerContext& context){ pbf_wait(context, 5000ms); context.wait_for_all_requests(); }, - { whitescreen } + { whitescreen, load_menu } ); context.wait_for_all_requests(); - if (ls == 0){ - console.log("Entered load menu."); + if (ls == 0) { + console.log("Entered load menu. (WhiteScreenOver)"); + }else if (ls == 1) { + console.log("Entered load menu. (LoadMenu)"); }else{ console.log("Unable to enter load menu.", COLOR_RED); OperationFailedException::fire( diff --git a/SerialPrograms/cmake/SourceFiles.cmake b/SerialPrograms/cmake/SourceFiles.cmake index 5a1b97422..badf7c142 100644 --- a/SerialPrograms/cmake/SourceFiles.cmake +++ b/SerialPrograms/cmake/SourceFiles.cmake @@ -1408,6 +1408,8 @@ file(GLOB LIBRARY_SOURCES Source/PokemonFRLG/Inference/Dialogs/PokemonFRLG_PrizeSelectDetector.h Source/PokemonFRLG/Inference/Menus/PokemonFRLG_StartMenuDetector.cpp Source/PokemonFRLG/Inference/Menus/PokemonFRLG_StartMenuDetector.h + Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.cpp + Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.h Source/PokemonFRLG/Inference/Sounds/PokemonFRLG_ShinySoundDetector.cpp Source/PokemonFRLG/Inference/Sounds/PokemonFRLG_ShinySoundDetector.h Source/PokemonFRLG/Inference/PokemonFRLG_ShinySymbolDetector.cpp From e4bebb35681ec638b2a415adec5a8c28d40053b9 Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Sun, 1 Mar 2026 14:21:35 -0500 Subject: [PATCH 2/2] fix positions and change color --- .../Inference/Menus/PokemonFRLG_LoadMenuDetector.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.cpp b/SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.cpp index 95e65da14..cbde7f37b 100644 --- a/SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.cpp +++ b/SerialPrograms/Source/PokemonFRLG/Inference/Menus/PokemonFRLG_LoadMenuDetector.cpp @@ -22,14 +22,14 @@ namespace NintendoSwitch{ namespace PokemonFRLG{ LoadMenuDetector::LoadMenuDetector(Color color) - : m_right_box(0.898, 0.751, 0.003, 0.195) - , m_left_box(0.854, 0.019, 0.047, 0.938) + : m_right_box(0.859, 0.023, 0.042, 0.925) + , m_left_box(0.099, 0.022, 0.046, 0.926) , m_save_box(0.773, 0.062, 0.047, 0.072) {} void LoadMenuDetector::make_overlays(VideoOverlaySet& items) const{ - items.add(COLOR_RED, m_right_box); - items.add(COLOR_RED, m_left_box); - items.add(COLOR_RED, m_save_box); + items.add(COLOR_BLUE, m_right_box); + items.add(COLOR_BLUE, m_left_box); + items.add(COLOR_BLUE, m_save_box); } bool LoadMenuDetector::detect(const ImageViewRGB32& screen){ ImageViewRGB32 right_image = extract_box_reference(screen, m_right_box);