From 961caaad68d8c4129ae61b0d4d41f7a8b328f436 Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Sat, 15 Mar 2025 12:09:41 -0400 Subject: [PATCH 1/6] lgpe fossil farmer initial files and basic options --- SerialPrograms/CMakeLists.txt | 2 + SerialPrograms/SerialPrograms.pro | 2 + .../Source/PokemonLGPE/PokemonLGPE_Panels.cpp | 4 +- .../PokemonLGPE_DailyItemRespawnFarmer.cpp | 182 ++++++++++++++++++ .../PokemonLGPE_DailyItemRespawnFarmer.h | 64 ++++++ 5 files changed, 253 insertions(+), 1 deletion(-) create mode 100644 SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp create mode 100644 SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h diff --git a/SerialPrograms/CMakeLists.txt b/SerialPrograms/CMakeLists.txt index a55f2b29f5..f87be6bd60 100644 --- a/SerialPrograms/CMakeLists.txt +++ b/SerialPrograms/CMakeLists.txt @@ -1374,6 +1374,8 @@ file(GLOB MAIN_SOURCES Source/PokemonLA/Resources/PokemonLA_WeatherAndTimeIcons.h Source/PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.cpp Source/PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.h + Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp + Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.cpp Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.h Source/PokemonLGPE/Programs/PokemonLGPE_GameEntry.cpp diff --git a/SerialPrograms/SerialPrograms.pro b/SerialPrograms/SerialPrograms.pro index 50d10b4b0f..c3c8376380 100644 --- a/SerialPrograms/SerialPrograms.pro +++ b/SerialPrograms/SerialPrograms.pro @@ -674,6 +674,7 @@ SOURCES += \ Source/PokemonLA/Resources/PokemonLA_PokemonSprites.cpp \ Source/PokemonLA/Resources/PokemonLA_WeatherAndTimeIcons.cpp \ Source/PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.cpp \ + Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp \ Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.cpp \ Source/PokemonLGPE/Programs/PokemonLGPE_GameEntry.cpp \ Source/PokemonLGPE/PokemonLGPE_Panels.cpp \ @@ -1864,6 +1865,7 @@ HEADERS += \ Source/PokemonLA/Resources/PokemonLA_PokemonSprites.h \ Source/PokemonLA/Resources/PokemonLA_WeatherAndTimeIcons.h \ Source/PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.h \ + Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h \ Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.h \ Source/PokemonLGPE/Programs/PokemonLGPE_GameEntry.h \ Source/PokemonLGPE/PokemonLGPE_Panels.h \ diff --git a/SerialPrograms/Source/PokemonLGPE/PokemonLGPE_Panels.cpp b/SerialPrograms/Source/PokemonLGPE/PokemonLGPE_Panels.cpp index 39b64fd114..374b8a66b7 100644 --- a/SerialPrograms/Source/PokemonLGPE/PokemonLGPE_Panels.cpp +++ b/SerialPrograms/Source/PokemonLGPE/PokemonLGPE_Panels.cpp @@ -9,6 +9,7 @@ #include "PokemonLGPE_Panels.h" #include "PokemonLGPE_Settings.h" +#include "Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h" #include "Programs/ShinyHunting/PokemonLGPE_AlolanTrade.h" namespace PokemonAutomation{ @@ -25,7 +26,8 @@ std::vector PanelListFactory::make_panels() const{ ret.emplace_back("---- Settings ----"); ret.emplace_back(make_settings()); - //ret.emplace_back("---- General ----"); + ret.emplace_back("---- General ----"); + ret.emplace_back(make_single_switch_program()); ret.emplace_back("---- Shiny Hunting ----"); ret.emplace_back(make_single_switch_program()); diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp new file mode 100644 index 0000000000..1263f457d7 --- /dev/null +++ b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp @@ -0,0 +1,182 @@ +/* LGPE Daily Item Respawn Farmer + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#include "CommonFramework/Exceptions/OperationFailedException.h" +#include "CommonFramework/Notifications/ProgramNotifications.h" +#include "CommonFramework/ProgramStats/StatsTracking.h" +#include "CommonFramework/VideoPipeline/VideoFeed.h" +#include "CommonTools/Async/InferenceRoutines.h" +#include "CommonTools/StartupChecks/VideoResolutionCheck.h" +#include "NintendoSwitch/Commands/NintendoSwitch_Commands_PushButtons.h" +#include "NintendoSwitch/Controllers/NintendoSwitch_Joycon.h" +#include "NintendoSwitch/Programs/NintendoSwitch_GameEntry.h" +#include "Pokemon/Pokemon_Strings.h" +#include "CommonTools/VisualDetectors/BlackScreenDetector.h" +#include "PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.h" +#include "PokemonLGPE/Programs/PokemonLGPE_GameEntry.h" +#include "PokemonLGPE_DailyItemRespawnFarmer.h" + +namespace PokemonAutomation{ +namespace NintendoSwitch{ +namespace PokemonLGPE{ + +DailyItemRespawnFarmer_Descriptor::DailyItemRespawnFarmer_Descriptor() + : SingleSwitchProgramDescriptor( + "PokemonLGPE:DailyItemRespawnFarmer", + Pokemon::STRING_POKEMON + " LGPE", "Daily Item Respawn Farmer", + "", + "Farm daily item respawns, such as fossils, by date-skipping.", + FeedbackType::NONE, + AllowCommandsWhenRunning::DISABLE_COMMANDS, + {ControllerFeature::NintendoSwitch_RightJoycon}, + FasterIfTickPrecise::NOT_FASTER + ) +{} + +struct DailyItemRespawnFarmer_Descriptor::Stats : public StatsTracker{ + Stats() + : trades(m_stats["Trades"]) + , resets(m_stats["Resets"]) + { + m_display_order.emplace_back("Trades"); + m_display_order.emplace_back("Resets"); + } + std::atomic& trades; + std::atomic& resets; +}; +std::unique_ptr DailyItemRespawnFarmer_Descriptor::make_stats() const{ + return std::unique_ptr(new Stats()); +} + +DailyItemRespawnFarmer::DailyItemRespawnFarmer() + : ATTEMPTS( + "Number of attempts:", + LockMode::LOCK_WHILE_RUNNING, + 30, 1 + ) + , LINK_CODE( + "Link Code:
Only needed when running multiple LGPE date-skip programs at the same time. The link code used when matching for a trade/battle.", + { //Combinations of 3 different symbols is possible but 10 choices seems like enough. + {LinkCode::Pikachu, "pikachu", "Pikachu"}, + {LinkCode::Eevee, "eevee", "Eevee"}, + {LinkCode::Bulbasaur, "bulbasaur", "Bulbasaur"}, + {LinkCode::Charmander, "charmander", "Charmander"}, + {LinkCode::Squirtle, "squirtle", "Squirtle"}, + {LinkCode::Pidgey, "pidgey", "Pidgey"}, + {LinkCode::Caterpie, "caterpie", "Caterpie"}, + {LinkCode::Rattata, "rattata", "Rattata"}, + {LinkCode::Jigglypuff, "jigglypuff", "Jigglypuff"}, + {LinkCode::Diglett, "diglett", "Diglett"}, + }, + LockMode::LOCK_WHILE_RUNNING, + LinkCode::Pikachu + ) + , GO_HOME_WHEN_DONE(false) + , NOTIFICATION_STATUS_UPDATE("Status Update", true, false, std::chrono::seconds(3600)) + , NOTIFICATIONS({ + &NOTIFICATION_STATUS_UPDATE, + &NOTIFICATION_PROGRAM_FINISH, + }) +{ + PA_ADD_OPTION(ATTEMPTS); + PA_ADD_OPTION(LINK_CODE); + PA_ADD_OPTION(GO_HOME_WHEN_DONE); + PA_ADD_OPTION(NOTIFICATIONS); +} + +void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, CancellableScope& scope){ + JoyconContext context(scope, env.console.controller()); + assert_16_9_720p_min(env.logger(), env.console); + //DailyItemRespawnFarmer_Descriptor::Stats& stats = env.current_stats(); + + /* Stand in front of the fossil spawn near Mewtwo. + * Use a repel to keep wild encounters away. + * Start program in-game. + * 100% daily spawn. Only works near Mewtwo. + * Other cave item spawns are tied to steps taken. + * Should work for other hidden daily items, game corner, mt moon moonstones, etc. + */ + + for (uint32_t count = 0; count < ATTEMPTS; count++) { + //Pick up item + pbf_mash_button(context, BUTTON_A, 3000ms); + + //Open Menu -> Communication -> Nearby player -> Local Trade + pbf_press_button(context, BUTTON_X, 200ms, 500ms); + pbf_move_joystick(context, 255, 128, 100ms, 100ms); + pbf_press_button(context, BUTTON_A, 200ms, 1000ms); + pbf_press_button(context, BUTTON_A, 200ms, 1000ms); + pbf_press_button(context, BUTTON_A, 200ms, 1000ms); + pbf_press_button(context, BUTTON_A, 200ms, 1000ms); + + //Enter link code + switch(LINK_CODE) { + case LinkCode::Pikachu: + break; + case LinkCode::Eevee: + pbf_move_joystick(context, 255, 128, 100ms, 100ms); + break; + case LinkCode::Bulbasaur: + pbf_move_joystick(context, 255, 128, 100ms, 100ms); + pbf_move_joystick(context, 255, 128, 100ms, 100ms); + break; + case LinkCode::Charmander: + pbf_move_joystick(context, 0, 128, 100ms, 100ms); + pbf_move_joystick(context, 0, 128, 100ms, 100ms); + break; + case LinkCode::Squirtle: + pbf_move_joystick(context, 0, 128, 100ms, 100ms); + break; + case LinkCode::Pidgey: + pbf_move_joystick(context, 128, 255, 100ms, 100ms); + break; + case LinkCode::Caterpie: + pbf_move_joystick(context, 128, 255, 100ms, 100ms); + pbf_move_joystick(context, 255, 128, 100ms, 100ms); + break; + case LinkCode::Rattata: + pbf_move_joystick(context, 128, 255, 100ms, 100ms); + pbf_move_joystick(context, 0, 128, 100ms, 100ms); + pbf_move_joystick(context, 0, 128, 100ms, 100ms); + break; + case LinkCode::Jigglypuff: + pbf_move_joystick(context, 128, 255, 100ms, 100ms); + pbf_move_joystick(context, 0, 128, 100ms, 100ms); + pbf_move_joystick(context, 0, 128, 100ms, 100ms); + break; + case LinkCode::Diglett: + pbf_move_joystick(context, 128, 255, 100ms, 100ms); + pbf_move_joystick(context, 0, 128, 100ms, 100ms); + + break; + default: + break; + } + //Select symbol three times, then enter link search + pbf_press_button(context, BUTTON_A, 200ms, 1000ms); + pbf_press_button(context, BUTTON_A, 200ms, 1000ms); + pbf_press_button(context, BUTTON_A, 200ms, 1000ms); + + //Dateskip + + //Re-enter game + + //Close out link menu + + //stats. + } + + + if (GO_HOME_WHEN_DONE) { + pbf_press_button(context, BUTTON_HOME, 200ms, 1000ms); + } + send_program_finished_notification(env, NOTIFICATION_PROGRAM_FINISH); +} + + +} +} +} diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h new file mode 100644 index 0000000000..2ad27d4c74 --- /dev/null +++ b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h @@ -0,0 +1,64 @@ +/* LGPE Daily Item Respawn Farmer + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#ifndef PokemonAutomation_PokemonLGPE_DailyItemRespawnFarmer_H +#define PokemonAutomation_PokemonLGPE_DailyItemRespawnFarmer_H + +#include "NintendoSwitch/Controllers/NintendoSwitch_Joycon.h" +#include "NintendoSwitch/NintendoSwitch_SingleSwitchProgram.h" +#include "NintendoSwitch/Options/NintendoSwitch_GoHomeWhenDoneOption.h" +#include "CommonFramework/Notifications/EventNotificationsTable.h" +#include "Common/Cpp/Options/SimpleIntegerOption.h" + +namespace PokemonAutomation{ +namespace NintendoSwitch{ +namespace PokemonLGPE{ + +class DailyItemRespawnFarmer_Descriptor : public SingleSwitchProgramDescriptor{ +public: + DailyItemRespawnFarmer_Descriptor(); + struct Stats; + virtual std::unique_ptr make_stats() const override; +}; + +class DailyItemRespawnFarmer : public SingleSwitchProgramInstance{ +public: + DailyItemRespawnFarmer(); + virtual void program(SingleSwitchProgramEnvironment& env, CancellableScope& scope) override; + +private: + SimpleIntegerOption ATTEMPTS; + + enum class LinkCode{ + Pikachu, + Eevee, + Bulbasaur, + Charmander, + Squirtle, + Pidgey, + Caterpie, + Rattata, + Jigglypuff, + Diglett, + }; + EnumDropdownOption LINK_CODE; + + GoHomeWhenDoneOption GO_HOME_WHEN_DONE; + + EventNotificationOption NOTIFICATION_STATUS_UPDATE; + EventNotificationsOption NOTIFICATIONS; +}; + + + + +} +} +} +#endif + + + From 731c61b33ef558cc9940b03a297a7d80d8ea7949 Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Mon, 17 Mar 2025 09:07:24 -0400 Subject: [PATCH 2/6] copy over datespam files --- SerialPrograms/CMakeLists.txt | 2 + .../Programs/NintendoSwitch_Navigation.cpp | 99 +++++++++ .../Programs/NintendoSwitch_Navigation.h | 3 + .../Commands/PokemonLGPE_DateSpam.cpp | 208 ++++++++++++++++++ .../Commands/PokemonLGPE_DateSpam.h | 36 +++ .../PokemonLGPE_DailyItemRespawnFarmer.cpp | 30 ++- .../PokemonLGPE_DailyItemRespawnFarmer.h | 1 + 7 files changed, 373 insertions(+), 6 deletions(-) create mode 100644 SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp create mode 100644 SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h diff --git a/SerialPrograms/CMakeLists.txt b/SerialPrograms/CMakeLists.txt index f87be6bd60..cdc20d916f 100644 --- a/SerialPrograms/CMakeLists.txt +++ b/SerialPrograms/CMakeLists.txt @@ -1372,6 +1372,8 @@ file(GLOB MAIN_SOURCES Source/PokemonLA/Resources/PokemonLA_PokemonSprites.h Source/PokemonLA/Resources/PokemonLA_WeatherAndTimeIcons.cpp Source/PokemonLA/Resources/PokemonLA_WeatherAndTimeIcons.h + Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp + Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h Source/PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.cpp Source/PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.h Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp index 5c7c9b4aff..2c3365d631 100644 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp @@ -165,6 +165,105 @@ void home_to_date_time(ProControllerContext& context, bool to_date_change, bool +void home_to_date_time(JoyconContext& context, bool to_date_change, bool fast){ + // If (fast == true) this will run faster, but slightly less accurately. + + Milliseconds ticksize = context->ticksize(); + Milliseconds tv = context->timing_variation(); + Milliseconds unit = round_up_to_ticksize(ticksize, 17ms); + if (tv == 0ms){ + // Fast version for tick-precise. + + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 4); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 4); + + // Down twice in case we drop one. + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 3); + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 4); + + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); + + // Two A presses in case we drop the 1st one. + pbf_press_button(context, BUTTON_A, 3ms, 0ms); + pbf_press_button(context, BUTTON_A, 3ms, 0ms); + + // Just button mash it. lol + { + auto iterations = Milliseconds(1200) / unit + 1; + do{ + ssf_issue_scroll(context, SSF_SCROLL_DOWN, unit); + }while (--iterations); + } + { + auto iterations = Milliseconds(336) / unit + 1; + do{ + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, unit); + }while (--iterations); + } + + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 3); + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 3); + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 10); + ssf_press_dpad(context, DPAD_DOWN, 45, 40); + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 3); + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 3); + + if (!to_date_change){ + ssf_press_button(context, BUTTON_A, 45); + return; + } + + ssf_press_button(context, BUTTON_A, 3); + { + auto iterations = Milliseconds(216) / unit + 1; + do{ + ssf_issue_scroll(context, SSF_SCROLL_DOWN, unit); + }while (--iterations); + } + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); + +// // Insert this to move the cursor away from sleep if we messed up. +// ssf_issue_scroll1(SSF_SCROLL_LEFT, 0); + }else{ + // Slow version for tick-imprecise controllers. + +// ssf_do_nothing(context, 1500ms); + + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + + // Down twice in case we drop one. + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); +// ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + + // Two A presses in case we drop the 1st one. + ssf_mash1_button(context, BUTTON_A, 200ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN, 2500ms, 2500ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT, 500ms, 500ms); + + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 500ms, tv, tv); + ssf_press_right_joystick(context, 128, 224, 1000ms, 300ms, tv); +// ssf_issue_scroll(context, SSF_SCROLL_DOWN, 1000ms, 250ms, tv); // Scroll down + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + + if (!to_date_change){ + ssf_press_button_ptv(context, BUTTON_A); + return; + } + + ssf_press_button_ptv(context, BUTTON_A, 1000ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + } +} + + + } } diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.h b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.h index 0ace5dd4a2..6279b84e4c 100644 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.h +++ b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.h @@ -8,6 +8,7 @@ #define PokemonAutomation_NintendoSwitch_Navigation_H #include "NintendoSwitch/Controllers/NintendoSwitch_ProController.h" +#include "NintendoSwitch/Controllers/NintendoSwitch_Joycon.h" namespace PokemonAutomation{ namespace NintendoSwitch{ @@ -16,6 +17,8 @@ namespace NintendoSwitch{ void home_to_date_time(ProControllerContext& context, bool to_date_change, bool fast); +void home_to_date_time(JoyconContext& context, bool to_date_change, bool fast); + } diff --git a/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp new file mode 100644 index 0000000000..edaa148d7d --- /dev/null +++ b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp @@ -0,0 +1,208 @@ +/* Auto Host Routines + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#include "ClientSource/Libraries/MessageConverter.h" +#include "NintendoSwitch/Commands/NintendoSwitch_Commands_PushButtons.h" +#include "NintendoSwitch/Commands/NintendoSwitch_Commands_Superscalar.h" +#include "NintendoSwitch/Programs/NintendoSwitch_GameEntry.h" +#include "NintendoSwitch/Programs/NintendoSwitch_Navigation.h" +#include "PokemonLGPE_DateSpam.h" + +namespace PokemonAutomation{ +namespace NintendoSwitch{ +namespace PokemonLGPE{ + +void neutral_date_skip(JoyconContext& context){ + Milliseconds tv = context->timing_variation(); + if (tv == 0ms){ + pbf_press_button(context, BUTTON_A, 16ms, 8ms); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 3); + ssf_issue_scroll(context, SSF_SCROLL_UP, 0); + pbf_press_button(context, BUTTON_A, 1ms, 0ms); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 3); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 3); +// ssf_press_button(context, BUTTON_A, 2); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 3); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); + pbf_press_button(context, BUTTON_A, 16ms, 8ms); + pbf_press_button(context, BUTTON_A, 16ms, 8ms); + for (uint8_t c = 0; c < 6; c++){ + ssf_issue_scroll(context, SSF_SCROLL_LEFT, 3); + } + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 3); + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); + }else{ + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_UP); + ssf_press_button_ptv(context, BUTTON_A); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + for (uint8_t c = 0; c < 6; c++){ + ssf_issue_scroll_ptv(context, SSF_SCROLL_LEFT); + } + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + } +} +void roll_date_forward_1(JoyconContext& context, bool fast){ + // If (fast == true) this will run faster, but slightly less reliably. + + Milliseconds tv = context->timing_variation(); + if (tv == 0ms){ + uint8_t scroll_delay = fast ? 3 : 4; + uint8_t up_delay = fast ? 2 : 3; + + ssf_press_button(context, BUTTON_A, 20, 10); + ssf_issue_scroll(context, SSF_SCROLL_UP, 0); + ssf_press_button(context, BUTTON_A, up_delay); + // ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_UP, up_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_press_button(context, BUTTON_A, 0); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); + ssf_press_button(context, BUTTON_A, 20, 10); + }else{ + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_UP); + ssf_press_button_ptv(context, BUTTON_A); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_UP); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_press_button_ptv(context, BUTTON_A); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + } + +} +void roll_date_backward_N(JoyconContext& context, uint8_t skips, bool fast){ + // If (fast == true) this will run faster, but slightly less reliably. + + if (skips == 0){ + return; + } + + Milliseconds tv = context->timing_variation(); + if (tv == 0ms){ + uint8_t scroll_delay = fast ? 3 : 4; + uint8_t up_delay = 3; + + ssf_press_button(context, BUTTON_A, 20, 10); + for (uint8_t c = 0; c < skips - 1; c++){ + ssf_issue_scroll(context, SSF_SCROLL_DOWN, up_delay); + } + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); + ssf_press_button(context, BUTTON_A, up_delay); +// ssf_issue_scroll(context, SSF_SCROLL_RIGHT, delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + for (uint8_t c = 0; c < skips - 1; c++){ + ssf_issue_scroll(context, SSF_SCROLL_DOWN, up_delay); + } + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); + ssf_press_button(context, BUTTON_A, up_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); +// if (!fast){ +// // Add an extra one in case one is dropped. +// ssf_issue_scroll(context, SSF_SCROLL_RIGHT, delay); +// } + ssf_press_button(context, BUTTON_A, 20, 10); + }else{ + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + if (skips >= 60){ + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN, 6000ms, 6000ms); + }else{ + for (uint8_t c = 0; c < skips; c++){ + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + } + } + ssf_press_button_ptv(context, BUTTON_A); +// ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + if (skips >= 60){ + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN, 6000ms, 6000ms); + }else{ + for (uint8_t c = 0; c < skips; c++){ + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + } + } + ssf_press_button_ptv(context, BUTTON_A); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); +// if (!fast){ +// // Add an extra one in case one is dropped. +// ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); +// } + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + } + + +} +void touch_date_from_home(JoyconContext& context, Milliseconds settings_to_home_delay){ + // Touch the date without changing it. This prevents unintentional rollovers. + + home_to_date_time(context, true, true); + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + + ssf_press_button_ptv(context, BUTTON_A, 0ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_press_button_ptv(context, BUTTON_A, 0ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + + ssf_issue_scroll_ptv(context, SSF_SCROLL_LEFT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_UP, 16ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT, 0ms); + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_LEFT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN, 16ms); + ssf_press_button(context, BUTTON_HOME, settings_to_home_delay, 80ms); +} +void rollback_hours_from_home( + JoyconContext& context, + uint8_t hours, + Milliseconds settings_to_home_delay +){ + home_to_date_time(context, true, false); + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + + ssf_press_button_ptv(context, BUTTON_A, 0ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + for (uint8_t c = 0; c < hours; c++){ + ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + } + ssf_press_button_ptv(context, BUTTON_A, 0ms); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); + + ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + ssf_press_button(context, BUTTON_HOME, settings_to_home_delay, 80ms); +} + + + + + +} + +} +} + diff --git a/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h new file mode 100644 index 0000000000..399e593b08 --- /dev/null +++ b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h @@ -0,0 +1,36 @@ +/* Date Spamming Routines + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#ifndef PokemonAutomation_PokemonLGPE_Commands_DateSpam_H +#define PokemonAutomation_PokemonLGPE_Commands_DateSpam_H + +#include "CommonFramework/Tools/VideoStream.h" +#include "NintendoSwitch/Controllers/NintendoSwitch_Joycon.h" + +namespace PokemonAutomation{ +namespace NintendoSwitch{ + + +constexpr uint8_t MAX_YEAR = 60; + + +namespace PokemonLGPE{ + +void neutral_date_skip (JoyconContext& context); +void roll_date_forward_1 (JoyconContext& context, bool fast); +void roll_date_backward_N (JoyconContext& context, uint8_t skips, bool fast); +void touch_date_from_home (JoyconContext& context, Milliseconds settings_to_home_delay); +void rollback_hours_from_home( + JoyconContext& context, + uint8_t hours, + Milliseconds settings_to_home_delay +); + +} + +} +} +#endif diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp index 1263f457d7..2096cd2c52 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp @@ -28,7 +28,7 @@ DailyItemRespawnFarmer_Descriptor::DailyItemRespawnFarmer_Descriptor() "PokemonLGPE:DailyItemRespawnFarmer", Pokemon::STRING_POKEMON + " LGPE", "Daily Item Respawn Farmer", "", - "Farm daily item respawns, such as fossils, by date-skipping.", + "Farm daily item respawns (ex. fossils) by date-skipping.", FeedbackType::NONE, AllowCommandsWhenRunning::DISABLE_COMMANDS, {ControllerFeature::NintendoSwitch_RightJoycon}, @@ -38,13 +38,13 @@ DailyItemRespawnFarmer_Descriptor::DailyItemRespawnFarmer_Descriptor() struct DailyItemRespawnFarmer_Descriptor::Stats : public StatsTracker{ Stats() - : trades(m_stats["Trades"]) + : skips(m_stats["Skips"]) , resets(m_stats["Resets"]) { - m_display_order.emplace_back("Trades"); + m_display_order.emplace_back("Skips"); m_display_order.emplace_back("Resets"); } - std::atomic& trades; + std::atomic& skips; std::atomic& resets; }; std::unique_ptr DailyItemRespawnFarmer_Descriptor::make_stats() const{ @@ -75,6 +75,10 @@ DailyItemRespawnFarmer::DailyItemRespawnFarmer() LinkCode::Pikachu ) , GO_HOME_WHEN_DONE(false) + , FIX_TIME_WHEN_DONE( + "Fix Time when Done:
Fix the time after the program finishes.", + LockMode::UNLOCK_WHILE_RUNNING, false + ) , NOTIFICATION_STATUS_UPDATE("Status Update", true, false, std::chrono::seconds(3600)) , NOTIFICATIONS({ &NOTIFICATION_STATUS_UPDATE, @@ -84,13 +88,14 @@ DailyItemRespawnFarmer::DailyItemRespawnFarmer() PA_ADD_OPTION(ATTEMPTS); PA_ADD_OPTION(LINK_CODE); PA_ADD_OPTION(GO_HOME_WHEN_DONE); + PA_ADD_OPTION(FIX_TIME_WHEN_DONE); PA_ADD_OPTION(NOTIFICATIONS); } void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, CancellableScope& scope){ JoyconContext context(scope, env.console.controller()); assert_16_9_720p_min(env.logger(), env.console); - //DailyItemRespawnFarmer_Descriptor::Stats& stats = env.current_stats(); + DailyItemRespawnFarmer_Descriptor::Stats& stats = env.current_stats(); /* Stand in front of the fossil spawn near Mewtwo. * Use a repel to keep wild encounters away. @@ -100,6 +105,8 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel * Should work for other hidden daily items, game corner, mt moon moonstones, etc. */ + + for (uint32_t count = 0; count < ATTEMPTS; count++) { //Pick up item pbf_mash_button(context, BUTTON_A, 3000ms); @@ -150,9 +157,9 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel case LinkCode::Diglett: pbf_move_joystick(context, 128, 255, 100ms, 100ms); pbf_move_joystick(context, 0, 128, 100ms, 100ms); - break; default: + env.log("Invalid link code selection. Defaulting to Pikachu."); break; } //Select symbol three times, then enter link search @@ -167,8 +174,19 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel //Close out link menu //stats. + + stats.skips++; + env.update_stats(); } + if (FIX_TIME_WHEN_DONE){ + pbf_press_button(context, BUTTON_HOME, 80ms, GameSettings::instance().GAME_TO_HOME_DELAY1); + home_to_date_time(context, false, false); + pbf_press_button(context, BUTTON_A, 20, 105); + pbf_press_button(context, BUTTON_A, 20, 105); + pbf_press_button(context, BUTTON_HOME, 160ms, ConsoleSettings::instance().SETTINGS_TO_HOME_DELAY0); + resume_game_from_home(env.console, context); + } if (GO_HOME_WHEN_DONE) { pbf_press_button(context, BUTTON_HOME, 200ms, 1000ms); diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h index 2ad27d4c74..23ef49dbe4 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h +++ b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h @@ -47,6 +47,7 @@ class DailyItemRespawnFarmer : public SingleSwitchProgramInstance{ EnumDropdownOption LINK_CODE; GoHomeWhenDoneOption GO_HOME_WHEN_DONE; + BooleanCheckBoxOption FIX_TIME_WHEN_DONE; EventNotificationOption NOTIFICATION_STATUS_UPDATE; EventNotificationsOption NOTIFICATIONS; From 45452fce687b94e9f16c52560f243507b54bcf14 Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Mon, 17 Mar 2025 10:36:03 -0400 Subject: [PATCH 3/6] fix home_to_date_time for single joycon, remove unneeded datespam --- .../Programs/NintendoSwitch_Navigation.cpp | 133 +++++------- .../Programs/NintendoSwitch_Navigation.h | 3 +- .../Commands/PokemonLGPE_DateSpam.cpp | 192 ++++-------------- .../Commands/PokemonLGPE_DateSpam.h | 2 - .../PokemonLGPE_DailyItemRespawnFarmer.cpp | 11 +- 5 files changed, 97 insertions(+), 244 deletions(-) diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp index 2c3365d631..5b92bade7a 100644 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp @@ -165,101 +165,62 @@ void home_to_date_time(ProControllerContext& context, bool to_date_change, bool -void home_to_date_time(JoyconContext& context, bool to_date_change, bool fast){ - // If (fast == true) this will run faster, but slightly less accurately. - - Milliseconds ticksize = context->ticksize(); +void home_to_date_time(JoyconContext& context, bool to_date_change){ Milliseconds tv = context->timing_variation(); - Milliseconds unit = round_up_to_ticksize(ticksize, 17ms); - if (tv == 0ms){ - // Fast version for tick-precise. + Milliseconds unit = 50ms + tv; - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 4); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 4); + //From ControllerPerformanceClass::SerialPABotBase_Wireless_ESP32 + //as Joycon will only have that controller type - // Down twice in case we drop one. - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 3); - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 4); + pbf_move_joystick(context, 255, 128, 2*unit, unit); + pbf_move_joystick(context, 255, 128, 2*unit, unit); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); + // Down twice in case we drop one. + pbf_move_joystick(context, 128, 255, 2*unit, unit); + pbf_move_joystick(context, 128, 255, 2*unit, unit); - // Two A presses in case we drop the 1st one. - pbf_press_button(context, BUTTON_A, 3ms, 0ms); - pbf_press_button(context, BUTTON_A, 3ms, 0ms); + pbf_move_joystick(context, 255, 128, 2*unit, unit); - // Just button mash it. lol - { - auto iterations = Milliseconds(1200) / unit + 1; - do{ - ssf_issue_scroll(context, SSF_SCROLL_DOWN, unit); - }while (--iterations); - } - { - auto iterations = Milliseconds(336) / unit + 1; - do{ - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, unit); - }while (--iterations); - } + // Press A multiple times to make sure one goes through. + pbf_press_button(context, BUTTON_A, 2*unit, unit); + pbf_press_button(context, BUTTON_A, 2*unit, unit); + pbf_press_button(context, BUTTON_A, 2*unit, unit); - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 3); - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 3); - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 10); - ssf_press_dpad(context, DPAD_DOWN, 45, 40); - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 3); - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 3); - - if (!to_date_change){ - ssf_press_button(context, BUTTON_A, 45); - return; - } - - ssf_press_button(context, BUTTON_A, 3); - { - auto iterations = Milliseconds(216) / unit + 1; - do{ - ssf_issue_scroll(context, SSF_SCROLL_DOWN, unit); - }while (--iterations); - } - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); - -// // Insert this to move the cursor away from sleep if we messed up. -// ssf_issue_scroll1(SSF_SCROLL_LEFT, 0); - }else{ - // Slow version for tick-imprecise controllers. - -// ssf_do_nothing(context, 1500ms); - - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - - // Down twice in case we drop one. - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); -// ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); - - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - - // Two A presses in case we drop the 1st one. - ssf_mash1_button(context, BUTTON_A, 200ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN, 2500ms, 2500ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT, 500ms, 500ms); - - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 500ms, tv, tv); - ssf_press_right_joystick(context, 128, 224, 1000ms, 300ms, tv); -// ssf_issue_scroll(context, SSF_SCROLL_DOWN, 1000ms, 250ms, tv); // Scroll down - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); - - if (!to_date_change){ - ssf_press_button_ptv(context, BUTTON_A); - return; - } + + // Just button mash it. lol + { + auto iterations = Milliseconds(1100) / unit + 1; + do{ + pbf_move_joystick(context, 128, 255, 2*unit, unit); + }while (--iterations); + } + { + auto iterations = Milliseconds(336) / unit + 1; + do{ + pbf_move_joystick(context, 255, 128, 2*unit, unit); + }while (--iterations); + } + + pbf_move_joystick(context, 128, 255, 2*unit, unit); + pbf_move_joystick(context, 128, 255, 2*unit, unit); + pbf_move_joystick(context, 128, 255, 4*unit, unit); + pbf_move_joystick(context, 128, 255, 360ms, 304ms); + pbf_move_joystick(context, 128, 255, 2*unit, unit); + //pbf_move_joystick(context, 128, 255, 2*unit, unit); + + if (!to_date_change){ + ssf_press_button(context, BUTTON_A, 360ms, 2*unit, unit); + return; + } - ssf_press_button_ptv(context, BUTTON_A, 1000ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + ssf_press_button(context, BUTTON_A, unit); + { + auto iterations = Milliseconds(216) / unit + 1; + do{ + pbf_move_joystick(context, 128, 255, 2*unit, unit); + }while (--iterations); } + pbf_move_joystick(context, 128, 255, 2*unit, 0ms); } diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.h b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.h index 6279b84e4c..fa3518c7ab 100644 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.h +++ b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.h @@ -17,7 +17,8 @@ namespace NintendoSwitch{ void home_to_date_time(ProControllerContext& context, bool to_date_change, bool fast); -void home_to_date_time(JoyconContext& context, bool to_date_change, bool fast); +//Joycon must not be sideways +void home_to_date_time(JoyconContext& context, bool to_date_change); diff --git a/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp index edaa148d7d..12d0071477 100644 --- a/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp @@ -15,79 +15,26 @@ namespace PokemonAutomation{ namespace NintendoSwitch{ namespace PokemonLGPE{ -void neutral_date_skip(JoyconContext& context){ - Milliseconds tv = context->timing_variation(); - if (tv == 0ms){ - pbf_press_button(context, BUTTON_A, 16ms, 8ms); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 3); - ssf_issue_scroll(context, SSF_SCROLL_UP, 0); - pbf_press_button(context, BUTTON_A, 1ms, 0ms); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 3); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 3); -// ssf_press_button(context, BUTTON_A, 2); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 3); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); - pbf_press_button(context, BUTTON_A, 16ms, 8ms); - pbf_press_button(context, BUTTON_A, 16ms, 8ms); - for (uint8_t c = 0; c < 6; c++){ - ssf_issue_scroll(context, SSF_SCROLL_LEFT, 3); - } - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 3); - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); - }else{ - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_UP); - ssf_press_button_ptv(context, BUTTON_A); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); - for (uint8_t c = 0; c < 6; c++){ - ssf_issue_scroll_ptv(context, SSF_SCROLL_LEFT); - } - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); - } +void roll_date_forward_1(JoyconContext& context){ + /* + uint8_t scroll_delay = fast ? 3 : 4; + uint8_t up_delay = fast ? 2 : 3; + + pbf_press_button(context, BUTTON_A, 20, 10); + ssf_issue_scroll(context, SSF_SCROLL_UP, 0); + pbf_press_button(context, BUTTON_A, up_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_UP, up_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + pbf_press_button(context, BUTTON_A, 0); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); + pbf_press_button(context, BUTTON_A, 20, 10); + */ } -void roll_date_forward_1(JoyconContext& context, bool fast){ - // If (fast == true) this will run faster, but slightly less reliably. - - Milliseconds tv = context->timing_variation(); - if (tv == 0ms){ - uint8_t scroll_delay = fast ? 3 : 4; - uint8_t up_delay = fast ? 2 : 3; - - ssf_press_button(context, BUTTON_A, 20, 10); - ssf_issue_scroll(context, SSF_SCROLL_UP, 0); - ssf_press_button(context, BUTTON_A, up_delay); - // ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_UP, up_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_press_button(context, BUTTON_A, 0); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); - ssf_press_button(context, BUTTON_A, 20, 10); - }else{ - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_UP); - ssf_press_button_ptv(context, BUTTON_A); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_UP); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_press_button_ptv(context, BUTTON_A); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); - } - -} -void roll_date_backward_N(JoyconContext& context, uint8_t skips, bool fast){ +void roll_date_backward_N(JoyconContext& context, uint8_t skips){ + /* // If (fast == true) this will run faster, but slightly less reliably. if (skips == 0){ @@ -95,91 +42,33 @@ void roll_date_backward_N(JoyconContext& context, uint8_t skips, bool fast){ } Milliseconds tv = context->timing_variation(); - if (tv == 0ms){ - uint8_t scroll_delay = fast ? 3 : 4; - uint8_t up_delay = 3; - - ssf_press_button(context, BUTTON_A, 20, 10); - for (uint8_t c = 0; c < skips - 1; c++){ - ssf_issue_scroll(context, SSF_SCROLL_DOWN, up_delay); - } - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); - ssf_press_button(context, BUTTON_A, up_delay); -// ssf_issue_scroll(context, SSF_SCROLL_RIGHT, delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - for (uint8_t c = 0; c < skips - 1; c++){ - ssf_issue_scroll(context, SSF_SCROLL_DOWN, up_delay); - } - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); - ssf_press_button(context, BUTTON_A, up_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); -// if (!fast){ -// // Add an extra one in case one is dropped. -// ssf_issue_scroll(context, SSF_SCROLL_RIGHT, delay); -// } - ssf_press_button(context, BUTTON_A, 20, 10); - }else{ - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); - if (skips >= 60){ - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN, 6000ms, 6000ms); - }else{ - for (uint8_t c = 0; c < skips; c++){ - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); - } - } - ssf_press_button_ptv(context, BUTTON_A); -// ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - if (skips >= 60){ - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN, 6000ms, 6000ms); - }else{ - for (uint8_t c = 0; c < skips; c++){ - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); - } - } - ssf_press_button_ptv(context, BUTTON_A); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); -// if (!fast){ -// // Add an extra one in case one is dropped. -// ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); -// } - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); - } - - -} -void touch_date_from_home(JoyconContext& context, Milliseconds settings_to_home_delay){ - // Touch the date without changing it. This prevents unintentional rollovers. - - home_to_date_time(context, true, true); - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + uint8_t scroll_delay = fast ? 3 : 4; + uint8_t up_delay = 3; - ssf_press_button_ptv(context, BUTTON_A, 0ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_press_button_ptv(context, BUTTON_A, 0ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - - ssf_issue_scroll_ptv(context, SSF_SCROLL_LEFT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_UP, 16ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT, 0ms); - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); - - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_LEFT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN, 16ms); - ssf_press_button(context, BUTTON_HOME, settings_to_home_delay, 80ms); + pbf_press_button(context, BUTTON_A, 20, 10); + for (uint8_t c = 0; c < skips - 1; c++){ + ssf_issue_scroll(context, SSF_SCROLL_DOWN, up_delay); + } + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); + pbf_press_button(context, BUTTON_A, up_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + for (uint8_t c = 0; c < skips - 1; c++){ + ssf_issue_scroll(context, SSF_SCROLL_DOWN, up_delay); + } + ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); + pbf_press_button(context, BUTTON_A, up_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); + pbf_press_button(context, BUTTON_A, 20, 10); + */ } void rollback_hours_from_home( JoyconContext& context, uint8_t hours, Milliseconds settings_to_home_delay ){ + /* home_to_date_time(context, true, false); ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); @@ -193,8 +82,9 @@ void rollback_hours_from_home( ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); + pbf_press_button(context, BUTTON_A, 160ms, 80ms); ssf_press_button(context, BUTTON_HOME, settings_to_home_delay, 80ms); + */ } diff --git a/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h index 399e593b08..178ba16550 100644 --- a/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h +++ b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h @@ -19,10 +19,8 @@ constexpr uint8_t MAX_YEAR = 60; namespace PokemonLGPE{ -void neutral_date_skip (JoyconContext& context); void roll_date_forward_1 (JoyconContext& context, bool fast); void roll_date_backward_N (JoyconContext& context, uint8_t skips, bool fast); -void touch_date_from_home (JoyconContext& context, Milliseconds settings_to_home_delay); void rollback_hours_from_home( JoyconContext& context, uint8_t hours, diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp index 2096cd2c52..a34bbe07cb 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp @@ -13,6 +13,7 @@ #include "NintendoSwitch/Commands/NintendoSwitch_Commands_PushButtons.h" #include "NintendoSwitch/Controllers/NintendoSwitch_Joycon.h" #include "NintendoSwitch/Programs/NintendoSwitch_GameEntry.h" +#include "NintendoSwitch/Programs/NintendoSwitch_Navigation.h" #include "Pokemon/Pokemon_Strings.h" #include "CommonTools/VisualDetectors/BlackScreenDetector.h" #include "PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.h" @@ -95,7 +96,7 @@ DailyItemRespawnFarmer::DailyItemRespawnFarmer() void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, CancellableScope& scope){ JoyconContext context(scope, env.console.controller()); assert_16_9_720p_min(env.logger(), env.console); - DailyItemRespawnFarmer_Descriptor::Stats& stats = env.current_stats(); + //DailyItemRespawnFarmer_Descriptor::Stats& stats = env.current_stats(); /* Stand in front of the fossil spawn near Mewtwo. * Use a repel to keep wild encounters away. @@ -105,8 +106,9 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel * Should work for other hidden daily items, game corner, mt moon moonstones, etc. */ + home_to_date_time(context, true); - + /* for (uint32_t count = 0; count < ATTEMPTS; count++) { //Pick up item pbf_mash_button(context, BUTTON_A, 3000ms); @@ -180,8 +182,8 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel } if (FIX_TIME_WHEN_DONE){ - pbf_press_button(context, BUTTON_HOME, 80ms, GameSettings::instance().GAME_TO_HOME_DELAY1); - home_to_date_time(context, false, false); + pbf_press_button(context, BUTTON_HOME, 80ms, 1000ms); + home_to_date_time(context, false); pbf_press_button(context, BUTTON_A, 20, 105); pbf_press_button(context, BUTTON_A, 20, 105); pbf_press_button(context, BUTTON_HOME, 160ms, ConsoleSettings::instance().SETTINGS_TO_HOME_DELAY0); @@ -192,6 +194,7 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel pbf_press_button(context, BUTTON_HOME, 200ms, 1000ms); } send_program_finished_notification(env, NOTIFICATION_PROGRAM_FINISH); + */ } From 42ec6a83eae5f0e960d8cd182f82304541b0f9a1 Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Mon, 17 Mar 2025 11:39:00 -0400 Subject: [PATCH 4/6] roll date forward/backward, resume game from home --- .../Programs/NintendoSwitch_GameEntry.cpp | 37 ++++++++ .../Programs/NintendoSwitch_GameEntry.h | 5 +- .../Programs/NintendoSwitch_Navigation.cpp | 2 +- .../Commands/PokemonLGPE_DateSpam.cpp | 85 +++++++------------ .../Commands/PokemonLGPE_DateSpam.h | 14 +-- .../PokemonLGPE_DailyItemRespawnFarmer.cpp | 13 ++- 6 files changed, 79 insertions(+), 77 deletions(-) diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_GameEntry.cpp b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_GameEntry.cpp index 7a0c3b46c4..be2f5a5b3f 100644 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_GameEntry.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_GameEntry.cpp @@ -312,7 +312,44 @@ bool openedgame_to_gamemenu( +void resume_game_from_home( + VideoStream& stream, JoyconContext& context, + bool skip_home_press +){ + if (!skip_home_press){ + pbf_press_button(context, BUTTON_HOME, 20ms, 10ms); + } + context.wait_for_all_requests(); + while (true){ + { + UpdateMenuWatcher update_detector; + int ret = wait_until( + stream, context, + std::chrono::milliseconds(1000), + { update_detector } + ); + if (ret == 0){ + stream.log("Detected update window.", COLOR_RED); + + pbf_move_joystick(context, 128, 0, 10ms, 0ms); + pbf_press_button(context, BUTTON_A, 10ms, 500ms); + context.wait_for_all_requests(); + continue; + } + } + + // In case we failed to enter the game. + HomeWatcher home_detector; + if (home_detector.detect(stream.video().snapshot())){ + stream.log("Failed to re-enter game. Trying again...", COLOR_RED); + pbf_press_button(context, BUTTON_HOME, 20ms, 10ms); + continue; + }else{ + break; + } + } +} void move_to_user(JoyconContext& context, uint8_t user_slot){ if (user_slot != 0){ // Move to correct user. diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_GameEntry.h b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_GameEntry.h index 8ff307bacb..f29cb1113e 100644 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_GameEntry.h +++ b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_GameEntry.h @@ -35,7 +35,10 @@ bool openedgame_to_gamemenu( ); - +void resume_game_from_home( + VideoStream& stream, JoyconContext& context, + bool skip_home_press = false +); void start_game_from_home_with_inference( VideoStream& stream, JoyconContext& context, uint8_t game_slot, diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp index 5b92bade7a..b3ac1c853f 100644 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_Navigation.cpp @@ -167,7 +167,7 @@ void home_to_date_time(ProControllerContext& context, bool to_date_change, bool void home_to_date_time(JoyconContext& context, bool to_date_change){ Milliseconds tv = context->timing_variation(); - Milliseconds unit = 50ms + tv; + Milliseconds unit = 32ms + tv; //From ControllerPerformanceClass::SerialPABotBase_Wireless_ESP32 //as Joycon will only have that controller type diff --git a/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp index 12d0071477..7db54212b0 100644 --- a/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.cpp @@ -16,75 +16,48 @@ namespace NintendoSwitch{ namespace PokemonLGPE{ void roll_date_forward_1(JoyconContext& context){ - /* - uint8_t scroll_delay = fast ? 3 : 4; - uint8_t up_delay = fast ? 2 : 3; - - pbf_press_button(context, BUTTON_A, 20, 10); - ssf_issue_scroll(context, SSF_SCROLL_UP, 0); - pbf_press_button(context, BUTTON_A, up_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_UP, up_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - pbf_press_button(context, BUTTON_A, 0); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); - pbf_press_button(context, BUTTON_A, 20, 10); - */ + Milliseconds tv = context->timing_variation(); + Milliseconds unit = 34ms + tv; + + pbf_press_button(context, BUTTON_A, 2*unit, unit); + pbf_move_joystick(context, 128, 0, 2*unit, unit); + pbf_press_button(context, BUTTON_A, 2*unit, unit); + + pbf_move_joystick(context, 255, 128, 2*unit, unit); + pbf_move_joystick(context, 128, 0, 2*unit, unit); + pbf_move_joystick(context, 255, 128, 2*unit, unit); + pbf_press_button(context, BUTTON_A, 2*unit, unit); + pbf_move_joystick(context, 255, 128, 2*unit, unit); + pbf_move_joystick(context, 255, 128, 2*unit, unit); + pbf_press_button(context, BUTTON_A, 2*unit, unit); } -void roll_date_backward_N(JoyconContext& context, uint8_t skips){ - /* - // If (fast == true) this will run faster, but slightly less reliably. +void roll_date_backward_N(JoyconContext& context, uint8_t skips){ if (skips == 0){ return; } Milliseconds tv = context->timing_variation(); - uint8_t scroll_delay = fast ? 3 : 4; - uint8_t up_delay = 3; + Milliseconds unit = 32ms + tv; + + pbf_press_button(context, BUTTON_A, 2*unit, unit); - pbf_press_button(context, BUTTON_A, 20, 10); for (uint8_t c = 0; c < skips - 1; c++){ - ssf_issue_scroll(context, SSF_SCROLL_DOWN, up_delay); + pbf_move_joystick(context, 128, 255, 2*unit, unit); } - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); - pbf_press_button(context, BUTTON_A, up_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); + + pbf_press_button(context, BUTTON_A, 2*unit, unit); + pbf_move_joystick(context, 255, 128, 2*unit, unit); + for (uint8_t c = 0; c < skips - 1; c++){ - ssf_issue_scroll(context, SSF_SCROLL_DOWN, up_delay); - } - ssf_issue_scroll(context, SSF_SCROLL_DOWN, 0); - pbf_press_button(context, BUTTON_A, up_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, scroll_delay); - ssf_issue_scroll(context, SSF_SCROLL_RIGHT, 0); - pbf_press_button(context, BUTTON_A, 20, 10); - */ -} -void rollback_hours_from_home( - JoyconContext& context, - uint8_t hours, - Milliseconds settings_to_home_delay -){ - /* - home_to_date_time(context, true, false); - ssf_press_button_ptv(context, BUTTON_A, 160ms, 80ms); - - ssf_press_button_ptv(context, BUTTON_A, 0ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - for (uint8_t c = 0; c < hours; c++){ - ssf_issue_scroll_ptv(context, SSF_SCROLL_DOWN); + pbf_move_joystick(context, 128, 255, 2*unit, unit); } - ssf_press_button_ptv(context, BUTTON_A, 0ms); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - ssf_issue_scroll_ptv(context, SSF_SCROLL_RIGHT); - pbf_press_button(context, BUTTON_A, 160ms, 80ms); - ssf_press_button(context, BUTTON_HOME, settings_to_home_delay, 80ms); - */ + pbf_press_button(context, BUTTON_A, 2*unit, unit); + pbf_move_joystick(context, 255, 128, 2*unit, unit); + pbf_move_joystick(context, 255, 128, 2*unit, unit); + pbf_press_button(context, BUTTON_A, 2*unit, unit); + pbf_press_button(context, BUTTON_A, 2*unit, unit); } diff --git a/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h index 178ba16550..f692cdf07f 100644 --- a/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h +++ b/SerialPrograms/Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h @@ -12,20 +12,10 @@ namespace PokemonAutomation{ namespace NintendoSwitch{ - - -constexpr uint8_t MAX_YEAR = 60; - - namespace PokemonLGPE{ -void roll_date_forward_1 (JoyconContext& context, bool fast); -void roll_date_backward_N (JoyconContext& context, uint8_t skips, bool fast); -void rollback_hours_from_home( - JoyconContext& context, - uint8_t hours, - Milliseconds settings_to_home_delay -); +void roll_date_forward_1 (JoyconContext& context); +void roll_date_backward_N (JoyconContext& context, uint8_t skips); } diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp index a34bbe07cb..a392a57181 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp @@ -14,10 +14,13 @@ #include "NintendoSwitch/Controllers/NintendoSwitch_Joycon.h" #include "NintendoSwitch/Programs/NintendoSwitch_GameEntry.h" #include "NintendoSwitch/Programs/NintendoSwitch_Navigation.h" +#include "NintendoSwitch/NintendoSwitch_Settings.h" #include "Pokemon/Pokemon_Strings.h" #include "CommonTools/VisualDetectors/BlackScreenDetector.h" +#include "PokemonLGPE/Commands/PokemonLGPE_DateSpam.h" #include "PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.h" #include "PokemonLGPE/Programs/PokemonLGPE_GameEntry.h" +#include "PokemonSwSh/Commands/PokemonSwSh_Commands_DateSpam.h" #include "PokemonLGPE_DailyItemRespawnFarmer.h" namespace PokemonAutomation{ @@ -96,7 +99,7 @@ DailyItemRespawnFarmer::DailyItemRespawnFarmer() void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, CancellableScope& scope){ JoyconContext context(scope, env.console.controller()); assert_16_9_720p_min(env.logger(), env.console); - //DailyItemRespawnFarmer_Descriptor::Stats& stats = env.current_stats(); + DailyItemRespawnFarmer_Descriptor::Stats& stats = env.current_stats(); /* Stand in front of the fossil spawn near Mewtwo. * Use a repel to keep wild encounters away. @@ -106,9 +109,6 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel * Should work for other hidden daily items, game corner, mt moon moonstones, etc. */ - home_to_date_time(context, true); - - /* for (uint32_t count = 0; count < ATTEMPTS; count++) { //Pick up item pbf_mash_button(context, BUTTON_A, 3000ms); @@ -184,8 +184,8 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel if (FIX_TIME_WHEN_DONE){ pbf_press_button(context, BUTTON_HOME, 80ms, 1000ms); home_to_date_time(context, false); - pbf_press_button(context, BUTTON_A, 20, 105); - pbf_press_button(context, BUTTON_A, 20, 105); + pbf_press_button(context, BUTTON_A, 20ms, 10ms); + pbf_press_button(context, BUTTON_A, 20ms, 10ms); pbf_press_button(context, BUTTON_HOME, 160ms, ConsoleSettings::instance().SETTINGS_TO_HOME_DELAY0); resume_game_from_home(env.console, context); } @@ -194,7 +194,6 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel pbf_press_button(context, BUTTON_HOME, 200ms, 1000ms); } send_program_finished_notification(env, NOTIFICATION_PROGRAM_FINISH); - */ } From 7a4ca3e2f142ba1ef38559b10ebe0ce7dce6aab2 Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Mon, 17 Mar 2025 12:38:49 -0400 Subject: [PATCH 5/6] working farmer --- .../PokemonLGPE_DailyItemRespawnFarmer.cpp | 49 ++++++++++++------- .../PokemonLGPE_DailyItemRespawnFarmer.h | 2 +- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp index a392a57181..c883c14fc6 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp @@ -43,13 +43,10 @@ DailyItemRespawnFarmer_Descriptor::DailyItemRespawnFarmer_Descriptor() struct DailyItemRespawnFarmer_Descriptor::Stats : public StatsTracker{ Stats() : skips(m_stats["Skips"]) - , resets(m_stats["Resets"]) { m_display_order.emplace_back("Skips"); - m_display_order.emplace_back("Resets"); } std::atomic& skips; - std::atomic& resets; }; std::unique_ptr DailyItemRespawnFarmer_Descriptor::make_stats() const{ return std::unique_ptr(new Stats()); @@ -62,7 +59,7 @@ DailyItemRespawnFarmer::DailyItemRespawnFarmer() 30, 1 ) , LINK_CODE( - "Link Code:
Only needed when running multiple LGPE date-skip programs at the same time. The link code used when matching for a trade/battle.", + "Link Code:
The link code used when matching for a trade/battle. This only needs to be changed when running multiple LGPE date-skip programs at the same time.", { //Combinations of 3 different symbols is possible but 10 choices seems like enough. {LinkCode::Pikachu, "pikachu", "Pikachu"}, {LinkCode::Eevee, "eevee", "Eevee"}, @@ -78,11 +75,11 @@ DailyItemRespawnFarmer::DailyItemRespawnFarmer() LockMode::LOCK_WHILE_RUNNING, LinkCode::Pikachu ) - , GO_HOME_WHEN_DONE(false) , FIX_TIME_WHEN_DONE( "Fix Time when Done:
Fix the time after the program finishes.", LockMode::UNLOCK_WHILE_RUNNING, false ) + , GO_HOME_WHEN_DONE(false) , NOTIFICATION_STATUS_UPDATE("Status Update", true, false, std::chrono::seconds(3600)) , NOTIFICATIONS({ &NOTIFICATION_STATUS_UPDATE, @@ -91,8 +88,8 @@ DailyItemRespawnFarmer::DailyItemRespawnFarmer() { PA_ADD_OPTION(ATTEMPTS); PA_ADD_OPTION(LINK_CODE); - PA_ADD_OPTION(GO_HOME_WHEN_DONE); PA_ADD_OPTION(FIX_TIME_WHEN_DONE); + PA_ADD_OPTION(GO_HOME_WHEN_DONE); PA_ADD_OPTION(NOTIFICATIONS); } @@ -109,15 +106,20 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel * Should work for other hidden daily items, game corner, mt moon moonstones, etc. */ + uint8_t year = MAX_YEAR; + for (uint32_t count = 0; count < ATTEMPTS; count++) { //Pick up item - pbf_mash_button(context, BUTTON_A, 3000ms); + pbf_mash_button(context, BUTTON_A, 4000ms); + context.wait_for_all_requests(); //Open Menu -> Communication -> Nearby player -> Local Trade pbf_press_button(context, BUTTON_X, 200ms, 500ms); pbf_move_joystick(context, 255, 128, 100ms, 100ms); pbf_press_button(context, BUTTON_A, 200ms, 1000ms); pbf_press_button(context, BUTTON_A, 200ms, 1000ms); + pbf_wait(context, 1000ms); //Black screen + context.wait_for_all_requests(); pbf_press_button(context, BUTTON_A, 200ms, 1000ms); pbf_press_button(context, BUTTON_A, 200ms, 1000ms); @@ -165,17 +167,28 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel break; } //Select symbol three times, then enter link search - pbf_press_button(context, BUTTON_A, 200ms, 1000ms); - pbf_press_button(context, BUTTON_A, 200ms, 1000ms); - pbf_press_button(context, BUTTON_A, 200ms, 1000ms); + pbf_press_button(context, BUTTON_A, 200ms, 100ms); + pbf_press_button(context, BUTTON_A, 200ms, 100ms); + pbf_press_button(context, BUTTON_A, 200ms, 100ms); + pbf_wait(context, 1000ms); //let search start + context.wait_for_all_requests(); //Dateskip + pbf_press_button(context, BUTTON_HOME, 160ms, 1000ms); + home_to_date_time(context, true); + if (year >= MAX_YEAR){ + roll_date_backward_N(context, MAX_YEAR); + year = 0; + }else{ + roll_date_forward_1(context); + year++; + } + pbf_press_button(context, BUTTON_HOME, 160ms, ConsoleSettings::instance().SETTINGS_TO_HOME_DELAY0); - //Re-enter game - - //Close out link menu - - //stats. + //Re-enter game and close out link menu + pbf_press_button(context, BUTTON_HOME, 160ms, ConsoleSettings::instance().SETTINGS_TO_HOME_DELAY0); + pbf_mash_button(context, BUTTON_B, 5000ms); + context.wait_for_all_requests(); stats.skips++; env.update_stats(); @@ -184,8 +197,10 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel if (FIX_TIME_WHEN_DONE){ pbf_press_button(context, BUTTON_HOME, 80ms, 1000ms); home_to_date_time(context, false); - pbf_press_button(context, BUTTON_A, 20ms, 10ms); - pbf_press_button(context, BUTTON_A, 20ms, 10ms); + pbf_press_button(context, BUTTON_A, 30ms, 50ms); + context.wait_for_all_requests(); + pbf_press_button(context, BUTTON_A, 30ms, 50ms); + context.wait_for_all_requests(); pbf_press_button(context, BUTTON_HOME, 160ms, ConsoleSettings::instance().SETTINGS_TO_HOME_DELAY0); resume_game_from_home(env.console, context); } diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h index 23ef49dbe4..dc9f771794 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h +++ b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h @@ -46,8 +46,8 @@ class DailyItemRespawnFarmer : public SingleSwitchProgramInstance{ }; EnumDropdownOption LINK_CODE; - GoHomeWhenDoneOption GO_HOME_WHEN_DONE; BooleanCheckBoxOption FIX_TIME_WHEN_DONE; + GoHomeWhenDoneOption GO_HOME_WHEN_DONE; EventNotificationOption NOTIFICATION_STATUS_UPDATE; EventNotificationsOption NOTIFICATIONS; From ee02ad90a334ccc0483ae5c3de0ee018fc2359ad Mon Sep 17 00:00:00 2001 From: kichithewolf Date: Mon, 17 Mar 2025 13:11:56 -0400 Subject: [PATCH 6/6] rename file, timing fixes --- SerialPrograms/CMakeLists.txt | 4 +-- SerialPrograms/SerialPrograms.pro | 4 +-- .../Source/PokemonLGPE/PokemonLGPE_Panels.cpp | 4 +-- ...er.cpp => PokemonLGPE_DailyItemFarmer.cpp} | 26 +++++++++---------- ...Farmer.h => PokemonLGPE_DailyItemFarmer.h} | 14 +++++----- 5 files changed, 26 insertions(+), 26 deletions(-) rename SerialPrograms/Source/PokemonLGPE/Programs/Farming/{PokemonLGPE_DailyItemRespawnFarmer.cpp => PokemonLGPE_DailyItemFarmer.cpp} (90%) rename SerialPrograms/Source/PokemonLGPE/Programs/Farming/{PokemonLGPE_DailyItemRespawnFarmer.h => PokemonLGPE_DailyItemFarmer.h} (75%) diff --git a/SerialPrograms/CMakeLists.txt b/SerialPrograms/CMakeLists.txt index cdc20d916f..65c92eb831 100644 --- a/SerialPrograms/CMakeLists.txt +++ b/SerialPrograms/CMakeLists.txt @@ -1376,8 +1376,8 @@ file(GLOB MAIN_SOURCES Source/PokemonLGPE/Commands/PokemonLGPE_DateSpam.h Source/PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.cpp Source/PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.h - Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp - Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h + Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemFarmer.cpp + Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemFarmer.h Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.cpp Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.h Source/PokemonLGPE/Programs/PokemonLGPE_GameEntry.cpp diff --git a/SerialPrograms/SerialPrograms.pro b/SerialPrograms/SerialPrograms.pro index c3c8376380..ed83dfcea4 100644 --- a/SerialPrograms/SerialPrograms.pro +++ b/SerialPrograms/SerialPrograms.pro @@ -674,7 +674,7 @@ SOURCES += \ Source/PokemonLA/Resources/PokemonLA_PokemonSprites.cpp \ Source/PokemonLA/Resources/PokemonLA_WeatherAndTimeIcons.cpp \ Source/PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.cpp \ - Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp \ + Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemFarmer.cpp \ Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.cpp \ Source/PokemonLGPE/Programs/PokemonLGPE_GameEntry.cpp \ Source/PokemonLGPE/PokemonLGPE_Panels.cpp \ @@ -1865,7 +1865,7 @@ HEADERS += \ Source/PokemonLA/Resources/PokemonLA_PokemonSprites.h \ Source/PokemonLA/Resources/PokemonLA_WeatherAndTimeIcons.h \ Source/PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.h \ - Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h \ + Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemFarmer.h \ Source/PokemonLGPE/Programs/ShinyHunting/PokemonLGPE_AlolanTrade.h \ Source/PokemonLGPE/Programs/PokemonLGPE_GameEntry.h \ Source/PokemonLGPE/PokemonLGPE_Panels.h \ diff --git a/SerialPrograms/Source/PokemonLGPE/PokemonLGPE_Panels.cpp b/SerialPrograms/Source/PokemonLGPE/PokemonLGPE_Panels.cpp index 374b8a66b7..4f031207b4 100644 --- a/SerialPrograms/Source/PokemonLGPE/PokemonLGPE_Panels.cpp +++ b/SerialPrograms/Source/PokemonLGPE/PokemonLGPE_Panels.cpp @@ -9,7 +9,7 @@ #include "PokemonLGPE_Panels.h" #include "PokemonLGPE_Settings.h" -#include "Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h" +#include "Programs/Farming/PokemonLGPE_DailyItemFarmer.h" #include "Programs/ShinyHunting/PokemonLGPE_AlolanTrade.h" namespace PokemonAutomation{ @@ -27,7 +27,7 @@ std::vector PanelListFactory::make_panels() const{ ret.emplace_back(make_settings()); ret.emplace_back("---- General ----"); - ret.emplace_back(make_single_switch_program()); + ret.emplace_back(make_single_switch_program()); ret.emplace_back("---- Shiny Hunting ----"); ret.emplace_back(make_single_switch_program()); diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemFarmer.cpp similarity index 90% rename from SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp rename to SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemFarmer.cpp index c883c14fc6..8bb7bb6255 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.cpp +++ b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemFarmer.cpp @@ -1,4 +1,4 @@ -/* LGPE Daily Item Respawn Farmer +/* LGPE Daily Item Farmer * * From: https://github.com/PokemonAutomation/ * @@ -21,16 +21,16 @@ #include "PokemonLGPE/Inference/PokemonLGPE_ShinySymbolDetector.h" #include "PokemonLGPE/Programs/PokemonLGPE_GameEntry.h" #include "PokemonSwSh/Commands/PokemonSwSh_Commands_DateSpam.h" -#include "PokemonLGPE_DailyItemRespawnFarmer.h" +#include "PokemonLGPE_DailyItemFarmer.h" namespace PokemonAutomation{ namespace NintendoSwitch{ namespace PokemonLGPE{ -DailyItemRespawnFarmer_Descriptor::DailyItemRespawnFarmer_Descriptor() +DailyItemFarmer_Descriptor::DailyItemFarmer_Descriptor() : SingleSwitchProgramDescriptor( - "PokemonLGPE:DailyItemRespawnFarmer", - Pokemon::STRING_POKEMON + " LGPE", "Daily Item Respawn Farmer", + "PokemonLGPE:DailyItemFarmer", + Pokemon::STRING_POKEMON + " LGPE", "Daily Item Farmer", "", "Farm daily item respawns (ex. fossils) by date-skipping.", FeedbackType::NONE, @@ -40,7 +40,7 @@ DailyItemRespawnFarmer_Descriptor::DailyItemRespawnFarmer_Descriptor() ) {} -struct DailyItemRespawnFarmer_Descriptor::Stats : public StatsTracker{ +struct DailyItemFarmer_Descriptor::Stats : public StatsTracker{ Stats() : skips(m_stats["Skips"]) { @@ -48,11 +48,11 @@ struct DailyItemRespawnFarmer_Descriptor::Stats : public StatsTracker{ } std::atomic& skips; }; -std::unique_ptr DailyItemRespawnFarmer_Descriptor::make_stats() const{ +std::unique_ptr DailyItemFarmer_Descriptor::make_stats() const{ return std::unique_ptr(new Stats()); } -DailyItemRespawnFarmer::DailyItemRespawnFarmer() +DailyItemFarmer::DailyItemFarmer() : ATTEMPTS( "Number of attempts:", LockMode::LOCK_WHILE_RUNNING, @@ -93,10 +93,10 @@ DailyItemRespawnFarmer::DailyItemRespawnFarmer() PA_ADD_OPTION(NOTIFICATIONS); } -void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, CancellableScope& scope){ +void DailyItemFarmer::program(SingleSwitchProgramEnvironment& env, CancellableScope& scope){ JoyconContext context(scope, env.console.controller()); assert_16_9_720p_min(env.logger(), env.console); - DailyItemRespawnFarmer_Descriptor::Stats& stats = env.current_stats(); + DailyItemFarmer_Descriptor::Stats& stats = env.current_stats(); /* Stand in front of the fossil spawn near Mewtwo. * Use a repel to keep wild encounters away. @@ -197,9 +197,9 @@ void DailyItemRespawnFarmer::program(SingleSwitchProgramEnvironment& env, Cancel if (FIX_TIME_WHEN_DONE){ pbf_press_button(context, BUTTON_HOME, 80ms, 1000ms); home_to_date_time(context, false); - pbf_press_button(context, BUTTON_A, 30ms, 50ms); - context.wait_for_all_requests(); - pbf_press_button(context, BUTTON_A, 30ms, 50ms); + pbf_press_button(context, BUTTON_A, 50ms, 500ms); + pbf_press_button(context, BUTTON_A, 50ms, 500ms); + pbf_wait(context, 100ms); context.wait_for_all_requests(); pbf_press_button(context, BUTTON_HOME, 160ms, ConsoleSettings::instance().SETTINGS_TO_HOME_DELAY0); resume_game_from_home(env.console, context); diff --git a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemFarmer.h similarity index 75% rename from SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h rename to SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemFarmer.h index dc9f771794..69aafd4acb 100644 --- a/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemRespawnFarmer.h +++ b/SerialPrograms/Source/PokemonLGPE/Programs/Farming/PokemonLGPE_DailyItemFarmer.h @@ -1,11 +1,11 @@ -/* LGPE Daily Item Respawn Farmer +/* LGPE Daily Item Farmer * * From: https://github.com/PokemonAutomation/ * */ -#ifndef PokemonAutomation_PokemonLGPE_DailyItemRespawnFarmer_H -#define PokemonAutomation_PokemonLGPE_DailyItemRespawnFarmer_H +#ifndef PokemonAutomation_PokemonLGPE_DailyItemFarmer_H +#define PokemonAutomation_PokemonLGPE_DailyItemFarmer_H #include "NintendoSwitch/Controllers/NintendoSwitch_Joycon.h" #include "NintendoSwitch/NintendoSwitch_SingleSwitchProgram.h" @@ -17,16 +17,16 @@ namespace PokemonAutomation{ namespace NintendoSwitch{ namespace PokemonLGPE{ -class DailyItemRespawnFarmer_Descriptor : public SingleSwitchProgramDescriptor{ +class DailyItemFarmer_Descriptor : public SingleSwitchProgramDescriptor{ public: - DailyItemRespawnFarmer_Descriptor(); + DailyItemFarmer_Descriptor(); struct Stats; virtual std::unique_ptr make_stats() const override; }; -class DailyItemRespawnFarmer : public SingleSwitchProgramInstance{ +class DailyItemFarmer : public SingleSwitchProgramInstance{ public: - DailyItemRespawnFarmer(); + DailyItemFarmer(); virtual void program(SingleSwitchProgramEnvironment& env, CancellableScope& scope) override; private: