From d81a25d7fe1ff142505666785b37fe84450a532c Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Fri, 17 Apr 2026 12:03:37 -0400 Subject: [PATCH 1/3] improve lugia --- .../PokemonFRLG_LegendaryRunAway.cpp | 33 +++++++++++-------- .../PokemonFRLG_LegendaryRunAway.h | 4 +-- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.cpp b/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.cpp index 090d5c9fd8..faee9263c2 100644 --- a/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.cpp +++ b/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.cpp @@ -90,15 +90,15 @@ LegendaryRunAway::LegendaryRunAway() LockMode::LOCK_WHILE_RUNNING, "240 ms" ) - , LUGIA_UP_DOWN( + , LUGIA_UP_DOWN0( "Lugia up/down:
Time it takes to run up to Lugia or down away to reset.", LockMode::LOCK_WHILE_RUNNING, - "600 ms" + "620 ms" ) - , LUGIA_LEFT_RIGHT( + , LUGIA_LEFT_RIGHT0( "Lugia left time:
Time it takes walk three steps left after entering Lugia's room.", LockMode::LOCK_WHILE_RUNNING, - "550 ms" + "520 ms" ) { PA_ADD_STATIC(SHINY_REQUIRES_AUDIO); @@ -109,8 +109,8 @@ LegendaryRunAway::LegendaryRunAway() PA_ADD_STATIC(m_advanced_options); PA_ADD_OPTION(HOOH_UP_DOWN); PA_ADD_OPTION(HOOH_LEFT_RIGHT); - PA_ADD_OPTION(LUGIA_UP_DOWN); - PA_ADD_OPTION(LUGIA_LEFT_RIGHT); + PA_ADD_OPTION(LUGIA_UP_DOWN0); + PA_ADD_OPTION(LUGIA_LEFT_RIGHT0); } void LegendaryRunAway::reset_hooh(SingleSwitchProgramEnvironment& env, ProControllerContext& context){ @@ -188,8 +188,9 @@ void LegendaryRunAway::reset_hooh(SingleSwitchProgramEnvironment& env, ProContro void LegendaryRunAway::reset_lugia(SingleSwitchProgramEnvironment& env, ProControllerContext& context){ BlackScreenOverWatcher exit_area(COLOR_RED); //Turn around, 5 steps down - ssf_press_button(context, BUTTON_B, 0ms, LUGIA_UP_DOWN); - pbf_press_dpad(context, DPAD_DOWN, LUGIA_UP_DOWN, 160ms); + ssf_press_button(context, BUTTON_B, 0ms, LUGIA_UP_DOWN0); + pbf_press_dpad(context, DPAD_DOWN, LUGIA_UP_DOWN0, 0ms); + context.wait_for_all_requests(); //Turn right, 3 steps right. Wait for black screen over. int ret = run_until( @@ -222,8 +223,11 @@ void LegendaryRunAway::reset_lugia(SingleSwitchProgramEnvironment& env, ProContr int ret2 = run_until( env.console, context, [](ProControllerContext& context){ + pbf_wait(context, 500ms); + context.wait_for_all_requests(); + ssf_press_button(context, BUTTON_B, 0ms, 500ms); - pbf_press_dpad(context, DPAD_UP, 500ms, 160ms); + pbf_press_dpad(context, DPAD_UP, 500ms, 0ms); context.wait_for_all_requests(); ssf_press_button(context, BUTTON_B, 0ms, 500ms); pbf_press_dpad(context, DPAD_DOWN, 500ms, 160ms); @@ -246,14 +250,17 @@ void LegendaryRunAway::reset_lugia(SingleSwitchProgramEnvironment& env, ProContr "reset_lugia(): Entered area." ); } + //Wait after loading in to zone + pbf_wait(context, 500ms); + context.wait_for_all_requests(); //reverse above steps - ssf_press_button(context, BUTTON_B, 0ms, LUGIA_LEFT_RIGHT); - pbf_press_dpad(context, DPAD_LEFT, LUGIA_LEFT_RIGHT, 160ms); + ssf_press_button(context, BUTTON_B, 0ms, LUGIA_LEFT_RIGHT0); + pbf_press_dpad(context, DPAD_LEFT, LUGIA_LEFT_RIGHT0, 0ms); context.wait_for_all_requests(); - ssf_press_button(context, BUTTON_B, 0ms, LUGIA_UP_DOWN); - pbf_press_dpad(context, DPAD_UP, LUGIA_UP_DOWN, 160ms); + ssf_press_button(context, BUTTON_B, 0ms, LUGIA_UP_DOWN0); + pbf_press_dpad(context, DPAD_UP, LUGIA_UP_DOWN0, 160ms); context.wait_for_all_requests(); } diff --git a/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.h b/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.h index ebd3a4f07c..035d35f87b 100644 --- a/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.h +++ b/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.h @@ -60,8 +60,8 @@ class LegendaryRunAway : public SingleSwitchProgramInstance{ SectionDividerOption m_advanced_options; MillisecondsOption HOOH_UP_DOWN; MillisecondsOption HOOH_LEFT_RIGHT; - MillisecondsOption LUGIA_UP_DOWN; - MillisecondsOption LUGIA_LEFT_RIGHT; + MillisecondsOption LUGIA_UP_DOWN0; + MillisecondsOption LUGIA_LEFT_RIGHT0; }; } From 1380f02a39e01572b13f393b519aa08214aae513 Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Fri, 17 Apr 2026 18:52:24 -0400 Subject: [PATCH 2/3] pauses when entering area for hooh --- .../ShinyHunting/PokemonFRLG_LegendaryRunAway.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.cpp b/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.cpp index faee9263c2..55b71ea65d 100644 --- a/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.cpp +++ b/SerialPrograms/Source/PokemonFRLG/Programs/ShinyHunting/PokemonFRLG_LegendaryRunAway.cpp @@ -117,13 +117,15 @@ void LegendaryRunAway::reset_hooh(SingleSwitchProgramEnvironment& env, ProContro BlackScreenOverWatcher exit_area(COLOR_RED); //Turn around, 10 steps down ssf_press_button(context, BUTTON_B, 0ms, HOOH_UP_DOWN); - pbf_press_dpad(context, DPAD_DOWN, HOOH_UP_DOWN, 160ms); + pbf_press_dpad(context, DPAD_DOWN, HOOH_UP_DOWN, 0ms); + context.wait_for_all_requests(); //Turn right, take 1 step. Wait for black screen over. int ret = run_until( env.console, context, [&](ProControllerContext& context){ - pbf_press_dpad(context, DPAD_RIGHT, HOOH_LEFT_RIGHT, 160ms); + ssf_press_button(context, BUTTON_B, 0ms, 500ms); + pbf_press_dpad(context, DPAD_RIGHT, 500ms, 0ms); pbf_wait(context, 2400ms); }, {exit_area} @@ -149,6 +151,9 @@ void LegendaryRunAway::reset_hooh(SingleSwitchProgramEnvironment& env, ProContro int ret2 = run_until( env.console, context, [&](ProControllerContext& context){ + pbf_wait(context, 500ms); + context.wait_for_all_requests(); + ssf_press_button(context, BUTTON_B, 0ms, 500ms); pbf_press_dpad(context, DPAD_LEFT, 500ms, 0ms); context.wait_for_all_requests(); @@ -174,6 +179,9 @@ void LegendaryRunAway::reset_hooh(SingleSwitchProgramEnvironment& env, ProContro "reset_hooh(): Entered area." ); } + //Wait after loading in to zone + pbf_wait(context, 500ms); + context.wait_for_all_requests(); //reverse above steps, but only take 9 steps up //doesn't really matter since we want to trigger the encounter anyway From fb445d9ef2fb647fec95a897a058fe53a1fff6c6 Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Fri, 17 Apr 2026 22:42:08 -0400 Subject: [PATCH 3/3] apply changes to emerald as well --- .../PokemonRSE_LegendaryHunt-Emerald.cpp | 81 ++++++++++++------- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/SerialPrograms/Source/PokemonRSE/Programs/ShinyHunting/PokemonRSE_LegendaryHunt-Emerald.cpp b/SerialPrograms/Source/PokemonRSE/Programs/ShinyHunting/PokemonRSE_LegendaryHunt-Emerald.cpp index 793dcca618..36981f541c 100644 --- a/SerialPrograms/Source/PokemonRSE/Programs/ShinyHunting/PokemonRSE_LegendaryHunt-Emerald.cpp +++ b/SerialPrograms/Source/PokemonRSE/Programs/ShinyHunting/PokemonRSE_LegendaryHunt-Emerald.cpp @@ -140,6 +140,8 @@ void LegendaryHuntEmerald::reset_regi(SingleSwitchProgramEnvironment& env, ProCo }else{ env.log("Entered area."); } + pbf_wait(context, 500ms); + context.wait_for_all_requests(); //walk back up to the regi ssf_press_button(context, BUTTON_B, 0ms, 480ms); @@ -153,23 +155,23 @@ void LegendaryHuntEmerald::reset_groudon(SingleSwitchProgramEnvironment& env, Pr //Turn left. Take 10 steps. ssf_press_button(context, BUTTON_B, 0ms, 1440ms); - pbf_press_dpad(context, DPAD_LEFT, 1440ms, 160ms); + pbf_press_dpad(context, DPAD_LEFT, 1440ms, 0ms); //Turn up. Take 14 steps. (Bump into wall.) ssf_press_button(context, BUTTON_B, 0ms, 1920ms); - pbf_press_dpad(context, DPAD_UP, 1920ms, 160ms); + pbf_press_dpad(context, DPAD_UP, 1920ms, 0ms); //Turn right. Take 2 steps. ssf_press_button(context, BUTTON_B, 0ms, 320ms); - pbf_press_dpad(context, DPAD_RIGHT, 320ms, 160ms); + pbf_press_dpad(context, DPAD_RIGHT, 320ms, 0ms); //Turn up. Take 8 steps (Bump into wall.) ssf_press_button(context, BUTTON_B, 0ms, 1120ms); - pbf_press_dpad(context, DPAD_UP, 1120ms, 160ms); + pbf_press_dpad(context, DPAD_UP, 1120ms, 0ms); //Turn left. Take 4 steps. ssf_press_button(context, BUTTON_B, 0ms, 640ms); - pbf_press_dpad(context, DPAD_LEFT, 640ms, 160ms); + pbf_press_dpad(context, DPAD_LEFT, 640ms, 0ms); context.wait_for_all_requests(); //Turn down. Exit. Black screen over. @@ -178,7 +180,7 @@ void LegendaryHuntEmerald::reset_groudon(SingleSwitchProgramEnvironment& env, Pr env.console, context, [](ProControllerContext& context){ ssf_press_button(context, BUTTON_B, 0ms, 720ms); - pbf_press_dpad(context, DPAD_DOWN, 720ms, 160ms); + pbf_press_dpad(context, DPAD_DOWN, 720ms, 0ms); pbf_wait(context, 2400ms); }, {exit_area} @@ -196,6 +198,8 @@ void LegendaryHuntEmerald::reset_groudon(SingleSwitchProgramEnvironment& env, Pr }else{ env.log("Left area."); } + pbf_wait(context, 500ms); + context.wait_for_all_requests(); //Reverse above steps. BlackScreenOverWatcher enter_area(COLOR_RED, {0.282, 0.064, 0.448, 0.871}); @@ -203,7 +207,7 @@ void LegendaryHuntEmerald::reset_groudon(SingleSwitchProgramEnvironment& env, Pr env.console, context, [](ProControllerContext& context){ ssf_press_button(context, BUTTON_B, 0ms, 720ms); - pbf_press_dpad(context, DPAD_UP, 720ms, 160ms); + pbf_press_dpad(context, DPAD_UP, 720ms, 0ms); pbf_wait(context, 2400ms); }, {enter_area} @@ -221,6 +225,9 @@ void LegendaryHuntEmerald::reset_groudon(SingleSwitchProgramEnvironment& env, Pr }else{ env.log("Entered area."); } + pbf_wait(context, 500ms); + context.wait_for_all_requests(); + ssf_press_button(context, BUTTON_B, 0ms, 640ms); pbf_press_dpad(context, DPAD_RIGHT, 640ms, 160ms); @@ -244,27 +251,27 @@ void LegendaryHuntEmerald::reset_kyogre(SingleSwitchProgramEnvironment& env, Pro //Turn down. Take 1 step. ssf_press_button(context, BUTTON_B, 0ms, 160ms); - pbf_press_dpad(context, DPAD_DOWN, 160ms, 160ms); + pbf_press_dpad(context, DPAD_DOWN, 160ms, 0ms); //Turn right. Take 9 steps. ssf_press_button(context, BUTTON_B, 0ms, 1280ms); - pbf_press_dpad(context, DPAD_RIGHT, 1280ms, 160ms); + pbf_press_dpad(context, DPAD_RIGHT, 1280ms, 0ms); //Turn up. 13 steps. Wall. ssf_press_button(context, BUTTON_B, 0ms, 1760ms); - pbf_press_dpad(context, DPAD_UP, 1760ms, 160ms); + pbf_press_dpad(context, DPAD_UP, 1760ms, 0ms); //Turn left. 4 steps. Wall. ssf_press_button(context, BUTTON_B, 0ms, 640ms); - pbf_press_dpad(context, DPAD_LEFT, 640ms, 160ms); + pbf_press_dpad(context, DPAD_LEFT, 640ms, 0ms); //Turn up. 10 steps. ssf_press_button(context, BUTTON_B, 0ms, 1440ms); - pbf_press_dpad(context, DPAD_UP, 1440ms, 160ms); + pbf_press_dpad(context, DPAD_UP, 1440ms, 0ms); //Turn right. 6 steps. ssf_press_button(context, BUTTON_B, 0ms, 880ms); - pbf_press_dpad(context, DPAD_RIGHT, 880ms, 160ms); + pbf_press_dpad(context, DPAD_RIGHT, 880ms, 0ms); //Turn down. Exit. Black screen over. BlackScreenOverWatcher exit_area(COLOR_RED, {0.282, 0.064, 0.448, 0.871}); @@ -290,13 +297,15 @@ void LegendaryHuntEmerald::reset_kyogre(SingleSwitchProgramEnvironment& env, Pro }else{ env.log("Left area."); } + pbf_wait(context, 500ms); + context.wait_for_all_requests(); BlackScreenOverWatcher enter_area(COLOR_RED, {0.282, 0.064, 0.448, 0.871}); int ret2 = run_until( env.console, context, [](ProControllerContext& context){ ssf_press_button(context, BUTTON_B, 0ms, 720ms); - pbf_press_dpad(context, DPAD_UP, 720ms, 160ms); + pbf_press_dpad(context, DPAD_UP, 720ms, 0ms); pbf_wait(context, 2400ms); }, {enter_area} @@ -314,24 +323,26 @@ void LegendaryHuntEmerald::reset_kyogre(SingleSwitchProgramEnvironment& env, Pro }else{ env.log("Entered area."); } + pbf_wait(context, 500ms); + context.wait_for_all_requests(); ssf_press_button(context, BUTTON_B, 0ms, 880ms); - pbf_press_dpad(context, DPAD_LEFT, 880ms, 160ms); + pbf_press_dpad(context, DPAD_LEFT, 880ms, 0ms); ssf_press_button(context, BUTTON_B, 0ms, 1440ms); - pbf_press_dpad(context, DPAD_DOWN, 1440ms, 160ms); + pbf_press_dpad(context, DPAD_DOWN, 1440ms, 0ms); ssf_press_button(context, BUTTON_B, 0ms, 640ms); - pbf_press_dpad(context, DPAD_RIGHT, 640ms, 160ms); + pbf_press_dpad(context, DPAD_RIGHT, 640ms, 0ms); ssf_press_button(context, BUTTON_B, 0ms, 1760ms); - pbf_press_dpad(context, DPAD_DOWN, 1760ms, 160ms); + pbf_press_dpad(context, DPAD_DOWN, 1760ms, 0ms); ssf_press_button(context, BUTTON_B, 0ms, 1280ms); - pbf_press_dpad(context, DPAD_LEFT, 1280ms, 160ms); + pbf_press_dpad(context, DPAD_LEFT, 1280ms, 0ms); ssf_press_button(context, BUTTON_B, 0ms, 160ms); - pbf_press_dpad(context, DPAD_UP, 160ms, 160ms); + pbf_press_dpad(context, DPAD_UP, 160ms, 0ms); context.wait_for_all_requests(); } @@ -342,14 +353,15 @@ void LegendaryHuntEmerald::reset_hooh(SingleSwitchProgramEnvironment& env, ProCo BlackScreenOverWatcher exit_area(COLOR_RED, {0.282, 0.064, 0.448, 0.871}); //Turn around, 10 steps down ssf_press_button(context, BUTTON_B, 0ms, 1440ms); - pbf_press_dpad(context, DPAD_DOWN, 1440ms, 160ms); + pbf_press_dpad(context, DPAD_DOWN, 1440ms, 0ms); + context.wait_for_all_requests(); //Turn right, take 1 step. Wait for black screen over. int ret = run_until( env.console, context, [](ProControllerContext& context){ ssf_press_button(context, BUTTON_B, 0ms, 240ms); - pbf_press_dpad(context, DPAD_RIGHT, 240ms, 160ms); + pbf_press_dpad(context, DPAD_RIGHT, 240ms, 0ms); pbf_wait(context, 2400ms); }, {exit_area} @@ -367,6 +379,8 @@ void LegendaryHuntEmerald::reset_hooh(SingleSwitchProgramEnvironment& env, ProCo }else{ env.log("Left area."); } + pbf_wait(context, 500ms); + context.wait_for_all_requests(); BlackScreenOverWatcher enter_area(COLOR_RED, {0.282, 0.064, 0.448, 0.871}); //turn left, take one step. now turn back right and take a step. wait for black screen over. @@ -374,10 +388,10 @@ void LegendaryHuntEmerald::reset_hooh(SingleSwitchProgramEnvironment& env, ProCo env.console, context, [](ProControllerContext& context){ ssf_press_button(context, BUTTON_B, 0ms, 320ms); - pbf_press_dpad(context, DPAD_LEFT, 320ms, 160ms); + pbf_press_dpad(context, DPAD_LEFT, 320ms, 0ms); ssf_press_button(context, BUTTON_B, 0ms, 320ms); - pbf_press_dpad(context, DPAD_RIGHT, 320ms, 160ms); + pbf_press_dpad(context, DPAD_RIGHT, 320ms, 0ms); pbf_wait(context, 2400ms); }, {enter_area} @@ -395,6 +409,8 @@ void LegendaryHuntEmerald::reset_hooh(SingleSwitchProgramEnvironment& env, ProCo }else{ env.log("Entered area."); } + pbf_wait(context, 500ms); + context.wait_for_all_requests(); //reverse above steps, but only take 9 steps up //doesn't really matter since we want to trigger the encounter anyway @@ -413,14 +429,15 @@ void LegendaryHuntEmerald::reset_lugia(SingleSwitchProgramEnvironment& env, ProC BlackScreenOverWatcher exit_area(COLOR_RED, {0.282, 0.064, 0.448, 0.871}); //Turn around, 5 steps down ssf_press_button(context, BUTTON_B, 0ms, 720ms); - pbf_press_dpad(context, DPAD_DOWN, 720ms, 160ms); + pbf_press_dpad(context, DPAD_DOWN, 720ms, 0ms); + context.wait_for_all_requests(); //Turn right, 3 steps right. Wait for black screen over. int ret = run_until( env.console, context, [](ProControllerContext& context){ ssf_press_button(context, BUTTON_B, 0ms, 720ms); - pbf_press_dpad(context, DPAD_RIGHT, 720ms, 160ms); + pbf_press_dpad(context, DPAD_RIGHT, 720ms, 0ms); pbf_wait(context, 2400ms); }, {exit_area} @@ -438,6 +455,8 @@ void LegendaryHuntEmerald::reset_lugia(SingleSwitchProgramEnvironment& env, ProC }else{ env.log("Left area."); } + pbf_wait(context, 500ms); + context.wait_for_all_requests(); BlackScreenOverWatcher enter_area(COLOR_RED, {0.282, 0.064, 0.448, 0.871}); //turn up, take one step. then turn back down and take a step. wait for black screen over. @@ -445,10 +464,10 @@ void LegendaryHuntEmerald::reset_lugia(SingleSwitchProgramEnvironment& env, ProC env.console, context, [](ProControllerContext& context){ ssf_press_button(context, BUTTON_B, 0ms, 320ms); - pbf_press_dpad(context, DPAD_UP, 320ms, 160ms); + pbf_press_dpad(context, DPAD_UP, 320ms, 0ms); ssf_press_button(context, BUTTON_B, 0ms, 320ms); - pbf_press_dpad(context, DPAD_DOWN, 320ms, 160ms); + pbf_press_dpad(context, DPAD_DOWN, 320ms, 0ms); pbf_wait(context, 2400ms); }, {enter_area} @@ -466,13 +485,15 @@ void LegendaryHuntEmerald::reset_lugia(SingleSwitchProgramEnvironment& env, ProC }else{ env.log("Entered area."); } + pbf_wait(context, 500ms); + context.wait_for_all_requests(); //reverse above steps ssf_press_button(context, BUTTON_B, 0ms, 560ms); - pbf_press_dpad(context, DPAD_LEFT, 560ms, 160ms); + pbf_press_dpad(context, DPAD_LEFT, 560ms, 0ms); ssf_press_button(context, BUTTON_B, 0ms, 720ms); - pbf_press_dpad(context, DPAD_UP, 720ms, 160ms); + pbf_press_dpad(context, DPAD_UP, 720ms, 0ms); context.wait_for_all_requests(); }