diff --git a/SerialPrograms/Source/PokemonLZA/Inference/Map/PokemonLZA_MapIconDetector.cpp b/SerialPrograms/Source/PokemonLZA/Inference/Map/PokemonLZA_MapIconDetector.cpp
index c31881a5e..7cf9024fd 100644
--- a/SerialPrograms/Source/PokemonLZA/Inference/Map/PokemonLZA_MapIconDetector.cpp
+++ b/SerialPrograms/Source/PokemonLZA/Inference/Map/PokemonLZA_MapIconDetector.cpp
@@ -161,6 +161,83 @@ const MapIconMatcher& MapIcon_BattleZone(){
return ret;
}
+const MapIconMatcher& MapIcon_HyperspaceBattleZone(){
+ static MapIconMatcher ret(
+ "PokemonLZA/MapIcons/HyperspaceBattleZone.png",
+ "HyperspaceBattleZone",
+ Color(0xff000000),
+ Color(0xffFB257D),
+ 100,
+ 100.0,
+ {
+ {0xff000000, 0xffFB257D},
+ }
+ );
+ return ret;
+}
+
+const MapIconMatcher& MapIcon_HyperspaceWildZone(){
+ static MapIconMatcher ret(
+ "PokemonLZA/MapIcons/HyperspaceWildZone.png",
+ "HyperspaceWildZone",
+ Color(0xff000000),
+ Color(0xffAED635),
+ 100,
+ 100.0,
+ {
+ {0xff000000, 0xffAED635},
+ }
+ );
+ return ret;
+}
+
+/*
+const MapIconMatcher& MapIcon_HyperspaceEntryQuest(){
+ static MapIconMatcher ret(
+ "PokemonLZA/MapIcons/HyperspaceEntryQuest.png",
+ "HyperspaceEntryWild",
+ Color(0xff000000),
+ Color(0xffFFFFDD),
+ 100,
+ 100.0,
+ {
+ {0xff000000, 0xffFFFFDD},
+ }
+ );
+ return ret;
+}
+*/
+
+const MapIconMatcher& MapIcon_HyperspaceEntryWild(){
+ static MapIconMatcher ret(
+ "PokemonLZA/MapIcons/HyperspaceEntryWild.png",
+ "HyperspaceEntryWild",
+ Color(0xff000000),
+ Color(0xffAED635),
+ 100,
+ 100.0,
+ {
+ {0xff000000, 0xffAED635},
+ }
+ );
+ return ret;
+}
+
+const MapIconMatcher& MapIcon_HyperspaceEntryBattle(){
+ static MapIconMatcher ret(
+ "PokemonLZA/MapIcons/HyperspaceEntryBattle.png",
+ "HyperspaceEntryWild",
+ Color(0xff000000),
+ Color(0xffFB257D),
+ 100,
+ 100.0,
+ {
+ {0xff000000, 0xffFB257D},
+ }
+ );
+ return ret;
+}
+
const MapIconMatcher& get_map_icon_matcher(MapIconType icon){
switch (icon){
case MapIconType::PokemonCenter:
@@ -177,6 +254,14 @@ const MapIconMatcher& get_map_icon_matcher(MapIconType icon){
return MapIcon_WildZoneFlyable();
case MapIconType::BattleZone:
return MapIcon_BattleZone();
+ case MapIconType::HyperspaceBattleZone:
+ return MapIcon_HyperspaceBattleZone();
+ case MapIconType::HyperspaceWildZone:
+ return MapIcon_HyperspaceWildZone();
+ case MapIconType::HyperspaceEntryWild:
+ return MapIcon_HyperspaceEntryWild();
+ case MapIconType::HyperspaceEntryBattle:
+ return MapIcon_HyperspaceEntryBattle();
default:
throw InternalProgramError(
nullptr, PA_CURRENT_FUNCTION,
@@ -207,6 +292,14 @@ const char* map_icon_type_to_string(MapIconType type){
return "WildZoneFlyable";
case MapIconType::BattleZone:
return "BattleZone";
+ case MapIconType::HyperspaceBattleZone:
+ return "HyperspaceBattleZone";
+ case MapIconType::HyperspaceWildZone:
+ return "HyperspaceWildZone";
+ case MapIconType::HyperspaceEntryWild:
+ return "HyperspaceEntryWild";
+ case MapIconType::HyperspaceEntryBattle:
+ return "HyperspaceEntryBattle";
default:
throw InternalProgramError(
nullptr, PA_CURRENT_FUNCTION,
@@ -226,6 +319,10 @@ MapIconType string_to_map_icon_type(const std::string& str){
if (str == "WildZone") return MapIconType::WildZone;
if (str == "WildZoneFlyable") return MapIconType::WildZoneFlyable;
if (str == "BattleZone") return MapIconType::BattleZone;
+ if (str == "HyperspaceBattleZone") return MapIconType::HyperspaceBattleZone;
+ if (str == "HyperspaceWildZone") return MapIconType::HyperspaceWildZone;
+ if (str == "HyperspaceEntryWild") return MapIconType::HyperspaceEntryWild;
+ if (str == "HyperspaceEntryBattle") return MapIconType::HyperspaceEntryBattle;
throw InternalProgramError(
nullptr, PA_CURRENT_FUNCTION,
"Unknown MapIconType string: " + str
diff --git a/SerialPrograms/Source/PokemonLZA/Inference/Map/PokemonLZA_MapIconDetector.h b/SerialPrograms/Source/PokemonLZA/Inference/Map/PokemonLZA_MapIconDetector.h
index 1059ed615..cf327199c 100644
--- a/SerialPrograms/Source/PokemonLZA/Inference/Map/PokemonLZA_MapIconDetector.h
+++ b/SerialPrograms/Source/PokemonLZA/Inference/Map/PokemonLZA_MapIconDetector.h
@@ -31,6 +31,10 @@ enum class MapIconType{
WildZone,
WildZoneFlyable,
BattleZone,
+ HyperspaceBattleZone, //Icon in Lumiose
+ HyperspaceWildZone, //Icon in Lumiose
+ HyperspaceEntryWild, //Icon while in Hyperspace
+ HyperspaceEntryBattle, //Icon while in Hyperspace
};
const char* map_icon_type_to_string(MapIconType type);
diff --git a/SerialPrograms/Source/PokemonLZA/Programs/PokemonLZA_BasicNavigation.cpp b/SerialPrograms/Source/PokemonLZA/Programs/PokemonLZA_BasicNavigation.cpp
index 36747da08..1b71df1f4 100644
--- a/SerialPrograms/Source/PokemonLZA/Programs/PokemonLZA_BasicNavigation.cpp
+++ b/SerialPrograms/Source/PokemonLZA/Programs/PokemonLZA_BasicNavigation.cpp
@@ -111,10 +111,15 @@ bool open_map(ConsoleHandle& console, ProControllerContext& context, bool zoom_t
MapIconDetector pokecenter_icon(COLOR_RED, MapIconType::PokemonCenter, icon_region, &console.overlay());
MapIconDetector flyable_building_icon(COLOR_BLACK, MapIconType::BuildingFlyable, icon_region, &console.overlay());
MapIconDetector flayble_cafe_icon(COLOR_ORANGE, MapIconType::CafeFlyable, icon_region, &console.overlay());
+ MapIconDetector flyable_hyperspace_battle_zone_icon(COLOR_ORANGE, MapIconType::HyperspaceBattleZone, icon_region, &console.overlay());
+ MapIconDetector flyable_hyperspace_wild_zone_icon(COLOR_ORANGE, MapIconType::HyperspaceWildZone, icon_region, &console.overlay());
+
MapWatcher map_detector(COLOR_RED, &console.overlay());
map_detector.attach_map_icon_detector(pokecenter_icon);
map_detector.attach_map_icon_detector(flyable_building_icon);
map_detector.attach_map_icon_detector(flayble_cafe_icon);
+ map_detector.attach_map_icon_detector(flyable_hyperspace_battle_zone_icon);
+ map_detector.attach_map_icon_detector(flyable_hyperspace_wild_zone_icon);
do{
map_detector.reset_state();
@@ -173,7 +178,13 @@ void open_hyperspace_map(ConsoleHandle& console, ProControllerContext& context){
WallClock deadline = current_time() + 30s;
+ const ImageFloatBox icon_region{0.0, 0.089, 1.0, 0.911};
+ MapIconDetector flyable_hyperspace_entry_wild_icon(COLOR_ORANGE, MapIconType::HyperspaceEntryWild, icon_region, &console.overlay());
+ MapIconDetector flyable_hyperspace_entry_battle_icon(COLOR_ORANGE, MapIconType::HyperspaceEntryBattle, icon_region, &console.overlay());
+
MapWatcher map_detector(COLOR_RED, &console.overlay());
+ map_detector.attach_map_icon_detector(flyable_hyperspace_entry_wild_icon);
+ map_detector.attach_map_icon_detector(flyable_hyperspace_entry_battle_icon);
do{
map_detector.reset_state();
diff --git a/SerialPrograms/Source/PokemonLZA/Programs/ShinyHunting/PokemonLZA_ShinyHunt_FlySpotReset.cpp b/SerialPrograms/Source/PokemonLZA/Programs/ShinyHunting/PokemonLZA_ShinyHunt_FlySpotReset.cpp
index 9b88d0b8a..532d313a2 100644
--- a/SerialPrograms/Source/PokemonLZA/Programs/ShinyHunting/PokemonLZA_ShinyHunt_FlySpotReset.cpp
+++ b/SerialPrograms/Source/PokemonLZA/Programs/ShinyHunting/PokemonLZA_ShinyHunt_FlySpotReset.cpp
@@ -13,6 +13,7 @@
#include "CommonTools/StartupChecks/VideoResolutionCheck.h"
#include "NintendoSwitch/Commands/NintendoSwitch_Commands_PushButtons.h"
#include "NintendoSwitch/Commands/NintendoSwitch_Commands_Superscalar.h"
+#include "NintendoSwitch/Programs/NintendoSwitch_GameEntry.h"
#include "Pokemon/Pokemon_Strings.h"
#include "PokemonLA/Inference/Sounds/PokemonLA_ShinySoundDetector.h"
#include "PokemonLZA/Programs/PokemonLZA_BasicNavigation.h"
@@ -72,6 +73,11 @@ ShinyHunt_FlySpotReset::ShinyHunt_FlySpotReset()
LockMode::LOCK_WHILE_RUNNING,
Route::NO_MOVEMENT
)
+ , NUM_RESETS(
+ "Hyperspace Resets:
Number of resets when running the Hyperspace Wild Zone route. Each fly takes about 1 Cal. of time. Make sure to leave enough time to catch found shinies.",
+ LockMode::UNLOCK_WHILE_RUNNING,
+ 100, 1
+ )
, NOTIFICATION_STATUS("Status Update", true, false, std::chrono::seconds(3600))
, NOTIFICATIONS({
&NOTIFICATION_STATUS,
@@ -83,6 +89,7 @@ ShinyHunt_FlySpotReset::ShinyHunt_FlySpotReset()
{
PA_ADD_STATIC(SHINY_REQUIRES_AUDIO);
PA_ADD_OPTION(ROUTE);
+ PA_ADD_OPTION(NUM_RESETS);
PA_ADD_OPTION(SHINY_DETECTED);
PA_ADD_OPTION(NOTIFICATIONS);
}
@@ -245,6 +252,7 @@ void ShinyHunt_FlySpotReset::program(SingleSwitchProgramEnvironment& env, ProCon
);
}
+ uint64_t num_resets = 0;
bool to_zoom_to_max = true;
run_until(
env.console, context,
@@ -254,11 +262,19 @@ void ShinyHunt_FlySpotReset::program(SingleSwitchProgramEnvironment& env, ProCon
shiny_sound_handler.process_pending(context);
route(env, context, stats, to_zoom_to_max);
to_zoom_to_max = false;
+ num_resets++;
stats.resets++;
env.update_stats();
if (stats.resets.load(std::memory_order_relaxed) % 10 == 0){
send_program_status_notification(env, NOTIFICATION_STATUS);
}
+
+ uint64_t num_resets_temp = NUM_RESETS;
+ if (ROUTE == Route::HYPERSPACE_WILD_ZONE && num_resets >= num_resets_temp){
+ env.log("Number of resets hit. Going to home to pause the game.");
+ go_home(env.console, context);
+ break;
+ }
} // end while
},
{{shiny_detector}}
diff --git a/SerialPrograms/Source/PokemonLZA/Programs/ShinyHunting/PokemonLZA_ShinyHunt_FlySpotReset.h b/SerialPrograms/Source/PokemonLZA/Programs/ShinyHunting/PokemonLZA_ShinyHunt_FlySpotReset.h
index 47f59e8e2..36367a517 100644
--- a/SerialPrograms/Source/PokemonLZA/Programs/ShinyHunting/PokemonLZA_ShinyHunt_FlySpotReset.h
+++ b/SerialPrograms/Source/PokemonLZA/Programs/ShinyHunting/PokemonLZA_ShinyHunt_FlySpotReset.h
@@ -9,6 +9,7 @@
#ifndef PokemonAutomation_PokemonLZA_ShinyHunt_FlySpotReset_H
#define PokemonAutomation_PokemonLZA_ShinyHunt_FlySpotReset_H
+#include "Common/Cpp/Options/SimpleIntegerOption.h"
#include "CommonFramework/Notifications/EventNotificationsTable.h"
#include "NintendoSwitch/NintendoSwitch_SingleSwitchProgram.h"
#include "PokemonLA/Options/PokemonLA_ShinyDetectedAction.h"
@@ -47,6 +48,7 @@ class ShinyHunt_FlySpotReset : public SingleSwitchProgramInstance{
PokemonLA::ShinyRequiresAudioText SHINY_REQUIRES_AUDIO;
ShinySoundDetectedActionOption SHINY_DETECTED;
EnumDropdownOption ROUTE;
+ SimpleIntegerOption NUM_RESETS;
EventNotificationOption NOTIFICATION_STATUS;
EventNotificationsOption NOTIFICATIONS;