From 99a6ab2a1193ffae419aae3be28737ec98a03114 Mon Sep 17 00:00:00 2001 From: Zebartin <16185081+Zebartin@users.noreply.github.com> Date: Sun, 19 May 2024 21:50:00 +0800 Subject: [PATCH] feat: Event assignments (All About Boothill) --- .../dispatch/ASSIGNMENT_START.2.png | Bin 0 -> 14135 bytes .../ui/ALL_ABOUT_BOOTHILL_CHECK.png | Bin 0 -> 9075 bytes .../ui/ALL_ABOUT_BOOTHILL_CLICK.png | Bin 0 -> 9427 bytes .../dispatch/ASSIGNMENT_START.2.png | Bin 0 -> 12908 bytes .../ui/ALL_ABOUT_BOOTHILL_CHECK.png | Bin 0 -> 9602 bytes .../ui/ALL_ABOUT_BOOTHILL_CLICK.png | Bin 0 -> 10421 bytes .../dispatch/ASSIGNMENT_STARTED_CHECK.2.png | Bin 0 -> 6475 bytes dev_tools/keywords/assignment.py | 1 + module/config/i18n/en-US.json | 2 +- module/config/i18n/zh-CN.json | 2 +- module/config/i18n/zh-TW.json | 2 +- tasks/assignment/assets/__init__.py | 7 +- .../assets/assets_assignment_dispatch.py | 69 ++++++++++++------ .../assignment/assets/assets_assignment_ui.py | 34 +++++++++ tasks/assignment/assignment.py | 65 ++++++++++------- tasks/assignment/keywords/__init__.py | 4 +- tasks/assignment/keywords/event_group.py | 9 +++ tasks/assignment/ui.py | 49 ++++++++----- 18 files changed, 170 insertions(+), 74 deletions(-) create mode 100644 assets/cn/assignment/dispatch/ASSIGNMENT_START.2.png create mode 100644 assets/cn/assignment/ui/ALL_ABOUT_BOOTHILL_CHECK.png create mode 100644 assets/cn/assignment/ui/ALL_ABOUT_BOOTHILL_CLICK.png create mode 100644 assets/en/assignment/dispatch/ASSIGNMENT_START.2.png create mode 100644 assets/en/assignment/ui/ALL_ABOUT_BOOTHILL_CHECK.png create mode 100644 assets/en/assignment/ui/ALL_ABOUT_BOOTHILL_CLICK.png create mode 100644 assets/share/assignment/dispatch/ASSIGNMENT_STARTED_CHECK.2.png diff --git a/assets/cn/assignment/dispatch/ASSIGNMENT_START.2.png b/assets/cn/assignment/dispatch/ASSIGNMENT_START.2.png new file mode 100644 index 0000000000000000000000000000000000000000..a22711f9ea884c304c4ec4c9bd5f09cdcda5a5f3 GIT binary patch literal 14135 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 Cg1V#t literal 0 HcmV?d00001 diff --git a/assets/cn/assignment/ui/ALL_ABOUT_BOOTHILL_CHECK.png b/assets/cn/assignment/ui/ALL_ABOUT_BOOTHILL_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd108738866c8039899600fcf9245cacf8647fd GIT binary patch literal 9075 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 literal 0 HcmV?d00001 diff --git a/assets/en/assignment/dispatch/ASSIGNMENT_START.2.png b/assets/en/assignment/dispatch/ASSIGNMENT_START.2.png new file mode 100644 index 0000000000000000000000000000000000000000..18dc97cbc95d86b0447be541668ffc354394b0cb GIT binary patch literal 12908 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 literal 0 HcmV?d00001 diff --git a/assets/en/assignment/ui/ALL_ABOUT_BOOTHILL_CHECK.png b/assets/en/assignment/ui/ALL_ABOUT_BOOTHILL_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..3429d76ce7bf3cf7454ca24a1c49cdb03fb45aab GIT binary patch literal 9602 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 literal 0 HcmV?d00001 diff --git a/assets/en/assignment/ui/ALL_ABOUT_BOOTHILL_CLICK.png b/assets/en/assignment/ui/ALL_ABOUT_BOOTHILL_CLICK.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2f0d046db69b95073842bf0071e370dbd4fb67 GIT binary patch literal 10421 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 Oppb)M2gv)*UjJX6XveGo literal 0 HcmV?d00001 diff --git a/assets/share/assignment/dispatch/ASSIGNMENT_STARTED_CHECK.2.png b/assets/share/assignment/dispatch/ASSIGNMENT_STARTED_CHECK.2.png new file mode 100644 index 0000000000000000000000000000000000000000..b7a6ddea12631bcfa302a1ebe57e1373573996b4 GIT binary patch literal 6475 zcmeHM`%_YB82&^nwb8ZO*3BE1Q_jw2Y8N#SDaXy65;vzcF-2LMoV?&Q1q`t5V$Le$ zOsgdZ&DLVItBhr80YTY{Eh@UCRLI34B{O6RF%g7?e_?0#xAVi9=X=jL=Q}gc`@YZf zo;eNQW0HNm1H1tMJ}HNj(g9fGT*AgY*E&H;QD!*7tuj415p<0P%{c@2%EXl8o}QkH z=`@Wq^e8x(dJuqa#(Epx^`uwXVQeJ;8>?KGo9Z;22*B6lDM<&96LESawnFjR?ZC0J ztJW~ykX?Q)=g$3+XyUC`ochUA>DB7?0rFQ{?OO^5`j5}^>!?fht5tC!Pfyy>^V8G#ENpe`o|f^Pb;Y}jb-h0vG$xHzedjPP0LsGys<3~URFnRS7ifE&=z2b=5I z36!i~MN!r7Tf^uqu zW`@fZ3PS)xSH@z?Y%fC4rkMO3C4sHZm{Pu{)o$?f_Ba4Q|3h;jib7uQ`8dP~UH;p5 z6<^a&0$3>nxfY&OK>5uQ`5_uc|7$ND5h$Mt+*+2MY`UGO>EAUgNK{yQgcn6M$9uNJ zMomjcn(Tc+UUy;7(KlRQZ1B8xDzeLKIUQtUc+67m-8I$xwP;AZH zdKK*2%+27)ipx6h>yO>np5-YFEzt|=3c(grl#23M<$U$kCEbE_Mq9)l_{0e{^zRjQ z=4_j#A{3WJ=*v##{i3TwxnjmSD@i7NxwuS3990NMQT#?ztpC>9d8wKpe5%rz<*mWX zN_+@!E*^tq3Cubsm9SzJku58&-8Xx)0=1eL8&s}^2;OS}(078!f4=2<`xiSuILL@+y0JQ_836L;C?f_Y&Ya;j$ ebHW489PJsm?3bF&v(BFz0Hl0}N$N_>`{`fvy@-nd literal 0 HcmV?d00001 diff --git a/dev_tools/keywords/assignment.py b/dev_tools/keywords/assignment.py index 25d53a3e3..218fe79ef 100644 --- a/dev_tools/keywords/assignment.py +++ b/dev_tools/keywords/assignment.py @@ -126,6 +126,7 @@ class GenerateAssignmentEventGroup(GenerateKeyword): def iter_keywords(self) -> Iterable[dict]: yield dict(text_id=self.find_keyword('空间站特派', lang='cn')[0]) + yield dict(text_id=self.find_keyword('关于波提欧的一切…', lang='cn')[0]) class GenerateAssignmentEventEntry(GenerateKeyword): diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 2c6f0adc4..3d5730358 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -907,7 +907,7 @@ "20": "20 Hours" }, "Event": { - "name": "Complete Event Assignments First", + "name": "Complete Event Assignments", "help": "" }, "Assignment": { diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index a0a857a7a..2a0e29000 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -907,7 +907,7 @@ "20": "20小时" }, "Event": { - "name": "有活动时优先做活动委托", + "name": "有活动时参加活动委托", "help": "" }, "Assignment": { diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index f3eb18c55..7812e7a19 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -907,7 +907,7 @@ "20": "20小時" }, "Event": { - "name": "有活動時優先做活動委託", + "name": "有活動時參加活動委託", "help": "" }, "Assignment": { diff --git a/tasks/assignment/assets/__init__.py b/tasks/assignment/assets/__init__.py index c2cd3f656..92bc0ebf3 100644 --- a/tasks/assignment/assets/__init__.py +++ b/tasks/assignment/assets/__init__.py @@ -1,12 +1,11 @@ from tasks.assignment.assets.assets_assignment_ui import ( + ALL_ABOUT_BOOTHILL_CHECK, ALL_ABOUT_BOOTHILL_CLICK, CHARACTER_MATERIALS_CHECK, CHARACTER_MATERIALS_CLICK, EXP_MATERIALS_CREDITS_CHECK, EXP_MATERIALS_CREDITS_CLICK, GROUP_SEARCH, - SPACE_STATION_TASK_FORCE_CHECK, SPACE_STATION_TASK_FORCE_CLICK, - SYNTHESIS_MATERIALS_CHECK, SYNTHESIS_MATERIALS_CLICK -) + SYNTHESIS_MATERIALS_CHECK, SYNTHESIS_MATERIALS_CLICK) for group_button_wrapper in ( - SPACE_STATION_TASK_FORCE_CHECK, SPACE_STATION_TASK_FORCE_CLICK, + ALL_ABOUT_BOOTHILL_CHECK, ALL_ABOUT_BOOTHILL_CLICK, CHARACTER_MATERIALS_CHECK, CHARACTER_MATERIALS_CLICK, EXP_MATERIALS_CREDITS_CHECK, EXP_MATERIALS_CREDITS_CLICK, SYNTHESIS_MATERIALS_CHECK, SYNTHESIS_MATERIALS_CLICK, diff --git a/tasks/assignment/assets/assets_assignment_dispatch.py b/tasks/assignment/assets/assets_assignment_dispatch.py index c1965a3f3..6cd2bcf67 100644 --- a/tasks/assignment/assets/assets_assignment_dispatch.py +++ b/tasks/assignment/assets/assets_assignment_dispatch.py @@ -5,30 +5,57 @@ from module.base.button import Button, ButtonWrapper ASSIGNMENT_START = ButtonWrapper( name='ASSIGNMENT_START', - cn=Button( - file='./assets/cn/assignment/dispatch/ASSIGNMENT_START.png', - area=(563, 341, 716, 376), - search=(552, 299, 725, 412), - color=(103, 92, 72), - button=(563, 341, 716, 376), - ), - en=Button( - file='./assets/en/assignment/dispatch/ASSIGNMENT_START.png', - area=(693, 343, 831, 374), - search=(669, 297, 831, 416), - color=(95, 86, 67), - button=(693, 343, 831, 374), - ), + cn=[ + Button( + file='./assets/cn/assignment/dispatch/ASSIGNMENT_START.png', + area=(563, 341, 716, 376), + search=(552, 299, 725, 412), + color=(103, 92, 72), + button=(563, 341, 716, 376), + ), + Button( + file='./assets/cn/assignment/dispatch/ASSIGNMENT_START.2.png', + area=(579, 373, 702, 405), + search=(552, 299, 725, 412), + color=(84, 75, 59), + button=(579, 373, 702, 405), + ), + ], + en=[ + Button( + file='./assets/en/assignment/dispatch/ASSIGNMENT_START.png', + area=(693, 343, 831, 374), + search=(669, 297, 831, 416), + color=(95, 86, 67), + button=(693, 343, 831, 374), + ), + Button( + file='./assets/en/assignment/dispatch/ASSIGNMENT_START.2.png', + area=(676, 376, 787, 404), + search=(669, 297, 831, 416), + color=(80, 71, 56), + button=(676, 376, 787, 404), + ), + ], ) ASSIGNMENT_STARTED_CHECK = ButtonWrapper( name='ASSIGNMENT_STARTED_CHECK', - share=Button( - file='./assets/share/assignment/dispatch/ASSIGNMENT_STARTED_CHECK.png', - area=(542, 412, 1156, 422), - search=(522, 392, 1176, 442), - color=(232, 230, 226), - button=(542, 412, 1156, 422), - ), + share=[ + Button( + file='./assets/share/assignment/dispatch/ASSIGNMENT_STARTED_CHECK.png', + area=(542, 412, 1156, 422), + search=(522, 392, 1176, 442), + color=(232, 230, 226), + button=(542, 412, 1156, 422), + ), + Button( + file='./assets/share/assignment/dispatch/ASSIGNMENT_STARTED_CHECK.2.png', + area=(542, 412, 1156, 422), + search=(522, 392, 1176, 442), + color=(254, 244, 221), + button=(542, 412, 1156, 422), + ), + ], ) CHARACTER_1 = ButtonWrapper( name='CHARACTER_1', diff --git a/tasks/assignment/assets/assets_assignment_ui.py b/tasks/assignment/assets/assets_assignment_ui.py index da093ac84..1ef0c0780 100644 --- a/tasks/assignment/assets/assets_assignment_ui.py +++ b/tasks/assignment/assets/assets_assignment_ui.py @@ -3,6 +3,40 @@ from module.base.button import Button, ButtonWrapper # This file was auto-generated, do not modify it manually. To generate: # ``` python -m dev_tools.button_extract ``` +ALL_ABOUT_BOOTHILL_CHECK = ButtonWrapper( + name='ALL_ABOUT_BOOTHILL_CHECK', + cn=Button( + file='./assets/cn/assignment/ui/ALL_ABOUT_BOOTHILL_CHECK.png', + area=(153, 98, 226, 118), + search=(133, 78, 246, 138), + color=(186, 180, 164), + button=(153, 98, 226, 118), + ), + en=Button( + file='./assets/en/assignment/ui/ALL_ABOUT_BOOTHILL_CHECK.png', + area=(154, 89, 240, 129), + search=(134, 69, 260, 149), + color=(207, 201, 183), + button=(154, 89, 240, 129), + ), +) +ALL_ABOUT_BOOTHILL_CLICK = ButtonWrapper( + name='ALL_ABOUT_BOOTHILL_CLICK', + cn=Button( + file='./assets/cn/assignment/ui/ALL_ABOUT_BOOTHILL_CLICK.png', + area=(153, 98, 227, 119), + search=(133, 78, 247, 139), + color=(80, 79, 77), + button=(153, 98, 227, 119), + ), + en=Button( + file='./assets/en/assignment/ui/ALL_ABOUT_BOOTHILL_CLICK.png', + area=(154, 90, 241, 128), + search=(134, 70, 261, 148), + color=(59, 57, 56), + button=(154, 90, 241, 128), + ), +) CHARACTER_MATERIALS_CHECK = ButtonWrapper( name='CHARACTER_MATERIALS_CHECK', cn=Button( diff --git a/tasks/assignment/assignment.py b/tasks/assignment/assignment.py index 758dd5af2..015247cfd 100644 --- a/tasks/assignment/assignment.py +++ b/tasks/assignment/assignment.py @@ -2,7 +2,9 @@ from datetime import datetime from module.logger import logger from tasks.assignment.claim import AssignmentClaim -from tasks.assignment.keywords import (AssignmentEntry, AssignmentEventGroup, KEYWORDS_ASSIGNMENT_GROUP) +from tasks.assignment.keywords import (KEYWORDS_ASSIGNMENT_GROUP, + AssignmentEntry, AssignmentEventEntry, + AssignmentEventGroup) from tasks.assignment.ui import AssignmentStatus from tasks.base.page import page_assignment, page_menu from tasks.daily.keywords import KEYWORDS_DAILY_QUEST @@ -10,7 +12,7 @@ from tasks.daily.synthesize import SynthesizeUI class Assignment(AssignmentClaim, SynthesizeUI): - def run(self, assignments: list[AssignmentEntry] = None, duration: int = None, event_first: bool = None): + def run(self, assignments: list[AssignmentEntry] = None, duration: int = None, join_event: bool = None): self.config.update_battle_pass_quests() self.config.update_daily_quests() @@ -26,25 +28,24 @@ class Assignment(AssignmentClaim, SynthesizeUI): 'There are duplicate assignments in config, check it out') if duration is None: duration = self.config.Assignment_Duration - if event_first is None: - event_first = self.config.Assignment_Event + if join_event is None: + join_event = self.config.Assignment_Event self.dispatched = dict() self.has_new_dispatch = False self.ensure_scroll_top(page_menu) self.ui_ensure(page_assignment) + self._wait_until_group_loaded() event_ongoing = next(( g for g in self._iter_groups() if isinstance(g, AssignmentEventGroup) ), None) - if event_first and event_ongoing is not None: - undispatched = assignments - remain = self._check_all() - remain = self._dispatch_event(remain) - else: - # Iterate in user-specified order, return undispatched ones - undispatched = list(self._check_inlist(assignments, duration)) - remain = self._check_all() + if join_event and event_ongoing is not None: + if self._check_event(): + self._check_event() + # Iterate in user-specified order, return undispatched ones + undispatched = list(self._check_inlist(assignments, duration)) + remain = self._check_all() undispatched = [x for x in undispatched if x not in self.dispatched] # There are unchecked assignments if remain > 0: @@ -89,13 +90,15 @@ class Assignment(AssignmentClaim, SynthesizeUI): logger.hr('Assignment check inlist', level=1) logger.info( f'User specified assignments: {", ".join([x.name for x in assignments])}') - _, remain, _ = self._limit_status + remain = None for assignment in assignments: if assignment in self.dispatched: continue logger.hr('Assignment inlist', level=2) logger.info(f'Check assignment inlist: {assignment}') self.goto_entry(assignment) + if remain is None: + _, remain, _ = self._limit_status status = self._check_assignment_status() if status == AssignmentStatus.CLAIMABLE: self.claim(assignment, duration, should_redispatch=True) @@ -121,10 +124,16 @@ class Assignment(AssignmentClaim, SynthesizeUI): """ logger.hr('Assignment check all', level=1) current, remain, _ = self._limit_status + len_dispatched = len([ + x for x in self.dispatched.keys() + if not isinstance(x, AssignmentEventEntry) + ]) # current = #Claimable + #Dispatched - if current == len(self.dispatched): + if current == len_dispatched: return remain for group in self._iter_groups(): + if isinstance(group, AssignmentEventGroup): + continue self.goto_group(group) insight = False for assignment in self._iter_entries(): @@ -139,14 +148,15 @@ class Assignment(AssignmentClaim, SynthesizeUI): current -= 1 remain += 1 insight = True # Order of entries change after claiming - if current == len(self.dispatched): + if current == len_dispatched: return remain continue if status == AssignmentStatus.DISPATCHED: self.dispatched[assignment] = datetime.now() + \ self._get_assignment_time() + len_dispatched += 1 insight = False # Order of entries does not change here - if current == len(self.dispatched): + if current == len_dispatched: return remain continue break @@ -183,10 +193,9 @@ class Assignment(AssignmentClaim, SynthesizeUI): if remain <= 0: return - def _dispatch_event(self, remain: int): - if remain <= 0: - return remain - logger.hr('Assignment dispatch event', level=1) + def _check_event(self): + logger.hr('Assignment check event', level=1) + claimed = False for group in self._iter_groups(): if not isinstance(group, AssignmentEventGroup): continue @@ -199,12 +208,14 @@ class Assignment(AssignmentClaim, SynthesizeUI): # Order of entries does not change during iteration self.goto_entry(assignment, insight=False) status = self._check_assignment_status() - # Should only be dispatchable or locked after _check_all + if status == AssignmentStatus.LOCKED: + continue + if status == AssignmentStatus.CLAIMABLE: + self.claim(assignment, None, should_redispatch=False) + claimed = True if status == AssignmentStatus.DISPATCHABLE: self.dispatch(assignment, None) - remain -= 1 - if remain <= 0: - return remain - continue - break - return remain + if status == AssignmentStatus.DISPATCHED: + self.dispatched[assignment] = datetime.now() + \ + self._get_assignment_time() + return claimed diff --git a/tasks/assignment/keywords/__init__.py b/tasks/assignment/keywords/__init__.py index eec743922..f37689661 100644 --- a/tasks/assignment/keywords/__init__.py +++ b/tasks/assignment/keywords/__init__.py @@ -30,7 +30,7 @@ KEYWORDS_ASSIGNMENT_GROUP.Synthesis_Materials.entries = ( KEYWORDS_ASSIGNMENT_ENTRY.Fragments_of_Illusory_Dreams, KEYWORDS_ASSIGNMENT_ENTRY.Scalpel_and_Screwdriver, ) -KEYWORDS_ASSIGNMENT_EVENT_GROUP.Space_Station_Task_Force.entries = ( +KEYWORDS_ASSIGNMENT_EVENT_GROUP.All_About_Boothill.entries = ( KEYWORDS_ASSIGNMENT_EVENT_ENTRY.Activate_Genetic_Samples, KEYWORDS_ASSIGNMENT_EVENT_ENTRY.Reproduce_Experimental_Data, KEYWORDS_ASSIGNMENT_EVENT_ENTRY.Burned_Warehouse, @@ -60,7 +60,7 @@ for group in ( KEYWORDS_ASSIGNMENT_GROUP.Character_Materials, KEYWORDS_ASSIGNMENT_GROUP.EXP_Materials_Credits, KEYWORDS_ASSIGNMENT_GROUP.Synthesis_Materials, - KEYWORDS_ASSIGNMENT_EVENT_GROUP.Space_Station_Task_Force, + KEYWORDS_ASSIGNMENT_EVENT_GROUP.All_About_Boothill, ): for entry in group.entries: assert entry.group is None diff --git a/tasks/assignment/keywords/event_group.py b/tasks/assignment/keywords/event_group.py index f41885793..8f6735559 100644 --- a/tasks/assignment/keywords/event_group.py +++ b/tasks/assignment/keywords/event_group.py @@ -12,3 +12,12 @@ Space_Station_Task_Force = AssignmentEventGroup( jp='ステーション特派', es='Comando de la Estación Espacial', ) +All_About_Boothill = AssignmentEventGroup( + id=2, + name='All_About_Boothill', + cn='关于波提欧的一切…', + cht='關於波提歐的一切……', + en='All About Boothill...', + jp='ブートヒルに関するすべて…', + es='Todo sobre Boothill...', +) diff --git a/tasks/assignment/ui.py b/tasks/assignment/ui.py index efbeb0f67..4742e4685 100644 --- a/tasks/assignment/ui.py +++ b/tasks/assignment/ui.py @@ -8,13 +8,14 @@ from module.base.timer import Timer from module.exception import ScriptError from module.logger import logger from module.ocr.ocr import DigitCounter, Duration, Ocr -from tasks.dungeon.ui import DungeonTabSwitch as Switch from module.ui.draggable_list import DraggableList from tasks.assignment.assets.assets_assignment_claim import CLAIM from tasks.assignment.assets.assets_assignment_dispatch import EMPTY_SLOT from tasks.assignment.assets.assets_assignment_ui import * from tasks.assignment.keywords import * +from tasks.base.assets.assets_base_page import ASSIGNMENT_CHECK from tasks.base.ui import UI +from tasks.dungeon.ui import DungeonTabSwitch as Switch class AssignmentStatus(Enum): @@ -31,17 +32,19 @@ class AssignmentOcr(Ocr): OCR_REPLACE = { 'cn': [ - (KEYWORDS_ASSIGNMENT_ENTRY.Winter_Soldiers.name, '[黑]冬的战士们'), - (KEYWORDS_ASSIGNMENT_ENTRY.Born_to_Obey.name, '[牛]而服从'), - (KEYWORDS_ASSIGNMENT_ENTRY.Root_Out_the_Turpitude.name, + (KEYWORDS_ASSIGNMENT_ENTRY.Winter_Soldiers, '[黑]冬的战士们'), + (KEYWORDS_ASSIGNMENT_ENTRY.Born_to_Obey, '[牛]而服从'), + (KEYWORDS_ASSIGNMENT_ENTRY.Root_Out_the_Turpitude, '根除恶[擎薯尊掌鞋]?'), - (KEYWORDS_ASSIGNMENT_ENTRY.Akashic_Records.name, '阿[未][夏复]记录'), - (KEYWORDS_ASSIGNMENT_ENTRY.Legend_of_the_Puppet_Master.name, '^师传说'), - (KEYWORDS_ASSIGNMENT_ENTRY.The_Wages_of_Humanity.name, '[赠]养人类'), + (KEYWORDS_ASSIGNMENT_ENTRY.Akashic_Records, '阿[未][夏复]记录'), + (KEYWORDS_ASSIGNMENT_ENTRY.Legend_of_the_Puppet_Master, '^师传说'), + (KEYWORDS_ASSIGNMENT_ENTRY.The_Wages_of_Humanity, '[赠]养人类'), + (KEYWORDS_ASSIGNMENT_EVENT_ENTRY.Car_Thief, '.*的偷车贼.*'), ], 'en': [ # (KEYWORDS_ASSIGNMENT_EVENT_ENTRY.Food_Improvement_Plan.name, # 'Food\s*[I]{0}mprovement Plan'), + (KEYWORDS_ASSIGNMENT_EVENT_ENTRY.Car_Thief, '.*Car Thief.*'), ] } @@ -50,7 +53,10 @@ class AssignmentOcr(Ocr): rules = AssignmentOcr.OCR_REPLACE.get(self.lang) if rules is None: return None - return re.compile('|'.join('(?P<%s>%s)' % pair for pair in rules)) + return re.compile('|'.join( + f'(?P<{kw.name}>{pat})' + for kw, pat in rules + )) def filter_detected(self, result) -> bool: # Drop duration rows @@ -78,17 +84,17 @@ class AssignmentOcr(Ocr): matched = self.ocr_regex.fullmatch(result) if matched is None: return result - keyword_lang = self.lang for keyword_class in ( KEYWORDS_ASSIGNMENT_ENTRY, KEYWORDS_ASSIGNMENT_EVENT_ENTRY, ): - matched = getattr(keyword_class, matched.lastgroup, None) - if matched is not None: + kw = getattr(keyword_class, matched.lastgroup, None) + if kw is not None: + matched = kw break else: raise ScriptError(f'No keyword found for {matched.lastgroup}') - matched = getattr(matched, keyword_lang) + matched = getattr(matched, self.lang) logger.attr(name=f'{self.name} after_process', text=f'{result} -> {matched}') return matched @@ -98,10 +104,15 @@ ASSIGNMENT_GROUP_SWITCH = Switch( 'AssignmentGroupSwitch', is_selector=True ) +# ASSIGNMENT_GROUP_SWITCH.add_state( +# KEYWORDS_ASSIGNMENT_EVENT_GROUP.Space_Station_Task_Force, +# check_button=SPACE_STATION_TASK_FORCE_CHECK, +# click_button=SPACE_STATION_TASK_FORCE_CLICK +# ) ASSIGNMENT_GROUP_SWITCH.add_state( - KEYWORDS_ASSIGNMENT_EVENT_GROUP.Space_Station_Task_Force, - check_button=SPACE_STATION_TASK_FORCE_CHECK, - click_button=SPACE_STATION_TASK_FORCE_CLICK + KEYWORDS_ASSIGNMENT_EVENT_GROUP.All_About_Boothill, + check_button=ALL_ABOUT_BOOTHILL_CHECK, + click_button=ALL_ABOUT_BOOTHILL_CLICK ) ASSIGNMENT_GROUP_SWITCH.add_state( KEYWORDS_ASSIGNMENT_GROUP.Character_Materials, @@ -174,7 +185,7 @@ class AssignmentUI(UI): def _wait_until_group_loaded(self): skip_first_screenshot = True - timeout = Timer(2, count=3).start() + timeout = Timer(3, count=3).start() while 1: if skip_first_screenshot: skip_first_screenshot = False @@ -201,13 +212,17 @@ class AssignmentUI(UI): if timeout.reached(): logger.warning('Wait entry loaded timeout') break - if self.image_color_count(ENTRY_LOADED, (35, 35, 35), count=800): + if self.appear(ASSIGNMENT_CHECK) and \ + self.image_color_count(ENTRY_LOADED, (35, 35, 35), count=800): logger.info('Entry loaded') break @property def _limit_status(self) -> tuple[int, int, int]: self.device.screenshot() + if isinstance(ASSIGNMENT_GROUP_SWITCH.get(self), AssignmentEventGroup): + ASSIGNMENT_GROUP_SWITCH.set( + KEYWORDS_ASSIGNMENT_GROUP.Character_Materials, self) current, remain, total = DigitCounter( OCR_ASSIGNMENT_LIMIT).ocr_single_line(self.device.image) if total and current <= total: