From 2148d722b55fb91afbb2e88e40a64065c29e80fa Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Thu, 6 Aug 2026 20:35:17 +0800 Subject: [PATCH] Add: [CN, JP] island exchange for fish meat --- .../ISLAND_EXCHANGE_CONFIRM.png | Bin 0 -> 10436 bytes .../ISLAND_EXCHANGE_SELECT_ALL.png | Bin 0 -> 9549 bytes .../ISLAND_EXCHANGE_TOTAL_AMOUNT.png | Bin 0 -> 11774 bytes module/island_handler/assets.py | 3 + module/island_handler/exchange.py | 69 ++++++++++++++++++ 5 files changed, 72 insertions(+) create mode 100644 assets/cn/island_handler/ISLAND_EXCHANGE_CONFIRM.png create mode 100644 assets/cn/island_handler/ISLAND_EXCHANGE_SELECT_ALL.png create mode 100644 assets/cn/island_handler/ISLAND_EXCHANGE_TOTAL_AMOUNT.png create mode 100644 module/island_handler/exchange.py diff --git a/assets/cn/island_handler/ISLAND_EXCHANGE_CONFIRM.png b/assets/cn/island_handler/ISLAND_EXCHANGE_CONFIRM.png new file mode 100644 index 0000000000000000000000000000000000000000..42383cd2df6c784a498f5373d5bde74daadf514d GIT binary patch literal 10436 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 Ou;IaxK}Y8$uKf>XArXlH literal 0 HcmV?d00001 diff --git a/assets/cn/island_handler/ISLAND_EXCHANGE_SELECT_ALL.png b/assets/cn/island_handler/ISLAND_EXCHANGE_SELECT_ALL.png new file mode 100644 index 0000000000000000000000000000000000000000..a2284266dad0351740c9188c22050ce845577b71 GIT binary patch literal 9549 zcmeHN3s4)^6?%U+KkNwni=zI~D zbouUd=LaP<=o?$KudEAvaf|D9reV)(=Co4>qB4)fCze46pLn%zDp&M+_owTuUwY*k(vdo?Kkyz+9x zUs}$#?d>k8z1X-jc=^v--u!{8vB=ZhRy8$M8Fj1Z#>j){pv-QnCMWh+WIMisTYkY> zjEz(ehd+}gxud^Rn-Uef^W*lhzdt$ha&O>;rpE`qNGPo>{9)PgYyGX(BYhwAJ!iZU zx9!xst&SVRt($MRR_8qEaiqL(+Hv@kxX8i{k!$PsJ(nKxd|~~ixAqfK^S#n#59@E` z?9cjsK}b_{#F3P`kEgmH-gLjil>Yd#S#olBSEFrLQ$Y9D-&{HN*#tRgKMXyv+|0Z^ zRbt-$&jVkir8lk#_~~F*e_8s0$(pmPw@;aVvH0}<`|3Jkg(vAX?o3eXJIO-_2Vba) zd1G1f&)bXN3s|~z_nk<(t*Z0c53diNuw0#Z>r4BCo4-x zJta+AFG=uV0Ki7`IP9@m?JmrdDD~oE;93yNrLb3pFG-XZnseb)&Pl^+nOcS-Mh{!A zl&+V+2~LW^@(gJ+5TKVR-NEw?OfGl3-7>dI#yKr=gaeD3yY7c-B9g!)%^|x4ULo0DQmr|?r-7Z zjpYDj#-VStaOHz#D$k=`T$z)kjpekRf7%~{BIoQKWlpO%9Ez0FR@w$sU0_zlyeZR7 z=G-|8fdUI_b9k))+4D4cmU%?hJl}*7Z#e#r0P{KAdD^qFdzFEf*^C)DvP^K#WJr_> z^J5f8vJ~dM)Zz-7VJI9?Xmxr-O`#eD*Q@nNyn>(<41+2et`${X*4Q@#tTJ}SQ_WF;UJx?4Y$y8huz{G5D3Roa!rX+rOY?0 zSCVVRc?KAOHNe^_&h2`noX^_mO*}5}sfgEUQH4&2sx|Qnh1$=4GwpPNS`<(fs7$5v znhS}+KsbO}T&Pq4;FW`Duv90F^PDrE zo3BJM@J7|o2wgvYj$)aLf2S=hA2`96^bFPo=CAOId~0eGUFz%kx>nY^m|)nuEHIq( zh2X-=Y0B#-!14`|J8-*&2K&cM!OqIrZzu+}j-qi|uSHN?CgZkSKTDAenB1cA%3xZaD zPxu6w@?t*+!Z6-sHimr~9=iCk;Ox`ZQV4o%%4A5%_gww#dP-(r^77)F1hEpt zfrMkfT+yZP>`b^&teU)cFZ$%2n}d@@w_B=*Mn*@q9M=}Q6a*Ue6x3t7HW8CFVyhZ+ zju#KPk81vL_b&bs7;`)o2p{S@-n^^guf@y~ASjRm<@;>Q;JGN!J9;K388rVB4-ob= zXyn*57IVAX&3zI9oGPG$d_RC$p`Jz4{qNr>9-18Q7+)p~{Vuqx=tuAGlDO7~fq&)H plngM;6G1{G>H+b`v;R&y$0B;P>kbchg%${TFd4HAM>lNW^Dl$l;Gh5i literal 0 HcmV?d00001 diff --git a/assets/cn/island_handler/ISLAND_EXCHANGE_TOTAL_AMOUNT.png b/assets/cn/island_handler/ISLAND_EXCHANGE_TOTAL_AMOUNT.png new file mode 100644 index 0000000000000000000000000000000000000000..708a2313529b8e518de10163e48502b8cbfdbeb7 GIT binary patch literal 11774 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 WhZRKOd0LyCyxezfFWa{N+y4TJZsj@v literal 0 HcmV?d00001 diff --git a/module/island_handler/assets.py b/module/island_handler/assets.py index e45d98257..ff356ceeb 100644 --- a/module/island_handler/assets.py +++ b/module/island_handler/assets.py @@ -9,6 +9,9 @@ ISLAND_DOCK_CHECK = Button(area={'cn': (126, 20, 220, 46), 'en': (126, 20, 220, ISLAND_DOCK_SORTING_CLICK = Button(area={'cn': (115, 608, 266, 641), 'en': (115, 608, 266, 641), 'jp': (115, 608, 266, 641), 'tw': (115, 608, 266, 641)}, color={'cn': (104, 104, 103), 'en': (104, 104, 103), 'jp': (104, 104, 103), 'tw': (104, 104, 103)}, button={'cn': (115, 608, 266, 641), 'en': (115, 608, 266, 641), 'jp': (115, 608, 266, 641), 'tw': (115, 608, 266, 641)}, file={'cn': './assets/cn/island_handler/ISLAND_DOCK_SORTING_CLICK.png', 'en': './assets/cn/island_handler/ISLAND_DOCK_SORTING_CLICK.png', 'jp': './assets/cn/island_handler/ISLAND_DOCK_SORTING_CLICK.png', 'tw': './assets/cn/island_handler/ISLAND_DOCK_SORTING_CLICK.png'}) ISLAND_DOCK_SORT_ASC = Button(area={'cn': (140, 614, 153, 634), 'en': (140, 614, 153, 634), 'jp': (140, 614, 153, 634), 'tw': (140, 614, 153, 634)}, color={'cn': (140, 140, 137), 'en': (140, 140, 137), 'jp': (140, 140, 137), 'tw': (140, 140, 137)}, button={'cn': (140, 614, 153, 634), 'en': (140, 614, 153, 634), 'jp': (140, 614, 153, 634), 'tw': (140, 614, 153, 634)}, file={'cn': './assets/cn/island_handler/ISLAND_DOCK_SORT_ASC.png', 'en': './assets/cn/island_handler/ISLAND_DOCK_SORT_ASC.png', 'jp': './assets/cn/island_handler/ISLAND_DOCK_SORT_ASC.png', 'tw': './assets/cn/island_handler/ISLAND_DOCK_SORT_ASC.png'}) ISLAND_DOCK_SORT_DESC = Button(area={'cn': (141, 616, 152, 634), 'en': (141, 616, 152, 634), 'jp': (141, 616, 152, 634), 'tw': (141, 616, 152, 634)}, color={'cn': (154, 153, 151), 'en': (154, 153, 151), 'jp': (154, 153, 151), 'tw': (154, 153, 151)}, button={'cn': (141, 616, 152, 634), 'en': (141, 616, 152, 634), 'jp': (141, 616, 152, 634), 'tw': (141, 616, 152, 634)}, file={'cn': './assets/cn/island_handler/ISLAND_DOCK_SORT_DESC.png', 'en': './assets/cn/island_handler/ISLAND_DOCK_SORT_DESC.png', 'jp': './assets/cn/island_handler/ISLAND_DOCK_SORT_DESC.png', 'tw': './assets/cn/island_handler/ISLAND_DOCK_SORT_DESC.png'}) +ISLAND_EXCHANGE_CONFIRM = Button(area={'cn': (989, 639, 1046, 668), 'en': (989, 639, 1046, 668), 'jp': (989, 639, 1046, 668), 'tw': (989, 639, 1046, 668)}, color={'cn': (100, 203, 255), 'en': (100, 203, 255), 'jp': (100, 203, 255), 'tw': (100, 203, 255)}, button={'cn': (989, 639, 1046, 668), 'en': (989, 639, 1046, 668), 'jp': (989, 639, 1046, 668), 'tw': (989, 639, 1046, 668)}, file={'cn': './assets/cn/island_handler/ISLAND_EXCHANGE_CONFIRM.png', 'en': './assets/cn/island_handler/ISLAND_EXCHANGE_CONFIRM.png', 'jp': './assets/cn/island_handler/ISLAND_EXCHANGE_CONFIRM.png', 'tw': './assets/cn/island_handler/ISLAND_EXCHANGE_CONFIRM.png'}) +ISLAND_EXCHANGE_SELECT_ALL = Button(area={'cn': (227, 640, 254, 667), 'en': (227, 640, 254, 667), 'jp': (227, 640, 254, 667), 'tw': (227, 640, 254, 667)}, color={'cn': (65, 66, 66), 'en': (65, 66, 66), 'jp': (65, 66, 66), 'tw': (65, 66, 66)}, button={'cn': (227, 640, 254, 667), 'en': (227, 640, 254, 667), 'jp': (227, 640, 254, 667), 'tw': (227, 640, 254, 667)}, file={'cn': './assets/cn/island_handler/ISLAND_EXCHANGE_SELECT_ALL.png', 'en': './assets/cn/island_handler/ISLAND_EXCHANGE_SELECT_ALL.png', 'jp': './assets/cn/island_handler/ISLAND_EXCHANGE_SELECT_ALL.png', 'tw': './assets/cn/island_handler/ISLAND_EXCHANGE_SELECT_ALL.png'}) +ISLAND_EXCHANGE_TOTAL_AMOUNT = Button(area={'cn': (967, 530, 1171, 560), 'en': (967, 530, 1171, 560), 'jp': (967, 530, 1171, 560), 'tw': (967, 530, 1171, 560)}, color={'cn': (228, 236, 234), 'en': (228, 236, 234), 'jp': (228, 236, 234), 'tw': (228, 236, 234)}, button={'cn': (967, 530, 1171, 560), 'en': (967, 530, 1171, 560), 'jp': (967, 530, 1171, 560), 'tw': (967, 530, 1171, 560)}, file={'cn': './assets/cn/island_handler/ISLAND_EXCHANGE_TOTAL_AMOUNT.png', 'en': './assets/cn/island_handler/ISLAND_EXCHANGE_TOTAL_AMOUNT.png', 'jp': './assets/cn/island_handler/ISLAND_EXCHANGE_TOTAL_AMOUNT.png', 'tw': './assets/cn/island_handler/ISLAND_EXCHANGE_TOTAL_AMOUNT.png'}) ISLAND_RESTAURANT_CHECK = Button(area={'cn': (122, 18, 219, 46), 'en': (122, 18, 219, 46), 'jp': (122, 20, 219, 47), 'tw': (122, 18, 219, 46)}, color={'cn': (107, 110, 120), 'en': (107, 110, 120), 'jp': (99, 103, 114), 'tw': (107, 110, 120)}, button={'cn': (122, 18, 219, 46), 'en': (122, 18, 219, 46), 'jp': (122, 20, 219, 47), 'tw': (122, 18, 219, 46)}, file={'cn': './assets/cn/island_handler/ISLAND_RESTAURANT_CHECK.png', 'en': './assets/cn/island_handler/ISLAND_RESTAURANT_CHECK.png', 'jp': './assets/jp/island_handler/ISLAND_RESTAURANT_CHECK.png', 'tw': './assets/cn/island_handler/ISLAND_RESTAURANT_CHECK.png'}) ISLAND_RESTAURANT_EVENT_BUFF = Button(area={'cn': (223, 451, 289, 475), 'en': (223, 451, 289, 475), 'jp': (223, 451, 289, 475), 'tw': (223, 451, 289, 475)}, color={'cn': (147, 165, 144), 'en': (147, 165, 144), 'jp': (147, 165, 144), 'tw': (147, 165, 144)}, button={'cn': (223, 451, 289, 475), 'en': (223, 451, 289, 475), 'jp': (223, 451, 289, 475), 'tw': (223, 451, 289, 475)}, file={'cn': './assets/cn/island_handler/ISLAND_RESTAURANT_EVENT_BUFF.png', 'en': './assets/cn/island_handler/ISLAND_RESTAURANT_EVENT_BUFF.png', 'jp': './assets/cn/island_handler/ISLAND_RESTAURANT_EVENT_BUFF.png', 'tw': './assets/cn/island_handler/ISLAND_RESTAURANT_EVENT_BUFF.png'}) ISLAND_RESTAURANT_EVENT_CHECK = Button(area={'cn': (60, 116, 166, 162), 'en': (60, 116, 166, 162), 'jp': (60, 116, 166, 162), 'tw': (60, 116, 166, 162)}, color={'cn': (192, 191, 191), 'en': (192, 191, 191), 'jp': (192, 191, 191), 'tw': (192, 191, 191)}, button={'cn': (60, 116, 166, 162), 'en': (60, 116, 166, 162), 'jp': (60, 116, 166, 162), 'tw': (60, 116, 166, 162)}, file={'cn': './assets/cn/island_handler/ISLAND_RESTAURANT_EVENT_CHECK.png', 'en': './assets/cn/island_handler/ISLAND_RESTAURANT_EVENT_CHECK.png', 'jp': './assets/cn/island_handler/ISLAND_RESTAURANT_EVENT_CHECK.png', 'tw': './assets/cn/island_handler/ISLAND_RESTAURANT_EVENT_CHECK.png'}) diff --git a/module/island_handler/exchange.py b/module/island_handler/exchange.py new file mode 100644 index 000000000..cfab9d3a4 --- /dev/null +++ b/module/island_handler/exchange.py @@ -0,0 +1,69 @@ +from module.island_handler.shop_ui import IslandShopUI +from module.island_handler.assets import * +from module.logger import logger +from module.ocr.ocr import Digit + + +class IslandExchange(IslandShopUI): + def exchange_fish_meat(self, delta_count): + ocr = Digit(ISLAND_EXCHANGE_TOTAL_AMOUNT, lang='cnocr', letter=(60, 60, 60), threshold=160) + before_amount = None + for _ in self.loop(timeout=3): + before_amount = ocr.ocr(self.device.image) + if before_amount is not None: + break + else: + logger.warning('Unable to read fish amount before exchange') + return False + for _ in self.loop(timeout=3): + if self.handle_island_additional(): + continue + if self.image_color_count(ISLAND_EXCHANGE_SELECT_ALL, color=(255, 255, 255), count=25): + break + if self.appear_then_click(ISLAND_EXCHANGE_SELECT_ALL, offset=(20, 20), interval=1): + continue + else: + logger.warning('No fish available for exchange') + return False + for _ in self.loop(): + if self.handle_island_additional(): + continue + if self.handle_island_popup_confirm('EXCHANGE'): + continue + if self.appear(ISLAND_EXCHANGE_SELECT_ALL, offset=(20, 20)): + break + if self.appear_then_click(ISLAND_EXCHANGE_CONFIRM, offset=(20, 20), interval=1): + continue + after_amount = before_amount + exchanged_amount = 0 + for _ in self.loop(timeout=3): + if self.handle_island_additional(): + continue + after_amount = ocr.ocr(self.device.image) + if after_amount is None: + continue + exchanged_amount = after_amount - before_amount + if exchanged_amount >= delta_count: + return True + else: + logger.warning( + f'Exchange failed, expected {delta_count}, ' + f'but got {exchanged_amount} ({before_amount} -> {after_amount})' + ) + return False + + def island_shop_exchange(self, require_dict={}): + success = True + if 2521 in require_dict.keys(): + # 2521 means Freshwater Fish Meat + self.island_shop_side_navbar_ensure(main_index=6, sub_index=0) + success = self.exchange_fish_meat(delta_count=require_dict[2521]) and success + if 2522 in require_dict.keys(): + # 2522 means Saltwater Fish Meat + self.island_shop_side_navbar_ensure(main_index=6, sub_index=1) + success = self.exchange_fish_meat(delta_count=require_dict[2522]) and success + return success + + def island_shop_exchange_all_fish_meat(self): + """Exchange all available freshwater and saltwater fish in one visit.""" + return self.island_shop_exchange({2521: 0, 2522: 0})