From 7c9d095de42e5fdfb6eec1ca52613604043fe8d8 Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Fri, 16 May 2025 19:49:59 -0400 Subject: [PATCH] legendary reset adjustment, error stats for lgpe programs --- .../ShinyHunting/PokemonLGPE_AlolanTrade.cpp | 8 ++++++++ .../ShinyHunting/PokemonLGPE_FossilRevival.cpp | 8 ++++++++ .../ShinyHunting/PokemonLGPE_GiftReset.cpp | 5 +++++ .../ShinyHunting/PokemonLGPE_LegendaryReset.cpp | 17 ++++++++++++++++- 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.cpp b/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.cpp index 9624188333..7b7456f0bb 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.cpp @@ -41,14 +41,17 @@ struct AlolanTrade_Descriptor::Stats : public StatsTracker{ : trades(m_stats["Trades"]) , resets(m_stats["Resets"]) , shinies(m_stats["Shinies"]) + , errors(m_stats["Errors"]) { m_display_order.emplace_back("Trades"); m_display_order.emplace_back("Resets"); m_display_order.emplace_back("Shinies"); + m_display_order.emplace_back("Errors", HIDDEN_IF_ZERO); } std::atomic& trades; std::atomic& resets; std::atomic& shinies; + std::atomic& errors; }; std::unique_ptr AlolanTrade_Descriptor::make_stats() const{ return std::unique_ptr(new Stats()); @@ -79,6 +82,7 @@ AlolanTrade::AlolanTrade() } void AlolanTrade::run_trade(SingleSwitchProgramEnvironment& env, JoyconContext& context){ + AlolanTrade_Descriptor::Stats& stats = env.current_stats(); //Talk to NPC, say Yes, select Pokemon from box. BlackScreenOverWatcher trade_started(COLOR_RED); int ret = run_until( @@ -91,6 +95,8 @@ void AlolanTrade::run_trade(SingleSwitchProgramEnvironment& env, JoyconContext& context.wait_for_all_requests(); if (ret != 0){ env.log("Failed to start trade.", COLOR_RED); + stats.errors++; + env.update_stats(); OperationFailedException::fire( ErrorReport::SEND_ERROR_REPORT, "Failed to start trade.", @@ -110,6 +116,8 @@ void AlolanTrade::run_trade(SingleSwitchProgramEnvironment& env, JoyconContext& ); context.wait_for_all_requests(); if (ret2 != 0){ + stats.errors++; + env.update_stats(); env.log("Did not detect end of trade.", COLOR_RED); OperationFailedException::fire( ErrorReport::SEND_ERROR_REPORT, diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_FossilRevival.cpp b/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_FossilRevival.cpp index b2258bde20..6769d4daa2 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_FossilRevival.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_FossilRevival.cpp @@ -41,14 +41,17 @@ struct FossilRevival_Descriptor::Stats : public StatsTracker{ : revives(m_stats["Revives"]) , resets(m_stats["Resets"]) , shinies(m_stats["Shinies"]) + , errors(m_stats["Errors"]) { m_display_order.emplace_back("Revives"); m_display_order.emplace_back("Resets"); m_display_order.emplace_back("Shinies"); + m_display_order.emplace_back("Errors", HIDDEN_IF_ZERO); } std::atomic& revives; std::atomic& resets; std::atomic& shinies; + std::atomic& errors; }; std::unique_ptr FossilRevival_Descriptor::make_stats() const{ return std::unique_ptr(new Stats()); @@ -90,6 +93,7 @@ FossilRevival::FossilRevival() } void FossilRevival::run_revives(SingleSwitchProgramEnvironment& env, JoyconContext& context){ + FossilRevival_Descriptor::Stats& stats = env.current_stats(); //Press A to get to selection env.log("Starting dialog."); pbf_press_button(context, BUTTON_A, 100ms, 800ms); @@ -122,6 +126,8 @@ void FossilRevival::run_revives(SingleSwitchProgramEnvironment& env, JoyconConte ); context.wait_for_all_requests(); if (ret != 0){ + stats.errors++; + env.update_stats(); env.log("Failed to revive fossil.", COLOR_RED); OperationFailedException::fire( ErrorReport::SEND_ERROR_REPORT, @@ -144,6 +150,8 @@ void FossilRevival::run_revives(SingleSwitchProgramEnvironment& env, JoyconConte ); context.wait_for_all_requests(); if (ret2 != 0){ + stats.errors++; + env.update_stats(); env.log("Did not detect summary over.", COLOR_RED); OperationFailedException::fire( ErrorReport::SEND_ERROR_REPORT, diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_GiftReset.cpp b/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_GiftReset.cpp index cd2a6c813f..8f91fe1a26 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_GiftReset.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_GiftReset.cpp @@ -40,12 +40,15 @@ struct GiftReset_Descriptor::Stats : public StatsTracker{ Stats() : resets(m_stats["Resets"]) , shinies(m_stats["Shinies"]) + , errors(m_stats["Errors"]) { m_display_order.emplace_back("Resets"); m_display_order.emplace_back("Shinies"); + m_display_order.emplace_back("Errors", HIDDEN_IF_ZERO); } std::atomic& resets; std::atomic& shinies; + std::atomic& errors; }; std::unique_ptr GiftReset_Descriptor::make_stats() const{ return std::unique_ptr(new Stats()); @@ -104,6 +107,8 @@ void GiftReset::program(SingleSwitchProgramEnvironment& env, CancellableScope& s ); context.wait_for_all_requests(); if (ret != 0){ + stats.errors++; + env.update_stats(); env.log("Failed to receive gift Pokemon.", COLOR_RED); OperationFailedException::fire( ErrorReport::SEND_ERROR_REPORT, diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_LegendaryReset.cpp b/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_LegendaryReset.cpp index 44147d610c..5e965b4907 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_LegendaryReset.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_LegendaryReset.cpp @@ -41,12 +41,15 @@ struct LegendaryReset_Descriptor::Stats : public StatsTracker{ Stats() : resets(m_stats["Resets"]) , shinies(m_stats["Shinies"]) + , errors(m_stats["Errors"]) { m_display_order.emplace_back("Resets"); m_display_order.emplace_back("Shinies"); + m_display_order.emplace_back("Errors", HIDDEN_IF_ZERO); } std::atomic& resets; std::atomic& shinies; + std::atomic& errors; }; std::unique_ptr LegendaryReset_Descriptor::make_stats() const{ return std::unique_ptr(new Stats()); @@ -83,6 +86,7 @@ LegendaryReset::LegendaryReset() } bool LegendaryReset::run_encounter(SingleSwitchProgramEnvironment& env, JoyconContext& context){ + LegendaryReset_Descriptor::Stats& stats = env.current_stats(); float shiny_coefficient = 1.0; ShinySoundDetector shiny_detector(env.logger(), [&](float error_coefficient) -> bool{ shiny_coefficient = error_coefficient; @@ -94,10 +98,12 @@ bool LegendaryReset::run_encounter(SingleSwitchProgramEnvironment& env, JoyconCo switch (TARGET) { case Target::mewtwo: pbf_mash_button(context, BUTTON_A, 3000ms); - pbf_press_button(context, BUTTON_PLUS, 500ms, 500ms); + context.wait_for_all_requests(); + pbf_press_button(context, BUTTON_PLUS, 500ms, 100ms); break; case Target::snorlax: pbf_mash_button(context, BUTTON_A, 5000ms); + context.wait_for_all_requests(); pbf_mash_button(context, BUTTON_B, 10000ms); break; case Target::electrode: @@ -118,6 +124,8 @@ bool LegendaryReset::run_encounter(SingleSwitchProgramEnvironment& env, JoyconCo if (ret == 0) { env.log("HP boxes detected."); } else { + stats.errors++; + env.update_stats(); OperationFailedException::fire( ErrorReport::SEND_ERROR_REPORT, "run_battle(): Did not detect battle start.", @@ -171,6 +179,7 @@ void LegendaryReset::program(SingleSwitchProgramEnvironment& env, CancellableSco env, NOTIFICATION_STATUS_UPDATE, "No shiny found. Resetting game." ); + context.wait_for_all_requests(); //Reset game pbf_press_button(context, BUTTON_HOME, 200ms, 2000ms); @@ -188,6 +197,8 @@ void LegendaryReset::program(SingleSwitchProgramEnvironment& env, CancellableSco [&](JoyconContext& context) { while(true){ if (current_time() - start > std::chrono::minutes(5)){ + stats.errors++; + env.update_stats(); env.log("Timed out during battle after 5 minutes.", COLOR_RED); OperationFailedException::fire( ErrorReport::SEND_ERROR_REPORT, @@ -210,6 +221,8 @@ void LegendaryReset::program(SingleSwitchProgramEnvironment& env, CancellableSco context.wait_for_all_requests(); break; default: + stats.errors++; + env.update_stats(); env.log("Timed out during battle. Stuck, crashed, or took more than 30 seconds for a turn.", COLOR_RED); OperationFailedException::fire( ErrorReport::SEND_ERROR_REPORT, @@ -230,6 +243,8 @@ void LegendaryReset::program(SingleSwitchProgramEnvironment& env, CancellableSco ); break; default: + stats.errors++; + env.update_stats(); OperationFailedException::fire( ErrorReport::SEND_ERROR_REPORT, "Failed to detect catching menu.",