diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index 767197701..905656dd2 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -65,6 +65,27 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo return False + def combat_enter_from_map(self, skip_first_screenshot=True): + """ + Pages: + in: page_main, DUNGEON_COMBAT_INTERACT + out: COMBAT_PREPARE + """ + logger.info('Combat enter from map') + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + if self.appear(COMBAT_PREPARE): + # Confirm page loaded + if self.image_color_count(COMBAT_PREPARE.button, color=(230, 230, 230), threshold=240, count=400): + logger.info(f'At {COMBAT_PREPARE}') + break + if self.handle_combat_interact(): + continue + def combat_prepare(self, team=1, support_character: str = None): """ Args: diff --git a/tasks/combat/prepare.py b/tasks/combat/prepare.py index e2f7359df..a08105496 100644 --- a/tasks/combat/prepare.py +++ b/tasks/combat/prepare.py @@ -97,9 +97,6 @@ class CombatPrepare(UI): Pages: in: COMBAT_PREPARE """ - multi = self.combat_has_multi_wave() - logger.attr('CombatMultiWave', multi) - timeout = Timer(1.5, count=6).start() while 1: if skip_first_screenshot: @@ -115,7 +112,8 @@ class CombatPrepare(UI): cost = Digit(OCR_WAVE_COST).ocr_single_line(self.device.image) if cost == 10: - if multi: + logger.attr('CombatMultiWave', self.combat_has_multi_wave()) + if self.combat_has_multi_wave(): self.combat_wave_cost = cost return cost else: @@ -123,7 +121,7 @@ class CombatPrepare(UI): self.combat_wave_cost = cost return cost elif cost in [30, 40]: - if multi: + if self.combat_has_multi_wave(): logger.warning(f'Combat wave costs {cost} but has multiple waves, ' f'probably wave amount is preset') self.combat_set_wave(1) @@ -131,13 +129,15 @@ class CombatPrepare(UI): timeout.reset() continue else: + logger.attr('CombatMultiWave', self.combat_has_multi_wave()) self.combat_wave_cost = cost return cost else: logger.warning(f'Unexpected combat wave cost: {cost}') continue - if multi: + logger.attr('CombatMultiWave', self.combat_has_multi_wave()) + if self.combat_has_multi_wave(): cost = 10 else: cost = 40 diff --git a/tasks/dungeon/dungeon.py b/tasks/dungeon/dungeon.py index 7941e3204..dfde2b113 100644 --- a/tasks/dungeon/dungeon.py +++ b/tasks/dungeon/dungeon.py @@ -32,7 +32,8 @@ class Dungeon(DungeonUI, DungeonEvent, Combat): int: Run count Pages: - in: Any + in: page_main, DUNGEON_COMBAT_INTERACT + or COMBAT_PREPARE out: page_main """ if team is None: @@ -51,6 +52,8 @@ class Dungeon(DungeonUI, DungeonEvent, Combat): if self.handle_destructible_around_blaze(): self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index) self.dungeon_goto(dungeon) + + self.combat_enter_from_map() # Check double event remain before combat # Conservatively prefer the smaller result if (dungeon.is_Calyx_Golden or dungeon.is_Calyx_Crimson) and \ diff --git a/tasks/dungeon/event.py b/tasks/dungeon/event.py index 2ef7d1514..5e6429cc1 100644 --- a/tasks/dungeon/event.py +++ b/tasks/dungeon/event.py @@ -52,7 +52,7 @@ class DungeonEvent(UI): has = self.image_color_count( OCR_DOUBLE_EVENT_REMAIN_AT_COMBAT, color=(252, 209, 123), - threshold=221, count=1000 + threshold=195, count=1000 ) logger.attr('Double event at combat', has) return has @@ -84,4 +84,13 @@ class DungeonEvent(UI): remain = self._get_double_event_remain( OCR_DOUBLE_EVENT_REMAIN_AT_COMBAT) logger.attr('Double event remain at combat', remain) + if remain == 0: + self.device.image_save() + exit(1) return remain + + +if __name__ == '__main__': + self = DungeonEvent('src') + self.device.screenshot() + self.get_double_event_remain_at_combat() \ No newline at end of file