From a1a11426512f6983d782b2b630c2398bf3e8f8c1 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 2 Nov 2023 03:56:01 +0800 Subject: [PATCH 1/6] Refactor: Abstract DungeonState class to be shared in rogue --- .../share/dungeon/state/OCR_SIMUNI_POINT.png | Bin 0 -> 18544 bytes .../OCR_SIMUNI_POINT_OFFSET.SEARCH.png | Bin .../{ui => state}/OCR_SIMUNI_POINT_OFFSET.png | Bin assets/share/dungeon/state/OCR_STAMINA.png | Bin 0 -> 28538 bytes assets/share/dungeon/ui/OCR_SIMUNI_POINT.png | Bin 16420 -> 0 bytes tasks/dungeon/assets/assets_dungeon_state.py | 35 +++++ tasks/dungeon/assets/assets_dungeon_ui.py | 20 --- tasks/dungeon/state.py | 122 ++++++++++++++++++ tasks/dungeon/ui.py | 40 +----- 9 files changed, 161 insertions(+), 56 deletions(-) create mode 100644 assets/share/dungeon/state/OCR_SIMUNI_POINT.png rename assets/share/dungeon/{ui => state}/OCR_SIMUNI_POINT_OFFSET.SEARCH.png (100%) rename assets/share/dungeon/{ui => state}/OCR_SIMUNI_POINT_OFFSET.png (100%) create mode 100644 assets/share/dungeon/state/OCR_STAMINA.png delete mode 100644 assets/share/dungeon/ui/OCR_SIMUNI_POINT.png create mode 100644 tasks/dungeon/assets/assets_dungeon_state.py create mode 100644 tasks/dungeon/state.py diff --git a/assets/share/dungeon/state/OCR_SIMUNI_POINT.png b/assets/share/dungeon/state/OCR_SIMUNI_POINT.png new file mode 100644 index 0000000000000000000000000000000000000000..51bf72943a53422e27f0e8a65892184a664516f8 GIT binary patch literal 18544 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 U8METQZ{auVySK16fB*A;0ci53%K!iX literal 0 HcmV?d00001 diff --git a/assets/share/dungeon/ui/OCR_SIMUNI_POINT.png b/assets/share/dungeon/ui/OCR_SIMUNI_POINT.png deleted file mode 100644 index 540d04be7e6e1c31e3387d3661bdf730444646a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16420 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 GpZ^Ql11zBc diff --git a/tasks/dungeon/assets/assets_dungeon_state.py b/tasks/dungeon/assets/assets_dungeon_state.py new file mode 100644 index 000000000..f8f1477ea --- /dev/null +++ b/tasks/dungeon/assets/assets_dungeon_state.py @@ -0,0 +1,35 @@ +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 ``` + +OCR_SIMUNI_POINT = ButtonWrapper( + name='OCR_SIMUNI_POINT', + share=Button( + file='./assets/share/dungeon/state/OCR_SIMUNI_POINT.png', + area=(580, 237, 860, 277), + search=(560, 217, 880, 297), + color=(163, 170, 252), + button=(580, 237, 860, 277), + ), +) +OCR_SIMUNI_POINT_OFFSET = ButtonWrapper( + name='OCR_SIMUNI_POINT_OFFSET', + share=Button( + file='./assets/share/dungeon/state/OCR_SIMUNI_POINT_OFFSET.png', + area=(685, 250, 717, 273), + search=(583, 187, 883, 387), + color=(199, 200, 250), + button=(685, 250, 717, 273), + ), +) +OCR_STAMINA = ButtonWrapper( + name='OCR_STAMINA', + share=Button( + file='./assets/share/dungeon/state/OCR_STAMINA.png', + area=(675, 11, 1181, 64), + search=(655, 0, 1201, 84), + color=(75, 89, 125), + button=(675, 11, 1181, 64), + ), +) diff --git a/tasks/dungeon/assets/assets_dungeon_ui.py b/tasks/dungeon/assets/assets_dungeon_ui.py index b296a7243..8d04b5748 100644 --- a/tasks/dungeon/assets/assets_dungeon_ui.py +++ b/tasks/dungeon/assets/assets_dungeon_ui.py @@ -53,26 +53,6 @@ OCR_DUNGEON_NAV = ButtonWrapper( button=(117, 182, 423, 641), ), ) -OCR_SIMUNI_POINT = ButtonWrapper( - name='OCR_SIMUNI_POINT', - share=Button( - file='./assets/share/dungeon/ui/OCR_SIMUNI_POINT.png', - area=(580, 237, 820, 277), - search=(560, 217, 840, 297), - color=(166, 168, 252), - button=(580, 237, 820, 277), - ), -) -OCR_SIMUNI_POINT_OFFSET = ButtonWrapper( - name='OCR_SIMUNI_POINT_OFFSET', - share=Button( - file='./assets/share/dungeon/ui/OCR_SIMUNI_POINT_OFFSET.png', - area=(685, 250, 717, 273), - search=(583, 187, 883, 387), - color=(199, 200, 250), - button=(685, 250, 717, 273), - ), -) OCR_WEEKLY_LIMIT = ButtonWrapper( name='OCR_WEEKLY_LIMIT', share=Button( diff --git a/tasks/dungeon/state.py b/tasks/dungeon/state.py new file mode 100644 index 000000000..5249a2573 --- /dev/null +++ b/tasks/dungeon/state.py @@ -0,0 +1,122 @@ +import threading + +from module.base.timer import Timer +from module.base.utils import crop +from module.logger import logger +from module.ocr.ocr import DigitCounter +from tasks.base.ui import UI +from tasks.dungeon.assets.assets_dungeon_state import OCR_SIMUNI_POINT, OCR_SIMUNI_POINT_OFFSET, OCR_STAMINA + + +class OcrSimUniPoint(DigitCounter): + def after_process(self, result): + result = super().after_process(result) + result = result.replace('O', '0').replace('o', '0') + return result + + +class DungeonState(UI): + def dungeon_get_simuni_point(self, image=None) -> int: + """ + Page: + in: page_guide, Survival_Index, Simulated_Universe + """ + logger.info('Get simulated universe points') + if image is None: + image = self.device.image + + _ = OCR_SIMUNI_POINT_OFFSET.match_template(image) + OCR_SIMUNI_POINT.load_offset(OCR_SIMUNI_POINT_OFFSET) + area = ( + OCR_SIMUNI_POINT.area[0], + OCR_SIMUNI_POINT.button[1], + OCR_SIMUNI_POINT.area[2], + OCR_SIMUNI_POINT.button[3], + ) + + ocr = OcrSimUniPoint(OCR_SIMUNI_POINT) + value, _, total = ocr.ocr_single_line(crop(image, area), direct_ocr=True) + if total and value <= total: + logger.attr('SimulatedUniverse', f'{value}/{total}') + self.config.stored.SimulatedUniverse.set(value, total) + return value + else: + logger.warning(f'Invalid SimulatedUniverse points: {value}/{total}') + return 0 + + def dungeon_update_stamina(self, image=None, skip_first_screenshot=True): + """ + Returns: + bool: If success + + Pages: + in: page_guild, Survival_Index, Simulated_Universe + or page_rogue, LEVEL_CONFIRM + or rogue, REWARD_CLOSE + """ + ocr = DigitCounter(OCR_STAMINA) + timeout = Timer(1, count=2).start() + if image is None: + image = self.device.image + else: + skip_first_screenshot = True + + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + stamina = (0, 0, 0) + immersifier = (0, 0, 0) + + if timeout.reached(): + logger.warning('dungeon_update_stamina() timeout') + return False + + for row in ocr.detect_and_ocr(image): + if row.ocr_text.isdigit(): + continue + if row.ocr_text == '+': + continue + if '/' not in row.ocr_text: + continue + data = ocr.format_result(row.ocr_text) + if data[2] == self.config.stored.TrailblazePower.FIXED_TOTAL: + stamina = data + if data[2] == self.config.stored.Immersifier.FIXED_TOTAL: + immersifier = data + + if stamina[2] > 0 and immersifier[2] > 0: + break + if image is not None: + logger.warning('dungeon_update_stamina() ended') + return + + stamina = stamina[0] + immersifier = immersifier[0] + logger.attr('TrailblazePower', stamina) + logger.attr('Imersifier', immersifier) + with self.config.multi_set(): + self.config.stored.TrailblazePower.value = stamina + self.config.stored.Immersifier.value = immersifier + return True + + def dungeon_update_simuni(self): + """ + Update rogue weekly points, stamina, immersifier + Run in a new thread to be faster as data is not used immediately + + Page: + in: page_guide, Survival_Index, Simulated_Universe + """ + logger.info('dungeon_update_simuni') + + def func(image): + logger.info('Update thread start') + with self.config.multi_set(): + self.dungeon_get_simuni_point(image) + # self.dungeon_update_stamina(image) + + thread = threading.Thread(target=func, args=(self.device.image,)) + thread.start() diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 91da95fd1..9809d3449 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -7,12 +7,11 @@ from module.base.button import ClickButton from module.base.timer import Timer from module.base.utils import get_color from module.logger import logger -from module.ocr.ocr import DigitCounter, Ocr, OcrResultButton +from module.ocr.ocr import Ocr, OcrResultButton from module.ocr.utils import split_and_pair_button_attr from module.ui.draggable_list import DraggableList from module.ui.switch import Switch from tasks.base.page import page_guide -from tasks.base.ui import UI from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE from tasks.dungeon.assets.assets_dungeon_ui import * from tasks.dungeon.keywords import ( @@ -24,6 +23,7 @@ from tasks.dungeon.keywords import ( KEYWORDS_DUNGEON_TAB ) from tasks.dungeon.keywords.classes import DungeonEntrance +from tasks.dungeon.state import DungeonState class DungeonTabSwitch(Switch): @@ -78,13 +78,6 @@ class OcrDungeonList(Ocr): return result -class OcrSimUniPoint(DigitCounter): - def after_process(self, result): - result = super().after_process(result) - result = result.replace('O', '0').replace('o', '0') - return result - - class OcrDungeonListLimitEntrance(OcrDungeonList): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -123,7 +116,7 @@ DUNGEON_LIST = DraggableDungeonList( ocr_class=OcrDungeonList, search_button=OCR_DUNGEON_LIST) -class DungeonUI(UI): +class DungeonUI(DungeonState): def dungeon_tab_goto(self, state: DungeonTab): """ Args: @@ -233,31 +226,6 @@ class DungeonUI(UI): logger.info('No Forgotten_Hall in list skip waiting') return False - def dungeon_get_simuni_point(self) -> int: - """ - Page: - in: page_guide, Survival_Index, Simulated_Universe - """ - logger.info('Get simulated universe points') - _ = self.appear(OCR_SIMUNI_POINT_OFFSET) - OCR_SIMUNI_POINT.load_offset(OCR_SIMUNI_POINT_OFFSET) - area = ( - OCR_SIMUNI_POINT.area[0], - OCR_SIMUNI_POINT.button[1], - OCR_SIMUNI_POINT.area[2], - OCR_SIMUNI_POINT.button[3], - ) - - ocr = OcrSimUniPoint(OCR_SIMUNI_POINT) - value, _, total = ocr.ocr_single_line(self.image_crop(area), direct_ocr=True) - if total and value <= total: - logger.attr('SimulatedUniverse', f'{value}/{total}') - self.config.stored.SimulatedUniverse.set(value, total) - return value - else: - logger.warning(f'Invalid SimulatedUniverse points: {value}/{total}') - return 0 - def _dungeon_nav_goto(self, dungeon: DungeonList, skip_first_screenshot=True): """ Equivalent to `DUNGEON_NAV_LIST.select_row(dungeon.dungeon_nav, main=self)` @@ -301,7 +269,7 @@ class DungeonUI(UI): logger.info('DUNGEON_NAV_LIST at top') # Update points if possible if DUNGEON_NAV_LIST.is_row_selected(button, main=self): - self.dungeon_get_simuni_point() + self.dungeon_update_simuni() else: # To start from any list states. logger.info('DUNGEON_NAV_LIST not at top') From 1af6779c1329593b6b7249c5985ab1397d1c3a60 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 2 Nov 2023 04:27:03 +0800 Subject: [PATCH 2/6] Opt: Reduce image copy in minimap detection --- tasks/map/minimap/minimap.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tasks/map/minimap/minimap.py b/tasks/map/minimap/minimap.py index 5fe623672..e686fc0a0 100644 --- a/tasks/map/minimap/minimap.py +++ b/tasks/map/minimap/minimap.py @@ -16,6 +16,7 @@ from module.base.utils import ( rgb2yuv ) from module.logger import logger +from tasks.map.interact.aim import subtract_blur from tasks.map.minimap.utils import ( convolve, cubic_find_maximum, @@ -223,7 +224,7 @@ class Minimap(MapResource): scale = self.DIRECTION_ROTATION_SCALE * self.DIRECTION_SEARCH_SCALE mapping = cv2.resize(image, None, fx=scale, fy=scale, interpolation=cv2.INTER_NEAREST) result = cv2.matchTemplate(self.ArrowRotateMap, mapping, cv2.TM_CCOEFF_NORMED) - result = cv2.subtract(result, cv2.GaussianBlur(result, (5, 5), 0)) + subtract_blur(result, 5) _, sim, _, loca = cv2.minMaxLoc(result) loca = np.array(loca) / self.DIRECTION_SEARCH_SCALE // (self.DIRECTION_RADIUS * 2) degree = int((loca[0] + loca[1] * 8) * 5) @@ -240,7 +241,7 @@ class Minimap(MapResource): precise_map = self.ArrowRotateMapAll[row[0]:row[1], :] result = cv2.matchTemplate(precise_map, mapping, cv2.TM_CCOEFF_NORMED) - result = cv2.subtract(result, cv2.GaussianBlur(result, (5, 5), 0)) + subtract_blur(result, 5) def to_map(x): return int((x * self.DIRECTION_RADIUS * 2) * self.POSITION_SEARCH_SCALE) @@ -271,11 +272,10 @@ class Minimap(MapResource): # Extract minimap = self.get_minimap(image, radius=self.MINIMAP_RADIUS) - _, _, v = cv2.split(rgb2yuv(minimap)) + image = rgb2yuv(minimap)[:, :, 2].copy() - image = cv2.subtract(128, v) - - image = cv2.GaussianBlur(image, (3, 3), 0) + cv2.subtract(128, image, dst=image) + cv2.GaussianBlur(image, (3, 3), 0, dst=image) # Expand circle into rectangle remap = cv2.remap(image, *self.RotationRemapData, cv2.INTER_LINEAR)[d * 1 // 10:d * 6 // 10].astype(np.float32) remap = cv2.resize(remap, None, fx=scale, fy=scale, interpolation=cv2.INTER_LINEAR) From 1e4db4eef014c0bc81ec16973f04c36977c5727a Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 2 Nov 2023 10:35:13 +0800 Subject: [PATCH 3/6] Opt: More friendly record time on dashboard --- module/webui/lang.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/module/webui/lang.py b/module/webui/lang.py index 1c9bc0ef4..12245c907 100644 --- a/module/webui/lang.py +++ b/module/webui/lang.py @@ -89,12 +89,15 @@ def readable_time(before: str) -> str: elif diff < 60: # < 1 min return t("Gui.Dashboard.JustNow") - elif diff < 3600: + elif diff < 5400: + # < 90 min return t("Gui.Dashboard.MinutesAgo", time=int(diff // 60)) - elif diff < 86400: + elif diff < 129600: + # < 36 hours return t("Gui.Dashboard.HoursAgo", time=int(diff // 3600)) elif diff < 1296000: + # < 15 days return t("Gui.Dashboard.DaysAgo", time=int(diff // 86400)) else: - # > 15 days + # >= 15 days return t("Gui.Dashboard.LongTimeAgo") From 881389efcea259e252819846895d6297af35ae34 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 2 Nov 2023 11:39:15 +0800 Subject: [PATCH 4/6] Fix: Handle light cone drop from Echo of War (#171) --- assets/cn/base/popup/GET_LIGHT_CONE.png | Bin 0 -> 7037 bytes assets/en/base/popup/GET_LIGHT_CONE.png | Bin 0 -> 7008 bytes tasks/base/assets/assets_base_popup.py | 17 +++++++++++++++++ tasks/base/popup.py | 17 +++++++++++++++++ tasks/base/ui.py | 2 ++ tasks/combat/combat.py | 2 ++ 6 files changed, 38 insertions(+) create mode 100644 assets/cn/base/popup/GET_LIGHT_CONE.png create mode 100644 assets/en/base/popup/GET_LIGHT_CONE.png diff --git a/assets/cn/base/popup/GET_LIGHT_CONE.png b/assets/cn/base/popup/GET_LIGHT_CONE.png new file mode 100644 index 0000000000000000000000000000000000000000..0a88e28ad37e07a340098133d989574163bc7a6e GIT binary patch literal 7037 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 OJkWTgUZ(o=)&Br0ex}+0 literal 0 HcmV?d00001 diff --git a/assets/en/base/popup/GET_LIGHT_CONE.png b/assets/en/base/popup/GET_LIGHT_CONE.png new file mode 100644 index 0000000000000000000000000000000000000000..b524f8acf459f13bf9f7dfdf775675c62647d1b3 GIT binary patch literal 7008 zcmeI0hc}!-_s1VCQKCeNPSg|;A&BTvVkHtR77;yq@0KWu7DS5{y_02;AkkYAgk^QY z>TSbf_06)@yYKJ6c+W3$&Yb(4Gc)Jj`OJK0=DD$Y&$Z}jxo80Zpw|XzfB}Gt^hrKK zO-?eZ{7=Y8hQH`3DEdQ-!Kz1$%0MI^jQdig0bM)}_@Nx9;ysoXTe%;gC!`{i& z4gdmY^9%w^QgPRm7jbrs5VhZXUou_a0D?kr>R(Kz#Y`Un>qsVM)t;z#v=COdtGOVf zpKm8=L3!_13U4+!Jc@hwBHrkw+%ErI#n+G^?9R^F^jRA^7fnDyhZ)1KGK;2c6gvYC z!BL9xzxk7NK|lN3!^zn|OO)4{HW1$(sCockj{+JP>ib!RKvwGkkOQ8RcZHezmMnXsJATyedEEx>^x@-8075K#gd^V_mMGK?>fGhO1njla~4{RT4D^mf#VX1TM z!0%!n7&VYU24vmT5++w|1+0wTfbWoZeFqBRs)BbZyK2b7O}|NLk%zZa0se_5$&9L2 zKzNqgok8Hb966xQ$1+55U5BFZ-dN`n%+fQe2}A~TA<~C3pN`#UZAu^E3OLwXS`k?J z?)pW|n*A1&Jy$qMS-HdSh*Q!yfI5J?beYy6kxfDhuo{ z65HOBQvyuShq1Gk>+4e#o_%DW{W@J>X22{2a9qTj-$&6DzMvfm!pB492&#PfMS8y! zd3k8*=ypVGirVk3#w%akU-npv4?Q8Z5>Y{WfLFF^R&`fN#JQKXyMGNh5sjc!lXS3eS zPA@e8XcWG={rS=5E8VQ{E{5E0-nK4wa_dVPs#k=&6q(d6t%dW@7I9=e;xz1%|4sSz zGX+=S)$C=ahHgnYdh`1}{i0^E7Lb2;)h6+`Ad;FrE0I#r z8YKN8y!86!J63(co?qUja*QMeJacx?XX>aQEDJIDM zRGUBXbH()*`i%NYGn$8I6uXRaHSj5ge=DvSefr1G7YK<U!}d}}PVFnN49%Qm$|B-3}-x5>#`CORhSpG3BW8kk$C zjcFnxCBNSgO#P(WAQHrk{~2f_|0UVvFkCV$-*UW0 z$Y5~_aTW0|Q_j`))uGi7W`kxsW^H!7cdqSVX0d*rd8&DL@{Z-*4=p z$mLI05sob>KOIX(wM%X^iSEWYtjYwkE8D|8cx>R(3wCoZiq-rVoVc9~^A7Sb^G+%FD!lgg^&9ke^=!kGE=&J_{e=D4G&6%s7ahsSQRO$(-I(v3Ehr8eW zhZ6SD(H_oZ#cOaiuOg@7`(ZL#!ouIe)Z(n2Pq#i-G=J)z+b`5lv!!-Ku$8>BlHDnC zlR~*ynY6%I}@((Zznijkmo&=Wr)`lx=`IkL?Bb>AgWw z9loiniP6Kmb6^oHSs%fX0hW#Sa02ys=T|U-(cYD<%_#B1z$5g zb7)W8PlCN~RzNv_^Y(XuJG+8iZMSop!ka3a-UP<{)!ffy_GJ;K*@<2I`TM6*?5Ynr z+BN%r?pn5ChOceS`do1{`^F{`ksqLFDr1`bS}y7%b7q~&dc<`#JqZro^$PcAyetQi zIZ?Wr9mNU7`d=EGo+y6U$b+Px$jvK+sGmAU>pu4Dy-%YH7K5g6erOgtdT#^)b|Kc6Q-OCEgek?i!*QmawNKie zA5D%#@6lIt?}2@GS~*K298J7#bL&kg=B8F&q2_M;#Q&mYf9Tg_$ED=han> z9W$b{Q=Rhx!G{bHyle^!*tG4ouVR75F728j$L?dhZ|9S^Y`9xGH$vx|v;uT{@{@wg zf-j$FVlmFX9ot2r4!v-{}VzFL5hWDr(36d0&#pYr(74(RdMxm0Y#;>yt?`&M(Zn zskDz@dz-pi@v0&}@41T7MAjS>r$fkcG1oV5cTgYBS7Gq$98(M!eYbQKwdfjZ(C8}fV^o$TDHleo~ zCetJ7uX^A~HJ^1`7)4#uF4uE-865Q_QR?Yfwc5Xd)a^%rH|0uiHE3p8fz(l1t&HOn zHC4UOWdbi5NT&AmdA`{89wdG8I z82~`x*0d~3`T6O6h> zk+lHOH38Zrzv<+0f$C4aK^HaZhI-NH3T6O8=)8oD}|bw2 zH0hsTWxZDM{Y;%5CSNHmcJ=R4H?Fd(s*h!UIVGjLySvI^=!t0RYPXP((9X`z{QNx3 z(3?m&WfOyxj&JUlL_|bX=oTav|2f6fUL1|X zlZN#6_WH`Z(UM&1P_bEYjH6Hr^71dt%#0xr*)M|%;(7Vz=1P)vB_*q{3V)rKx7$3I zzoYYm-51&l(m$->7Q;Ny$h;`EWuyXjt~2anWJHfzAg)-8Z)R?G_JzK_{;83J13Hmc z_qpQmN>6-27*V&El#MA@1GB64Z_i9NzjR0DJ{%evva_>WWS^RzZgd*&z3+e|(X6ou z(K0umpQ%Tmo}SL4P}q*MU9k7rejh*oL+`b*vZv7Z0vazw%wtoxgeoNK=>R@mAM|Cx-Zf3hk9oyId&r=RL4ct4~K|N5aYi?^J z=-h2|pKl=&ePS4RTksn>V-epb8DQ3++K@ja&JGLYH4YCC50c=x)B`{)7jiw{HeLQ>`p3;*GmI~ zdK*n!`Mlko9dTA#fymXqB=Zi%Ht+R;%1X{M&S@Vs(#_HFW78NZm-SKOcGo@8yysC& zaXn-H8jEI>d>kC_R##-ECrZJv{m)xlGX<{?`ny!aiuA5n!=qnXSmgJoi7@L^dr`-V z)%?|F)r|V?$P>fFY#E9-;$bIkZU%nk4?2lTaRc`CWk)0z$-oc8EJ@qPteTc#A(Dw< zj!zeCBokNV;)*@S*5uL#zLjZDEQ;)#qi;nrMMp;?3sm?uZOPLAuS}7I6i&%euIJ`v zemi|&-Pc}ZVsRidu(`CzRbxM4711gfN9T#B#e!W z(m}$qu7OQoj~iF9QFmcgXRu|`lSeK=ZB(0G26Qx$v(Lppr5s2ZM@z*NGHyM@X zq(iHjzISznA4rhIag`*F`d9s9qzEG}Gq&ybb`XigbTQ+{`o2qD#KgqJl#~>1kCztu z`Y9mc?3^4%K1I*dqs9FHzg zA^!E4stwz#tg6}ClE)t)B%aN^C6NY1EoE~QyjBVt=MLg8;436a^zEW4h4Sc$n!={jplae;p3~R zuI6358HoBewT|G%?YLlem1Ptar5upkMpcl;hK4&Y8b(b12kx4GA^s!qkH9|y|1SvK gTPKokgo_IbKq>%?JYR#h{&(8in$I bool: + """ + Popup when getting a light cone from Echo of War. + + Args: + interval: + + Returns: + If handled. + """ + if self.appear(GET_LIGHT_CONE, interval=interval): + logger.info(f'{GET_LIGHT_CONE} -> {GET_REWARD}') + self.device.click(GET_REWARD) + return True + + return False diff --git a/tasks/base/ui.py b/tasks/base/ui.py index da63c2312..c93af5f33 100644 --- a/tasks/base/ui.py +++ b/tasks/base/ui.py @@ -321,6 +321,8 @@ class UI(MainPage): return True if self.handle_monthly_card_reward(): return True + if self.handle_get_light_cone(): + return True if self.appear(COMBAT_PREPARE, interval=5): logger.info(f'UI additional: {COMBAT_PREPARE} -> {CLOSE}') self.device.click(CLOSE) diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index 905656dd2..d26d29bb4 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -306,6 +306,8 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo logger.info(f'{COMBAT_AGAIN} -> {COMBAT_EXIT}') self.device.click(COMBAT_EXIT) continue + if self.handle_get_light_cone(): + continue def is_trailblaze_power_exhausted(self) -> bool: flag = self.config.stored.TrailblazePower.value < self.combat_wave_cost From e5c02fd381641e31ba59fa2c252f5b2dfc73dffc Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 2 Nov 2023 18:56:20 +0800 Subject: [PATCH 5/6] Opt: Enter dungeon from map if possible --- .../interact/DUNGEON_COMBAT_INTERACT_TEXT.png | Bin 0 -> 28656 bytes tasks/combat/assets/assets_combat_interact.py | 10 ++++ tasks/combat/combat.py | 21 ------- tasks/combat/interact.py | 23 ++++++++ tasks/dungeon/dungeon.py | 8 ++- tasks/dungeon/ui.py | 53 +++++++++++++++++- 6 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 assets/share/combat/interact/DUNGEON_COMBAT_INTERACT_TEXT.png diff --git a/assets/share/combat/interact/DUNGEON_COMBAT_INTERACT_TEXT.png b/assets/share/combat/interact/DUNGEON_COMBAT_INTERACT_TEXT.png new file mode 100644 index 0000000000000000000000000000000000000000..48aed9ba055a5508b05b691772942cfb09c0d96e GIT binary patch literal 28656 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 DungeonList | None: + """ + Pages: + in: page_main + """ + if not self.appear(DUNGEON_COMBAT_INTERACT): + logger.info('No dungeon interact') + return None + + ocr = OcrDungeonList(DUNGEON_COMBAT_INTERACT_TEXT) + result = ocr.detect_and_ocr(self.device.image) + + result = ' '.join([row.ocr_text for row in result]) + + # Calyx (Crimson): Bud of XXX -> Bud of XXX + result = re.sub(r'Calyx\s*\(.*?\):*', '', result) + # Stagnant Shadow: Shap XXX -> Shape of XXX + result = re.sub(r'Stagnant\s*Shadow[:\s]*\w*', 'Shape of', result) + # Cavern of Corrosion: Pa XXX -> Path of XXX + result = re.sub(r'Cavern\s*of\s*Corrosion[:\s]*\w*', 'Path of', result) + # Echo of War: XXX -> XXX + result = re.sub(r'Echo\s*of\s*War:*', '', result) + # Divine See -> Divine Seed + result = re.sub(r'Divine\s*\w*', 'Divine Seed', result) + # Destructio Beginning -> Destruction's Beginning + result = re.sub(r"Destruct[a-zA-Z0-9_']*", "Destruction's", result) + + # Dungeons + try: + dungeon = DungeonList.find(result) + logger.attr('DungeonInteract', dungeon) + return dungeon + except ScriptError: + pass + # Simulated Universe returns Simulated_Universe_World_1 + try: + dungeon = DungeonNav.find(result) + if dungeon == KEYWORDS_DUNGEON_NAV.Simulated_Universe: + dungeon = KEYWORDS_DUNGEON_LIST.Simulated_Universe_World_1 + logger.attr('DungeonInteract', dungeon) + return dungeon + except ScriptError: + pass + # Unknown + logger.attr('DungeonInteract', None) + return None + def dungeon_goto(self, dungeon: DungeonList): """ Returns: From b1c3c0caefcdf3658e853f2684dda8580d6fc423 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 2 Nov 2023 19:03:10 +0800 Subject: [PATCH 6/6] Fix: [ALAS] Validate datetime instead of using regex --- module/webui/utils.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/webui/utils.py b/module/webui/utils.py index 7cd3a35ee..e69907e54 100644 --- a/module/webui/utils.py +++ b/module/webui/utils.py @@ -455,7 +455,11 @@ def get_localstorage(key): def re_fullmatch(pattern, string): if pattern == "datetime": - pattern = RE_DATETIME + try: + datetime.datetime.fromisoformat(string) + return True + except ValueError: + return False # elif: return re.fullmatch(pattern=pattern, string=string)