Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,20 @@ MoneyFarmerRoute210::MoneyFarmerRoute210()
, MON1_MOVE2_PP("<b>2nd " + STRING_POKEMON + " Move 2 PP:</b><br>Set to zero to not use this move.", LockMode::LOCK_WHILE_RUNNING, 5, 0, 64)
, MON1_MOVE3_PP("<b>2nd " + STRING_POKEMON + " Move 3 PP:</b><br>Set to zero to not use this move.", LockMode::LOCK_WHILE_RUNNING, 5, 0, 64)
, MON1_MOVE4_PP("<b>2nd " + STRING_POKEMON + " Move 4 PP:</b><br>Set to zero to not use this move.", LockMode::LOCK_WHILE_RUNNING, 5, 0, 64)
, PICKUP_SLOT1(
"<b>" + STRING_POKEMON + " in slot 1 has the Pickup ability</b>", LockMode::LOCK_WHILE_RUNNING, false)
, PICKUP_SLOT2(
"<b>" + STRING_POKEMON + " in slot 2 has the Pickup ability</b>", LockMode::LOCK_WHILE_RUNNING, false)
, PICKUP_SLOT3(
"<b>" + STRING_POKEMON + " in slot 3 has the Pickup ability</b>", LockMode::LOCK_WHILE_RUNNING, false)
, PICKUP_SLOT4(
"<b>" + STRING_POKEMON + " in slot 4 has the Pickup ability</b>", LockMode::LOCK_WHILE_RUNNING, false)
, PICKUP_SLOT5(
"<b>" + STRING_POKEMON + " in slot 5 has the Pickup ability</b>", LockMode::LOCK_WHILE_RUNNING, false)
, PICKUP_SLOT6(
"<b>" + STRING_POKEMON + " in slot 6 has the Pickup ability</b>", LockMode::LOCK_WHILE_RUNNING, false)
, CHECK_PICKUP_FREQ (
"<b>Check " + STRING_POKEMON + " with the Pickup ability every this many battles</b>", LockMode::LOCK_WHILE_RUNNING, 10, 1, 100)
, NOTIFICATION_STATUS_UPDATE("Status Update", true, false, std::chrono::seconds(3600))
, NOTIFICATIONS({
&NOTIFICATION_STATUS_UPDATE,
Expand All @@ -106,6 +120,13 @@ MoneyFarmerRoute210::MoneyFarmerRoute210()
PA_ADD_OPTION(MON1_MOVE2_PP);
PA_ADD_OPTION(MON1_MOVE3_PP);
PA_ADD_OPTION(MON1_MOVE4_PP);
PA_ADD_OPTION(PICKUP_SLOT1);
PA_ADD_OPTION(PICKUP_SLOT2);
PA_ADD_OPTION(PICKUP_SLOT3);
PA_ADD_OPTION(PICKUP_SLOT4);
PA_ADD_OPTION(PICKUP_SLOT5);
PA_ADD_OPTION(PICKUP_SLOT6);
PA_ADD_OPTION(CHECK_PICKUP_FREQ);
PA_ADD_OPTION(NOTIFICATIONS);
}

Expand Down Expand Up @@ -145,6 +166,7 @@ bool MoneyFarmerRoute210::battle(SingleSwitchProgramEnvironment& env, ProControl

// State Machine
// We need lots of loops in case the party pokemon need to learn lots of moves.

while (true){
context.wait_for_all_requests();

Expand All @@ -162,8 +184,10 @@ bool MoneyFarmerRoute210::battle(SingleSwitchProgramEnvironment& env, ProControl
{learn_move},
}
);


switch (ret){
case 0:
case 0:
env.log("Battle menu detected!", COLOR_BLUE);
battle_menu_seen = true;

Expand Down Expand Up @@ -245,6 +269,51 @@ bool MoneyFarmerRoute210::battle(SingleSwitchProgramEnvironment& env, ProControl
);
}

void MoneyFarmerRoute210::check_pickup_items(
ProControllerContext& context, const bool pickup_slots[6]
){

// Open menu
pbf_press_button(context, BUTTON_X, 80ms, 1000ms);

// Open Pokemon menu
pbf_press_button(context, BUTTON_A, 80ms, 1000ms);

// Loop over each pokemon that has Pickup according to the settings
int current_slot = 0;

for (int slot = 0; slot < 6; slot++) {
if (pickup_slots[slot]) {
int presses = slot - current_slot;
for (int i = 0; i < presses; i++) {
pbf_wait(context, 50ms);
pbf_press_dpad(context, DPAD_DOWN, 80ms, 50ms);
}

// Select mon, go to held items, go to put into bag (or back if the mon has no item), then exit with B
pbf_press_button(context, BUTTON_A, 80ms, 200ms);

pbf_press_dpad(context, DPAD_UP, 80ms, 50ms);
pbf_press_dpad(context, DPAD_UP, 80ms, 50ms);
pbf_press_button(context, BUTTON_A, 80ms, 200ms);

pbf_press_dpad(context, DPAD_UP, 80ms, 50ms);
pbf_press_dpad(context, DPAD_UP, 80ms, 50ms);
pbf_press_dpad(context, DPAD_UP, 80ms, 50ms);
pbf_press_button(context, BUTTON_A, 80ms, 200ms);
pbf_wait(context, 1000ms);

pbf_press_button(context, BUTTON_B, 80ms, 100ms);

current_slot = slot;
pbf_wait(context, 150ms);
}
};

// Exit the screen
pbf_mash_button(context, BUTTON_B, 2000ms);
}

void MoneyFarmerRoute210::heal_at_center_and_return(
Logger& logger, ProControllerContext& context,
uint8_t pp0[4], uint8_t pp1[4]
Expand Down Expand Up @@ -354,6 +423,21 @@ void MoneyFarmerRoute210::program(SingleSwitchProgramEnvironment& env, ProContro
MON1_MOVE3_PP,
MON1_MOVE4_PP,
};

// Transform the slots selected as having mons with the Pickup ability into an array
bool pickup_slots_selected[6] = {
PICKUP_SLOT1,
PICKUP_SLOT2,
PICKUP_SLOT3,
PICKUP_SLOT4,
PICKUP_SLOT5,
PICKUP_SLOT6,
};

bool has_pickup_mons = PICKUP_SLOT1 || PICKUP_SLOT2 || PICKUP_SLOT3 || PICKUP_SLOT4 || PICKUP_SLOT5 || PICKUP_SLOT6;

uint32_t pickup_counter = 0;
uint32_t total_pickup_checks = 0;

// Connect the controller.
pbf_press_button(context, BUTTON_B, 40ms, 40ms);
Expand All @@ -373,6 +457,11 @@ void MoneyFarmerRoute210::program(SingleSwitchProgramEnvironment& env, ProContro
env.update_stats();

send_program_status_notification(env, NOTIFICATION_STATUS_UPDATE);

if (has_pickup_mons && pickup_counter % CHECK_PICKUP_FREQ.current_value() == 0 && pickup_counter != total_pickup_checks) {
check_pickup_items(context, pickup_slots_selected);
total_pickup_checks = pickup_counter;
}

if (need_to_charge){
pbf_move_left_joystick(context, {+1, 0}, 1120ms, 0ms);
Expand Down Expand Up @@ -416,6 +505,8 @@ void MoneyFarmerRoute210::program(SingleSwitchProgramEnvironment& env, ProContro
if (this->battle(env, context, pp0, pp1)){
return;
}
pickup_counter++;

if (!has_pp(pp0, pp1)){
need_to_charge = heal_after_battle_and_return(env, env.console, context, pp0, pp1);
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#define PokemonAutomation_PokemonBDSP_MoneyFarmerRoute210_H

#include "Common/Cpp/Options/SimpleIntegerOption.h"
#include "Common/Cpp/Options/BooleanCheckBoxOption.h"
#include "Common/Cpp/Options/EnumDropdownOption.h"
#include "CommonFramework/Notifications/EventNotificationsTable.h"
#include "NintendoSwitch/NintendoSwitch_SingleSwitchProgram.h"
Expand Down Expand Up @@ -36,6 +37,11 @@ class MoneyFarmerRoute210 : public SingleSwitchProgramInstance{
private:
// Run the battle loop. Return true if the program should stop.
bool battle(SingleSwitchProgramEnvironment& env, ProControllerContext& context, uint8_t pp0[4], uint8_t pp1[4]);
// Check for items generated through the Pickup ability
void check_pickup_items(
ProControllerContext& context,
const bool pickup_slots_selected[6]
);
// From the bottom row of the Ace Trainer pair, heal Pokemon and return.
// Return true if VS Seeker needs charging.
bool heal_after_battle_and_return(
Expand Down Expand Up @@ -81,6 +87,15 @@ class MoneyFarmerRoute210 : public SingleSwitchProgramInstance{
SimpleIntegerOption<uint8_t> MON1_MOVE2_PP;
SimpleIntegerOption<uint8_t> MON1_MOVE3_PP;
SimpleIntegerOption<uint8_t> MON1_MOVE4_PP;

BooleanCheckBoxOption PICKUP_SLOT1;
BooleanCheckBoxOption PICKUP_SLOT2;
BooleanCheckBoxOption PICKUP_SLOT3;
BooleanCheckBoxOption PICKUP_SLOT4;
BooleanCheckBoxOption PICKUP_SLOT5;
BooleanCheckBoxOption PICKUP_SLOT6;

SimpleIntegerOption<uint8_t> CHECK_PICKUP_FREQ;

EventNotificationOption NOTIFICATION_STATUS_UPDATE;
EventNotificationsOption NOTIFICATIONS;
Expand Down