From d8c12cdba2141339236880c6f1ba75fc7e54c9d4 Mon Sep 17 00:00:00 2001 From: Chun Yang Date: Mon, 10 Nov 2025 20:01:11 -0600 Subject: [PATCH 1/2] Fix talent stage&main page button matching --- automation/afkj_automation.py | 253 +++++++++++++++++++--------- img/buttons/p_challenge.png | Bin 0 -> 39055 bytes img/buttons/records.png | Bin 7398 -> 13334 bytes interaction/emulator_interaction.py | 33 +++- metadata/afkj_metadata.py | 2 +- 5 files changed, 203 insertions(+), 85 deletions(-) create mode 100644 img/buttons/p_challenge.png diff --git a/automation/afkj_automation.py b/automation/afkj_automation.py index ea9740d..2add8a1 100644 --- a/automation/afkj_automation.py +++ b/automation/afkj_automation.py @@ -1129,50 +1129,76 @@ def formation_handler( formation_number (int): The formation number to load. Defaults to 1. already_open (bool): Whether the formations menu is already open. Defaults to False. """ - if self.metadata.load_formations is False: - self.logger.info("Formation loading disabled") - return + try: + if self.metadata.load_formations is False: + self.logger.info("Formation loading disabled") + return + + if self.metadata.formation > 7: + self.logger.info( + "Formation selected higher than 7, starting from 1 again.." + ) + self.metadata.formation = 1 - if self.metadata.formation > 7: self.logger.info( - "Formation selected higher than 7, starting from 1 again.." + "Loading formation #" + str(math.trunc(self.metadata.formation)) ) - self.metadata.formation = 1 - - self.logger.info( - "Loading formation #" + str(math.trunc(self.metadata.formation)) - ) - counter = 1 - unowned_counter = 0 - self.wait() - if already_open is False: # Sometimes we're already in the formations menu - self.click("buttons/records", seconds=3) - while counter != formation_number: - self.click_xy(1000, 1025) - counter += 1 - - self.click("buttons/copy", seconds=2) - # Handle 'Hero not owned' popup - if self.is_visible("labels/not_owned"): - while self.is_visible( - "labels/not_owned" - ): # Try next formation and check again - self.logger.info("Hero/Artifact not owned, trying next formation..") - self.click_xy(360, 1250) + counter = 1 + unowned_counter = 0 + self.wait() + + if already_open is False: # Sometimes we're already in the formations menu + # Try multiple regions to find records button + records_regions = [ + self.metadata.regions["bottom_buttons"], + (0, 1600, 1080, 320), + ] + records_clicked = False + for region in records_regions: + if self.is_visible("buttons/records", region=region, seconds=0, retry=5, confidence=0.5, click=True): + records_clicked = True + break + if not records_clicked: + self.click("buttons/records", seconds=3) + self.wait(3) + + while counter != formation_number: self.click_xy(1000, 1025) - self.click("buttons/copy") - self.metadata.formation += 1 - unowned_counter += 1 - if unowned_counter > 7: - self.logger.info("All formations contained an unowned hero!") - self.click_location( - "neutral" - ) # Close windows back to battle screen - self.click_location( - "neutral" - ) # Close windows back to battle screen - break - self.click("buttons/confirm", suppress=True, seconds=0) + counter += 1 + self.wait(0.5) # Small wait between clicks + + if not self.is_visible("buttons/copy", seconds=0, retry=5, click=True): + self.click("buttons/copy", seconds=2) + + self.wait(1) # Wait for any popups + + # Handle 'Hero not owned' popup + if self.is_visible("labels/not_owned", seconds=0, retry=1): + while self.is_visible( + "labels/not_owned", + seconds=0, + retry=1, + ): # Try next formation and check again + self.logger.info("Hero/Artifact not owned, trying next formation..") + self.click_xy(360, 1250) + self.click_xy(1000, 1025) + self.click("buttons/copy") + self.metadata.formation += 1 + unowned_counter += 1 + if unowned_counter > 7: + self.logger.info("All formations contained an unowned hero!") + self.click_location("neutral") + self.click_location("neutral") + break + + # Note: In updated UI, there's no confirm button after copy - formation is loaded directly + self.wait(1) + self.click_location("neutral") + self.wait(0.5) + except Exception as e: + self.logger.error(f"Error in formation_handler: {e}", exc_info=True) + self.save_screenshot("formation_handler_error") + raise def blind_push( self, @@ -1510,12 +1536,21 @@ def blind_push( # For pushing afk stages if mode == "afkstages": timeout = 0 - if self.is_visible( - "buttons/records", - region=self.metadata.regions["bottom_buttons"], - seconds=0, - retry=20, - ): + + # Try multiple regions to detect AFK Stages screen + records_regions = [ + (self.metadata.regions["bottom_buttons"], 20), + ((0, 1600, 1080, 320), 10), + ((600, 600, 480, 400), 10), + ((0, 0, 1080, 1920), 5), + ] + records_found = False + for region, retries in records_regions: + if self.is_visible("buttons/records", region=region, seconds=0, retry=retries, confidence=0.5): + records_found = True + break + + if records_found: # Change formation if we we beat the 2nd round or have defeat >10 times in a row if ( @@ -1547,8 +1582,6 @@ def blind_push( elif load_formation is True: self.formation_handler(self.metadata.formation) - # Season 3 single stage code - # Start Battle self.click( "buttons/battle", @@ -1562,39 +1595,81 @@ def blind_push( ) # Long wait to stop false positives from the back button on the battle selection screen # Wait til we see the back button in the post battle screen before running next checks - while not self.is_visible( - "buttons/back", - region=self.metadata.regions["bottom_buttons"], - seconds=2, - ): + self.logger.info("Waiting for battle to finish (looking for 'buttons/back')...") + timeout = 0 + back_found = False + while not back_found: + back_found = self.is_visible( + "buttons/back", + region=self.metadata.regions["bottom_buttons"], + seconds=2, + retry=1, + ) + if back_found: + self.logger.info("Back button found, battle finished!") + break + timeout += 1 + if ( timeout > 30 ): # If nothing at 30 seconds start clicking in case battery saver mode is active + self.logger.debug("Timeout reached, clicking neutral location...") self.click_location("neutral") if ( timeout > 60 ): # Still nothing at 60 seconds? Quit as somethings gone wrong - self.logger.info("Battle timeout error!") + self.logger.error("Battle timeout error! Could not detect battle completion after 60 seconds.") + self.save_screenshot("battle_timeout_error") break # Post battle screen detection result = "" - while result == "": - # Loop the different scenarios until we get an image match ('retry' is defeat, 'battle' is normal stage victory, 'talent_trials' is talent stage victory) - images = [ - "buttons/retry", - "buttons/battle", - "buttons/talent_trials", - ] - result = self.is_visible_array( - images, - confidence=0.9, - seconds=0, - retry=1, - click=True, - region=self.metadata.regions["bottom_buttons"], - ) + result_timeout = 0 + max_result_timeout = 20 # Maximum 20 attempts (40 seconds) + + images = ["buttons/retry", "buttons/battle", "buttons/talent_trials", "buttons/p_challenge"] + search_regions = [ + (0, 1500, 1080, 420), + self.metadata.regions["bottom_buttons"], + (0, 0, 1080, 1920), + ] + + while result == "" and result_timeout < max_result_timeout: + for region in search_regions: + result = self.is_visible_array( + images, + seconds=0, + retry=1, + click=True, + region=region, + ) + + if result != "" and result != "not_found": + break + + if result == "not_found" or result == "": + result = "" # Reset to continue loop + result_timeout += 1 + self.wait(2) + else: + break + + if result == "" or result == "not_found": + self.logger.error("Could not detect battle result! Trying individual button detection...") + self.save_screenshot("battle_result_detection_error") + + # Try individual button detection + buttons_to_check = ["buttons/retry", "buttons/battle", "buttons/talent_trials", "buttons/p_challenge"] + for btn in buttons_to_check: + if self.is_visible(btn, seconds=0, retry=1, region=(0, 0, 1080, 1920)): + result = btn + break + + if result == "" or result == "not_found": + self.logger.error("Could not detect any battle result button. Exiting...") + self.logger.error("Please check the screenshot: battle_result_detection_error.png") + return # Retry button indicates defeat, we run the defeat logic if result == "buttons/retry": @@ -1604,17 +1679,40 @@ def blind_push( ) self.blind_push("afkstages", load_formation=False) - # The other two mean we have a victory - elif result == "buttons/battle" or result == "buttons/talent_trials": + # Victory buttons: battle, talent_trials, or p_challenge + elif result == "buttons/battle" or result == "buttons/talent_trials" or result == "buttons/p_challenge": self.metadata.stage_defeats = 0 # Reset defeats self.metadata.formation = 1 # Reset formation self.logger.info("Victory! Stage passed\n") self.metadata.first_stage_won = False self.blind_push("afkstages", load_formation=True) - else: - self.logger.info("Something went wrong opening AFK Stages!") + if not records_found: + self.logger.error( + "Failed to detect AFK Stages screen! " + "Expected 'buttons/records' button not found after multiple search attempts. " + "This usually means the stage selection screen did not open correctly." + ) + self.logger.debug( + "Searched for 'buttons/records' in: " + f"1. bottom_buttons region: {self.metadata.regions['bottom_buttons']}, " + f"2. extended region: (0, 1500, 1080, 420), " + f"3. full screen: (0, 0, 1080, 1920)" + ) + self.logger.info("Checking if we're on a different screen...") + + # Try to detect what screen we're actually on + if self.is_visible("labels/sunandstars", region=self.metadata.regions["sunandstars"], seconds=0, retry=1): + self.logger.warning("Detected main screen instead of AFK Stages screen. Stage selection may have failed.") + elif self.is_visible("buttons/back", region=self.metadata.regions["bottom_buttons"], seconds=0, retry=1): + self.logger.warning("Detected back button but not records button. May be on wrong screen.") + self.save_screenshot("afk_stage_error") - self.recover() + self.logger.info("Attempting to recover to main screen...") + recovery_result = self.recover() + if recovery_result: + self.logger.info("Recovery successful, returned to main screen") + else: + self.logger.error("Recovery failed, could not return to main screen") def open_afk_stages(self, afkstages: bool = True) -> None: """Opens the AFK or Talent Stages based on the provided flag. @@ -1627,6 +1725,8 @@ def open_afk_stages(self, afkstages: bool = True) -> None: afkstages (bool): If True, opens the standard AFK Stages. If False, opens the Talent Stages. """ + stage_type = "AFK Stages" if afkstages else "Talent Stages" + # Open afk stage screen without prompting loot if it's >1h uncollected self.click_xy(450, 1825, seconds=3) self.click( @@ -1650,8 +1750,11 @@ def open_afk_stages(self, afkstages: bool = True) -> None: + str(self.config.getint("PUSHING", "defeat_limit")) + " defeats\n" ) - self.click_xy(370, 1600, seconds=2) # AFK Stage button + self.click_xy(370, 1600, seconds=2) # Talent Stage button self.click("buttons/confirm", suppress=True) + + # Give the screen time to load after clicking + self.wait(2) def afk_stage_chain_proxy(self) -> None: """Starts an AFK Stage chain by attempting to start the stage and then diff --git a/img/buttons/p_challenge.png b/img/buttons/p_challenge.png new file mode 100644 index 0000000000000000000000000000000000000000..6e60b8bc60c52e84776686294892787658ee8da7 GIT binary patch literal 39055 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%0AiS`=;sj%J+Zl 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 R@LQf|%JLd=wKDI+{s$9>lA-_r literal 7398 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 bool: """ timer: int = 0 - if self.is_visible("labels/sunandstars", region=(770, 40, 100, 100)): + if self.is_visible("labels/sunandstars", region=(950, 220, 150, 120)): return True + self.logger.info(f"Attempting to recover to main screen (max {count} attempts)") while timer < count: self.click("buttons/back", suppress=True) self.click("buttons/back2", suppress=True) self.click_location("neutral") timer += 1 - if self.is_visible("labels/sunandstars", region=(770, 40, 100, 100)): + if self.is_visible("labels/sunandstars", region=(950, 220, 150, 120)): + self.logger.info(f"Recovery successful after {timer} attempt(s)") return True timestamp: str = datetime.now().strftime("%d-%m-%y_%H-%M-%S") + self.logger.error( + f"Recovery failed after {count} attempts. " + f"Could not detect main screen (looking for 'labels/sunandstars'). " + f"Saving screenshot: recovery_timeout_{timestamp}" + ) self.save_screenshot("recovery_timeout_" + timestamp) return False @@ -591,17 +598,25 @@ def safe_open_and_close(self, name: str, state: str) -> Union[None, Literal[True """ # We call this at the start and end of every activity to make sure we are back at the main map screen, if not we are lost and exit if state == "open": - self.logger.debug("opening task " + name) - if self.recover() is True: - self.logger.debug(name + " opened successfully!") + self.logger.debug("Opening task: " + name) + recovery_result = self.recover() + if recovery_result is True: + self.logger.debug(name + " opened successfully - confirmed on main screen") else: - self.logger.info("Issue opening " + name) + self.logger.warning( + f"Issue opening {name}: Could not confirm we are on main screen. " + "Recovery process failed. Task may not start correctly." + ) if state == "close": - if self.recover() is True: - self.logger.debug(name + " completed successfully!") + recovery_result = self.recover() + if recovery_result is True: + self.logger.debug(name + " completed successfully - confirmed on main screen") return True else: timestamp: str = datetime.now().strftime("%d-%m-%y_%H-%M-%S") self.save_screenshot(name + "_close_error_" + timestamp) - self.logger.info("Issue closing " + name + ".") + self.logger.warning( + f"Issue closing {name}: Could not confirm we are on main screen. " + f"Recovery process failed. Screenshot saved: {name}_close_error_{timestamp}" + ) diff --git a/metadata/afkj_metadata.py b/metadata/afkj_metadata.py index 6aeb1c8..99cab14 100644 --- a/metadata/afkj_metadata.py +++ b/metadata/afkj_metadata.py @@ -28,7 +28,7 @@ def __init__(self, server: str) -> None: # Quick storage for commonly used regions self.regions: dict[str, tuple[int, int, int, int]] = { # locate - "sunandstars": (770, 40, 100, 100), + "sunandstars": (950, 220, 150, 120), "main_menu": (900, 1750, 150, 150), "menu_activities": (20, 950, 1050, 800), "back": (50, 1750, 150, 150), From dda26ce5bebb942a8f709905ca635c7354ab3792 Mon Sep 17 00:00:00 2001 From: Chun Yang Date: Mon, 10 Nov 2025 20:07:56 -0600 Subject: [PATCH 2/2] fix timout 1 --- automation/afkj_automation.py | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/automation/afkj_automation.py b/automation/afkj_automation.py index 2add8a1..73f1c9b 100644 --- a/automation/afkj_automation.py +++ b/automation/afkj_automation.py @@ -1595,31 +1595,16 @@ def blind_push( ) # Long wait to stop false positives from the back button on the battle selection screen # Wait til we see the back button in the post battle screen before running next checks - self.logger.info("Waiting for battle to finish (looking for 'buttons/back')...") timeout = 0 - back_found = False - while not back_found: - back_found = self.is_visible( - "buttons/back", - region=self.metadata.regions["bottom_buttons"], - seconds=2, - retry=1, - ) - if back_found: - self.logger.info("Back button found, battle finished!") - break - + while not self.is_visible( + "buttons/back", + region=self.metadata.regions["bottom_buttons"], + seconds=2, + retry=1, + ): timeout += 1 - - if ( - timeout > 30 - ): # If nothing at 30 seconds start clicking in case battery saver mode is active - self.logger.debug("Timeout reached, clicking neutral location...") - self.click_location("neutral") - if ( - timeout > 60 - ): # Still nothing at 60 seconds? Quit as somethings gone wrong - self.logger.error("Battle timeout error! Could not detect battle completion after 60 seconds.") + if timeout > 45: # Battle is 90 seconds, if still not done, something went wrong + self.logger.error("Battle timeout error! Could not detect battle completion after 90 seconds.") self.save_screenshot("battle_timeout_error") break