diff --git a/assets/cn/freebies/MAIL_COLLECT.png b/assets/cn/freebies/MAIL_COLLECT.png deleted file mode 100644 index c681535d1..000000000 Binary files a/assets/cn/freebies/MAIL_COLLECT.png and /dev/null differ diff --git a/assets/cn/freebies/MAIL_COLLECTED.png b/assets/cn/freebies/MAIL_COLLECTED.png deleted file mode 100644 index 95e055b52..000000000 Binary files a/assets/cn/freebies/MAIL_COLLECTED.png and /dev/null differ diff --git a/assets/cn/freebies/MAIL_DELETE.png b/assets/cn/freebies/MAIL_DELETE.png deleted file mode 100644 index 9d7e3dd83..000000000 Binary files a/assets/cn/freebies/MAIL_DELETE.png and /dev/null differ diff --git a/assets/cn/freebies/MAIL_EMPTY.png b/assets/cn/freebies/MAIL_EMPTY.png deleted file mode 100644 index e6d090777..000000000 Binary files a/assets/cn/freebies/MAIL_EMPTY.png and /dev/null differ diff --git a/assets/cn/freebies/MAIL_GUILD_MESSAGE.png b/assets/cn/freebies/MAIL_GUILD_MESSAGE.png deleted file mode 100644 index 3760b1823..000000000 Binary files a/assets/cn/freebies/MAIL_GUILD_MESSAGE.png and /dev/null differ diff --git a/assets/cn/map/FLEET_2_IN_USE.png b/assets/cn/map/FLEET_2_IN_USE.png index 56cb0e27d..8e24f83ee 100644 Binary files a/assets/cn/map/FLEET_2_IN_USE.png and b/assets/cn/map/FLEET_2_IN_USE.png differ diff --git a/assets/cn/map/FLEET_2_IN_USE_W15.png b/assets/cn/map/FLEET_2_IN_USE_W15.png new file mode 100644 index 000000000..70a50d3f3 Binary files /dev/null and b/assets/cn/map/FLEET_2_IN_USE_W15.png differ diff --git a/assets/en/commission/COMMISSION_ADVICE.png b/assets/en/commission/COMMISSION_ADVICE.png index b9dc992cf..2934cc6c4 100644 Binary files a/assets/en/commission/COMMISSION_ADVICE.png and b/assets/en/commission/COMMISSION_ADVICE.png differ diff --git a/assets/en/commission/COMMISSION_START.png b/assets/en/commission/COMMISSION_START.png index 1f337decb..0bae2ee65 100644 Binary files a/assets/en/commission/COMMISSION_START.png and b/assets/en/commission/COMMISSION_START.png differ diff --git a/assets/en/freebies/MAIL_COLLECTED.png b/assets/en/freebies/MAIL_COLLECTED.png deleted file mode 100644 index 06916e940..000000000 Binary files a/assets/en/freebies/MAIL_COLLECTED.png and /dev/null differ diff --git a/assets/en/freebies/MAIL_EMPTY.png b/assets/en/freebies/MAIL_EMPTY.png deleted file mode 100644 index 19fd5410e..000000000 Binary files a/assets/en/freebies/MAIL_EMPTY.png and /dev/null differ diff --git a/assets/en/freebies/MAIL_GUILD_MESSAGE.png b/assets/en/freebies/MAIL_GUILD_MESSAGE.png deleted file mode 100644 index 3760b1823..000000000 Binary files a/assets/en/freebies/MAIL_GUILD_MESSAGE.png and /dev/null differ diff --git a/assets/en/map/FLEET_2_IN_USE.png b/assets/en/map/FLEET_2_IN_USE.png index 2d45071e5..4ef1512ec 100644 Binary files a/assets/en/map/FLEET_2_IN_USE.png and b/assets/en/map/FLEET_2_IN_USE.png differ diff --git a/assets/en/map/FLEET_2_IN_USE_W15.png b/assets/en/map/FLEET_2_IN_USE_W15.png new file mode 100644 index 000000000..1a8247cec Binary files /dev/null and b/assets/en/map/FLEET_2_IN_USE_W15.png differ diff --git a/assets/en/ui/MISSION_CHECK.png b/assets/en/ui/MISSION_CHECK.png index a9b1bebec..fe575df7d 100644 Binary files a/assets/en/ui/MISSION_CHECK.png and b/assets/en/ui/MISSION_CHECK.png differ diff --git a/assets/jp/freebies/MAIL_COLLECT.png b/assets/jp/freebies/MAIL_COLLECT.png deleted file mode 100644 index b6db5cf4f..000000000 Binary files a/assets/jp/freebies/MAIL_COLLECT.png and /dev/null differ diff --git a/assets/jp/freebies/MAIL_COLLECTED.png b/assets/jp/freebies/MAIL_COLLECTED.png deleted file mode 100644 index 32afefa0e..000000000 Binary files a/assets/jp/freebies/MAIL_COLLECTED.png and /dev/null differ diff --git a/assets/jp/freebies/MAIL_DELETE.png b/assets/jp/freebies/MAIL_DELETE.png deleted file mode 100644 index 70bddf4c2..000000000 Binary files a/assets/jp/freebies/MAIL_DELETE.png and /dev/null differ diff --git a/assets/jp/freebies/MAIL_EMPTY.png b/assets/jp/freebies/MAIL_EMPTY.png deleted file mode 100644 index 639b2e0b6..000000000 Binary files a/assets/jp/freebies/MAIL_EMPTY.png and /dev/null differ diff --git a/assets/jp/freebies/MAIL_GUILD_MESSAGE.png b/assets/jp/freebies/MAIL_GUILD_MESSAGE.png deleted file mode 100644 index 3760b1823..000000000 Binary files a/assets/jp/freebies/MAIL_GUILD_MESSAGE.png and /dev/null differ diff --git a/assets/jp/map/FLEET_2_IN_USE.png b/assets/jp/map/FLEET_2_IN_USE.png deleted file mode 100644 index 56cb0e27d..000000000 Binary files a/assets/jp/map/FLEET_2_IN_USE.png and /dev/null differ diff --git a/assets/tw/freebies/BATTLE_PASS_RED_DOT.png b/assets/tw/freebies/BATTLE_PASS_RED_DOT.png index 6ce917a5c..f8859acef 100644 Binary files a/assets/tw/freebies/BATTLE_PASS_RED_DOT.png and b/assets/tw/freebies/BATTLE_PASS_RED_DOT.png differ diff --git a/assets/tw/freebies/MAIL_COLLECT.png b/assets/tw/freebies/MAIL_COLLECT.png deleted file mode 100644 index 09fac657a..000000000 Binary files a/assets/tw/freebies/MAIL_COLLECT.png and /dev/null differ diff --git a/assets/tw/freebies/MAIL_COLLECTED.png b/assets/tw/freebies/MAIL_COLLECTED.png deleted file mode 100644 index e87cc79b8..000000000 Binary files a/assets/tw/freebies/MAIL_COLLECTED.png and /dev/null differ diff --git a/assets/tw/freebies/MAIL_DELETE.png b/assets/tw/freebies/MAIL_DELETE.png deleted file mode 100644 index 85b2be25c..000000000 Binary files a/assets/tw/freebies/MAIL_DELETE.png and /dev/null differ diff --git a/assets/tw/freebies/MAIL_GUILD_MESSAGE.png b/assets/tw/freebies/MAIL_GUILD_MESSAGE.png deleted file mode 100644 index 3760b1823..000000000 Binary files a/assets/tw/freebies/MAIL_GUILD_MESSAGE.png and /dev/null differ diff --git a/assets/tw/map/FLEET_2_IN_USE.png b/assets/tw/map/FLEET_2_IN_USE.png deleted file mode 100644 index 776c625a7..000000000 Binary files a/assets/tw/map/FLEET_2_IN_USE.png and /dev/null differ diff --git a/assets/tw/shop/NAV_GENERAL.png b/assets/tw/shop/NAV_GENERAL.png new file mode 100644 index 000000000..32bed8683 Binary files /dev/null and b/assets/tw/shop/NAV_GENERAL.png differ diff --git a/assets/tw/shop/NAV_MONTHLY.png b/assets/tw/shop/NAV_MONTHLY.png new file mode 100644 index 000000000..5936464a9 Binary files /dev/null and b/assets/tw/shop/NAV_MONTHLY.png differ diff --git a/assets/tw/shop/TAB_CORE_LIMITED.png b/assets/tw/shop/TAB_CORE_LIMITED.png new file mode 100644 index 000000000..1b344fd9c Binary files /dev/null and b/assets/tw/shop/TAB_CORE_LIMITED.png differ diff --git a/assets/tw/shop/TAB_CORE_MONTHLY.png b/assets/tw/shop/TAB_CORE_MONTHLY.png new file mode 100644 index 000000000..36eae196c Binary files /dev/null and b/assets/tw/shop/TAB_CORE_MONTHLY.png differ diff --git a/assets/en/freebies/MAIL_DELETE.png b/assets/tw/shop/TAB_GENERAL.png similarity index 58% rename from assets/en/freebies/MAIL_DELETE.png rename to assets/tw/shop/TAB_GENERAL.png index c98e9c3c5..c561a4af0 100644 Binary files a/assets/en/freebies/MAIL_DELETE.png and b/assets/tw/shop/TAB_GENERAL.png differ diff --git a/assets/tw/shop/TAB_GUILD.png b/assets/tw/shop/TAB_GUILD.png new file mode 100644 index 000000000..ee65e29d7 Binary files /dev/null and b/assets/tw/shop/TAB_GUILD.png differ diff --git a/assets/tw/shop/TAB_MEDAL.png b/assets/tw/shop/TAB_MEDAL.png new file mode 100644 index 000000000..dc14d7bd9 Binary files /dev/null and b/assets/tw/shop/TAB_MEDAL.png differ diff --git a/assets/tw/shop/TAB_MERIT.png b/assets/tw/shop/TAB_MERIT.png new file mode 100644 index 000000000..7f614bef3 Binary files /dev/null and b/assets/tw/shop/TAB_MERIT.png differ diff --git a/assets/tw/shop/TAB_PRIZE.png b/assets/tw/shop/TAB_PRIZE.png new file mode 100644 index 000000000..ec1fa8b6f Binary files /dev/null and b/assets/tw/shop/TAB_PRIZE.png differ diff --git a/assets/en/freebies/MAIL_COLLECT.png b/assets/tw/shop/TAB_PROTOTYPE.png similarity index 50% rename from assets/en/freebies/MAIL_COLLECT.png rename to assets/tw/shop/TAB_PROTOTYPE.png index 8f7de404b..3f25df7dd 100644 Binary files a/assets/en/freebies/MAIL_COLLECT.png and b/assets/tw/shop/TAB_PROTOTYPE.png differ diff --git a/assets/tw/ui/MUNITIONS_CHECK.png b/assets/tw/ui/MUNITIONS_CHECK.png index 9d9b6e8ba..586967046 100644 Binary files a/assets/tw/ui/MUNITIONS_CHECK.png and b/assets/tw/ui/MUNITIONS_CHECK.png differ diff --git a/assets/tw/ui/REWARD_GOTO_BATTLE_PASS.png b/assets/tw/ui/REWARD_GOTO_BATTLE_PASS.png new file mode 100644 index 000000000..fad8b6f9d Binary files /dev/null and b/assets/tw/ui/REWARD_GOTO_BATTLE_PASS.png differ diff --git a/assets/tw/ui/SUPPLY_PACK_CHECK.png b/assets/tw/ui/SUPPLY_PACK_CHECK.png index fe22c4c30..fbcef935a 100644 Binary files a/assets/tw/ui/SUPPLY_PACK_CHECK.png and b/assets/tw/ui/SUPPLY_PACK_CHECK.png differ diff --git a/assets/tw/ui_white/POPUP_CONFIRM_WHITE.png b/assets/tw/ui_white/POPUP_CONFIRM_WHITE.png new file mode 100644 index 000000000..f8a21b1f5 Binary files /dev/null and b/assets/tw/ui_white/POPUP_CONFIRM_WHITE.png differ diff --git a/campaign/Readme.md b/campaign/Readme.md index 84da7027a..7a43473b6 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -262,3 +262,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250919 | event 20250912 cn | A Dance for Amahara Above | - | - | - | 起舞於天原之上 | | 20251009 | coalition 20250626 | The Neon City Investigator | - | - | - | 迷彩都市的尋蹤者 | | 20251016 | event 20230817 cn | The Fool's Scales | 复刻愚者的天平 | The Fool's Scales Rerun | 愚者の天秤(復刻) | - | +| 20251023 | event 20251023 cn | Tempesta and Islas de Libertád | 飓风与自由群岛 | Tempesta and Islas de Libertád | テンペスタと自由群島 | - | diff --git a/campaign/event_20251023_cn/campaign_base.py b/campaign/event_20251023_cn/campaign_base.py new file mode 100644 index 000000000..835eafc55 --- /dev/null +++ b/campaign/event_20251023_cn/campaign_base.py @@ -0,0 +1,25 @@ +from module.campaign.campaign_base import CampaignBase as CampaignBase_ +from module.logger import logger + + +class CampaignBase(CampaignBase_): + def campaign_set_chapter_20241219(self, chapter, stage, mode='combat'): + if self.config.MAP_CHAPTER_SWITCH_20241219: + if chapter in ['t']: + self.ui_goto_sp() + self.campaign_ensure_mode_20241219('combat') + if stage in ['1', '2', '3']: + self.campaign_ensure_aside_20241219('part1') + elif stage in ['4', '5', '6']: + self.campaign_ensure_aside_20241219('part2') + else: + logger.warning(f'Stage {chapter}{stage} is not in event_20241024') + self.campaign_ensure_chapter(chapter) + return True + if chapter in ['ex_sp']: + self.ui_goto_sp() + self.campaign_ensure_mode_20241219('combat') + self.campaign_ensure_aside_20241219('sp') + self.campaign_ensure_chapter(chapter) + return True + return super().campaign_set_chapter_20241219(chapter, stage, mode) diff --git a/campaign/event_20251023_cn/sp.py b/campaign/event_20251023_cn/sp.py new file mode 100644 index 000000000..72867a35c --- /dev/null +++ b/campaign/event_20251023_cn/sp.py @@ -0,0 +1,120 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('SP') +MAP.shape = 'I9' +MAP.camera_data = ['E3', 'E6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['F3', 'F6'] +MAP.map_data = """ + ++ ++ -- ++ ++ ++ -- ++ ++ + ++ ++ -- ME -- ME -- ++ ++ + ++ ME -- -- -- -- -- -- ++ + -- -- -- ME -- MS -- -- SP + -- MB -- -- ++ -- MS __ -- + -- -- -- ME -- MS -- -- SP + ++ ME -- -- -- -- -- -- ++ + ++ ++ -- ME -- ME -- ++ ++ + ++ ++ -- ++ ++ ++ -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 8, 'siren': 3}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6}, + {'battle': 7, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = False + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_IS_ONE_TIME_STAGE = True + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 210 + # too many islands on top + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-right' + MAP_SWIPE_MULTIPLY = (1.115, 1.136) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.078, 1.098) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.047, 1.065) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def map_data_init(self, map_): + super().map_data_init(map_) + F4.is_siren = True + F6.is_siren = True + G5.is_siren = True + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=2): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_7(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251023_cn/t1.py b/campaign/event_20251023_cn/t1.py new file mode 100644 index 000000000..e11483e1b --- /dev/null +++ b/campaign/event_20251023_cn/t1.py @@ -0,0 +1,95 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('T1') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + -- -- ME -- ++ -- -- ++ ++ + ++ Me -- -- Me -- MB ++ ++ + ++ -- __ -- -- -- -- MB -- + SP -- -- MS ++ ME -- -- -- + SP -- -- MS ++ ME -- ME -- + -- -- -- -- -- -- ++ -- -- + ME -- Me -- ME -- -- ME -- + ++ -- ++ ++ ++ -- -- ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 210 + MAP_SIREN_HAS_BOSS_ICON_SMALL = True + MAP_SWIPE_MULTIPLY = (1.089, 1.109) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.053, 1.072) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.022, 1.041) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20251023_cn/t2.py b/campaign/event_20251023_cn/t2.py new file mode 100644 index 000000000..0e43eee70 --- /dev/null +++ b/campaign/event_20251023_cn/t2.py @@ -0,0 +1,81 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T2') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + ++ -- SP -- -- -- ++ -- -- + ++ SP -- -- MS -- ++ -- -- + -- -- -- MS -- __ Me -- ++ + -- -- ++ ++ Me -- -- -- ME + ++ MS ++ ++ -- -- Me -- -- + ME -- -- ME -- ME ++ ++ ME + -- ME -- -- -- -- MB ++ -- + ++ ++ ++ ME -- ME -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + # topleft is spawn points + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'top-right' + MAP_SWIPE_MULTIPLY = (1.255, 1.279) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.214, 1.236) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.179, 1.200) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20251023_cn/t3.py b/campaign/event_20251023_cn/t3.py new file mode 100644 index 000000000..bd45283b9 --- /dev/null +++ b/campaign/event_20251023_cn/t3.py @@ -0,0 +1,79 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T3') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D5', 'G3', 'G5'] +MAP.camera_data_spawn_point = ['G5', 'D5'] +MAP.map_data = """ + -- -- ++ -- -- -- -- -- -- -- + -- ME ++ Me ++ ++ Me ++ ++ ++ + ME -- -- -- ++ ++ -- ME -- ME + -- ME ++ __ MS MS __ -- Me -- + -- -- -- MS MB MB MS -- -- ++ + ++ ME -- -- -- -- -- -- -- ME + -- -- ++ ++ SP SP ++ ++ ME -- + -- -- ++ ++ -- -- ++ ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + # swipe multiply same as T1 + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251023_cn/t4.py b/campaign/event_20251023_cn/t4.py new file mode 100644 index 000000000..671bddcf9 --- /dev/null +++ b/campaign/event_20251023_cn/t4.py @@ -0,0 +1,78 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T4') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['D3'] +MAP.map_data = """ + -- -- ++ -- -- -- -- -- -- -- + -- ME ++ Me ++ ++ Me ++ ++ ++ + ME -- -- -- ++ ++ -- ME -- ME + -- ME ++ -- SP SP -- -- Me -- + -- -- -- -- -- -- -- -- -- ++ + ++ ME -- MS __ __ MS -- -- ME + -- -- ++ ++ MS MS ++ ++ ME -- + -- -- ++ ++ MB MB ++ ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + # swipe multiply same as T1 + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251023_cn/t5.py b/campaign/event_20251023_cn/t5.py new file mode 100644 index 000000000..ac8c46d7c --- /dev/null +++ b/campaign/event_20251023_cn/t5.py @@ -0,0 +1,93 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T5') +MAP.shape = 'H10' +MAP.camera_data = ['D4', 'D7', 'E4', 'E7'] +MAP.camera_data_spawn_point = ['D7'] +MAP.map_data = """ + -- -- ++ ++ -- -- -- ++ + -- ++ ++ ++ ME -- MB -- + -- ME -- -- -- -- -- -- + ME -- -- ME -- ME ME -- + ++ MS MS ++ -- ++ ++ -- + ++ -- -- MS -- Me ++ ME + ME -- -- -- __ -- ME -- + -- SP SP -- -- -- -- -- + -- ++ ++ -- Me -- Me -- + -- ++ ++ -- ++ ++ ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ +A9, B9, C9, D9, E9, F9, G9, H9, \ +A10, B10, C10, D10, E10, F10, G10, H10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + # swipe multiply same as T1 + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251023_cn/t6.py b/campaign/event_20251023_cn/t6.py new file mode 100644 index 000000000..b08e8de01 --- /dev/null +++ b/campaign/event_20251023_cn/t6.py @@ -0,0 +1,88 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T6') +MAP.shape = 'K7' +MAP.camera_data = ['E4', 'H4'] +MAP.camera_data_spawn_point = ['D4'] +MAP.map_data = """ + ++ ++ -- -- ++ -- -- -- -- -- ++ + ++ ++ -- MS ++ Me ++ ++ ++ Me -- + -- SP -- -- MS -- ME ME ME -- ME + -- -- -- __ MB -- -- -- -- -- ++ + -- SP -- -- MS -- ME ME ME -- ME + ++ ++ -- MS ++ Me ++ ++ ++ Me -- + ++ ++ -- -- ++ -- -- -- -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + # Big boss at the middle + MAP_SWIPE_PREDICT_WITH_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.171, 1.193) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.132, 1.153) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.099, 1.119) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/module/base/base.py b/module/base/base.py index 293e447e1..eb3a4e8af 100644 --- a/module/base/base.py +++ b/module/base/base.py @@ -146,7 +146,11 @@ class ModuleBase: skip_first = False else: self.device.screenshot() - yield self.device.image + try: + yield self.device.image + except AttributeError: + self.device.screenshot() + yield self.device.image def loop_hierarchy(self, skip_first=True): """ diff --git a/module/base/timer.py b/module/base/timer.py index 66370bbdc..081c53a6e 100644 --- a/module/base/timer.py +++ b/module/base/timer.py @@ -1,16 +1,19 @@ -import time +from time import time, sleep from datetime import datetime, timedelta from functools import wraps def timer(function): + """ + Decorator to time a function, for debug only + """ + @wraps(function) def function_timer(*args, **kwargs): - t0 = time.time() - + start = time() result = function(*args, **kwargs) - t1 = time.time() - print('%s: %s s' % (function.__name__, str(round(t1 - t0, 10)))) + cost = time() - start + print(f'{function.__name__}: {cost:.10f} s') return result return function_timer @@ -72,62 +75,105 @@ def time_range_active(time_range): class Timer: def __init__(self, limit, count=0): """ + Dual timer for time count and access count. + Access count can provide robustness on slow devices where screen shot time cost > timer.limit + Args: - limit (int, float): Timer limit - count (int): Timer reach confirm count. Default to 0. - When using a structure like this, must set a count. - Otherwise it goes wrong, if screenshot time cost greater than limit. - - if self.appear(MAIN_CHECK): - if confirm_timer.reached(): - pass - else: - confirm_timer.reset() - - Also, It's a good idea to set `count`, to make alas run more stable on slow computers. - Expected speed is 0.35 second / screenshot. + limit (int | float): Timer limit + count (int): Timer access count. Default to 0. """ self.limit = limit self.count = count - self._current = 0 - self._reach_count = count + self._start = 0. + self._access = 0 + + @classmethod + def from_seconds(cls, limit, speed=0.5): + """ + Create timer from given seconds + + Args: + limit (int | float): + speed (int | float): Approximate screen shot time cost + if time cost > 0.5s, device is considered slow + """ + count = int(limit / speed) + return cls(limit, count=count) def start(self): - if not self.started(): - self._current = time.time() - self._reach_count = 0 + """ + Start current timer. + If timer not started, reached() always return True. So we can have fast first try on: + + interval = Timer(2) + while 1: + if interval.reached(): + pass + """ + if self._start <= 0: + self._start = time() + self._access = 0 return self def started(self): - return bool(self._current) - - def current(self): """ Returns: - float + bool: """ - if self.started(): - return time.time() - self._current + return self._start > 0 + + def current_time(self): + """ + Returns: + float: + """ + if self._start > 0: + diff = time() - self._start + if diff < 0: + diff = 0. + return diff else: return 0. + def current_count(self): + """ + Returns: + int: + """ + return self._access + + def add_count(self): + self._access += 1 + return self + def reached(self): """ Returns: - bool + bool: """ - self._reach_count += 1 - return time.time() - self._current > self.limit and self._reach_count > self.count + # each reached() call is consider as an access + self._access += 1 + if self._start > 0: + return self._access > self.count and time() - self._start > self.limit + else: + # not started, return True for fast first try + return True def reset(self): - self._current = time.time() - self._reach_count = 0 + """ + Reset the timer as if it just started + """ + self._start = time() + self._access = 0 return self def clear(self): - self._current = 0 - self._reach_count = self.count + """ + Reset the timer as if it never started + """ + self._start = 0. + self._access = self.count return self def reached_and_reset(self): @@ -145,16 +191,17 @@ class Timer: """ Wait until timer reached. """ - diff = self._current + self.limit - time.time() + diff = self._start + self.limit - time() if diff > 0: - time.sleep(diff) + sleep(diff) def show(self): from module.logger import logger logger.info(str(self)) def __str__(self): - return f'Timer(limit={round(self.current(), 3)}/{self.limit}, count={self._reach_count}/{self.count})' + # Timer(limit=2.351/3, count=4/6) + return f'Timer(limit={round(self.current_time(), 3)}/{self.limit}, count={self._access}/{self.count})' __repr__ = __str__ diff --git a/module/campaign/run.py b/module/campaign/run.py index 39ce6204b..ad3251c54 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -218,6 +218,7 @@ class CampaignRun(CampaignEvent): 'event_20250424_cn', 'event_20250724_cn', 'event_20250814_cn', + 'event_20251023_cn', 'war_archives_20231026_cn', ]: name = convert.get(name, name) @@ -252,6 +253,7 @@ class CampaignRun(CampaignEvent): 'event_20250424_cn', 'event_20250724_cn', 'event_20250814_cn', + 'event_20251023_cn', 'war_archives_20231026_cn', ]: name = convert.get(name, name) diff --git a/module/combat/auto_search_combat.py b/module/combat/auto_search_combat.py index 6d9643027..5dbf43393 100644 --- a/module/combat/auto_search_combat.py +++ b/module/combat/auto_search_combat.py @@ -39,11 +39,7 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): out: is_combat_loading """ self.interval_reset(AUTO_SEARCH_MAP_OPTION_ON) - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + for _ in self.loop(): if self.handle_auto_search_map_option(): self.interval_reset(AUTO_SEARCH_MAP_OPTION_ON) @@ -152,11 +148,7 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): out: in_map() """ timeout = Timer(3, count=6).start() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + for _ in self.loop(): if self.is_in_map(): break @@ -175,11 +167,7 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): checked_fleet = False checked_oil = False checked_coin = False - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + for _ in self.loop(): if self.is_auto_search_running(): checked_fleet = self.auto_search_watch_fleet(checked_fleet) @@ -225,8 +213,7 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): self.device.stuck_record_clear() self.device.click_record_clear() self.device.screenshot_interval_set('combat') - while 1: - self.device.screenshot() + for _ in self.loop(): if self.handle_combat_automation_confirm(): continue @@ -256,8 +243,7 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): self.emotion.reduce(fleet_index) auto = self.config.Fleet_Fleet1Mode if fleet_index == 1 else self.config.Fleet_Fleet2Mode - while 1: - self.device.screenshot() + for _ in self.loop(): if self.handle_submarine_call(submarine_mode): continue @@ -296,7 +282,7 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): self.device.screenshot_interval_set() break - def auto_search_combat_status(self, skip_first_screenshot=True): + def auto_search_combat_status(self): """ Pages: in: any @@ -307,11 +293,7 @@ class AutoSearchCombat(MapOperation, Combat, CampaignStatus): self.device.click_record_clear() exp_info = False # This is for the white screen bug in game - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + for _ in self.loop(): # End if self.is_auto_search_running(): diff --git a/module/combat/combat.py b/module/combat/combat.py index 384419a5a..54ba73969 100644 --- a/module/combat/combat.py +++ b/module/combat/combat.py @@ -197,11 +197,7 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan if balance_hp: self.hp_balance() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + for _ in self.loop(): if self.appear(BATTLE_PREPARATION, offset=(20, 20)): if self.handle_combat_automation_set(auto=auto == 'combat_auto'): @@ -328,8 +324,7 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan confirm_timer = Timer(10) confirm_timer.start() - while 1: - self.device.screenshot() + for _ in self.loop(): if not confirm_timer.reached(): if self.handle_combat_automation_confirm(): @@ -518,8 +513,7 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan self.device.click_record_clear() battle_status = False exp_info = False # This is for the white screen bug in game - while 1: - self.device.screenshot() + for _ in self.loop(): # Expected end if isinstance(expected_end, str): diff --git a/module/commission/assets.py b/module/commission/assets.py index 703630296..830a4c61a 100644 --- a/module/commission/assets.py +++ b/module/commission/assets.py @@ -4,11 +4,11 @@ from module.base.template import Template # This file was automatically generated by dev_tools/button_extract.py. # Don't modify it manually. -COMMISSION_ADVICE = Button(area={'cn': (871, 322, 999, 383), 'en': (871, 328, 1000, 379), 'jp': (872, 344, 993, 373), 'tw': (869, 325, 999, 388)}, color={'cn': (230, 177, 116), 'en': (231, 178, 117), 'jp': (224, 179, 119), 'tw': (231, 180, 120)}, button={'cn': (871, 322, 999, 383), 'en': (871, 328, 1000, 379), 'jp': (870, 335, 1000, 399), 'tw': (869, 325, 999, 388)}, file={'cn': './assets/cn/commission/COMMISSION_ADVICE.png', 'en': './assets/en/commission/COMMISSION_ADVICE.png', 'jp': './assets/jp/commission/COMMISSION_ADVICE.png', 'tw': './assets/tw/commission/COMMISSION_ADVICE.png'}) +COMMISSION_ADVICE = Button(area={'cn': (871, 322, 999, 383), 'en': (871, 328, 998, 362), 'jp': (872, 344, 993, 373), 'tw': (869, 325, 999, 388)}, color={'cn': (230, 177, 116), 'en': (225, 181, 121), 'jp': (224, 179, 119), 'tw': (231, 180, 120)}, button={'cn': (871, 322, 999, 383), 'en': (871, 328, 998, 362), 'jp': (870, 335, 1000, 399), 'tw': (869, 325, 999, 388)}, file={'cn': './assets/cn/commission/COMMISSION_ADVICE.png', 'en': './assets/en/commission/COMMISSION_ADVICE.png', 'jp': './assets/jp/commission/COMMISSION_ADVICE.png', 'tw': './assets/tw/commission/COMMISSION_ADVICE.png'}) COMMISSION_DAILY = Button(area={'cn': (35, 132, 67, 186), 'en': (30, 126, 75, 188), 'jp': (17, 168, 82, 185), 'tw': (35, 132, 67, 186)}, color={'cn': (208, 172, 118), 'en': (170, 132, 92), 'jp': (148, 115, 76), 'tw': (208, 171, 119)}, button={'cn': (35, 132, 67, 186), 'en': (30, 126, 75, 188), 'jp': (17, 168, 82, 185), 'tw': (35, 132, 67, 186)}, file={'cn': './assets/cn/commission/COMMISSION_DAILY.png', 'en': './assets/en/commission/COMMISSION_DAILY.png', 'jp': './assets/jp/commission/COMMISSION_DAILY.png', 'tw': './assets/tw/commission/COMMISSION_DAILY.png'}) COMMISSION_HAS_PENDING = Button(area={'cn': (320, 288, 380, 338), 'en': (320, 288, 380, 338), 'jp': (320, 288, 380, 338), 'tw': (320, 288, 380, 338)}, color={'cn': (121, 113, 152), 'en': (121, 113, 152), 'jp': (121, 113, 152), 'tw': (121, 113, 152)}, button={'cn': (320, 288, 380, 338), 'en': (320, 288, 380, 338), 'jp': (320, 288, 380, 338), 'tw': (320, 288, 380, 338)}, file={'cn': './assets/cn/commission/COMMISSION_HAS_PENDING.png', 'en': './assets/en/commission/COMMISSION_HAS_PENDING.png', 'jp': './assets/jp/commission/COMMISSION_HAS_PENDING.png', 'tw': './assets/tw/commission/COMMISSION_HAS_PENDING.png'}) COMMISSION_SCROLL_AREA = Button(area={'cn': (1254, 77, 1261, 676), 'en': (1254, 77, 1261, 676), 'jp': (1254, 77, 1261, 676), 'tw': (1254, 77, 1261, 676)}, color={'cn': (213, 183, 66), 'en': (213, 183, 66), 'jp': (213, 183, 66), 'tw': (213, 183, 66)}, button={'cn': (1254, 77, 1261, 676), 'en': (1254, 77, 1261, 676), 'jp': (1254, 77, 1261, 676), 'tw': (1254, 77, 1261, 676)}, file={'cn': './assets/cn/commission/COMMISSION_SCROLL_AREA.png', 'en': './assets/en/commission/COMMISSION_SCROLL_AREA.png', 'jp': './assets/jp/commission/COMMISSION_SCROLL_AREA.png', 'tw': './assets/tw/commission/COMMISSION_SCROLL_AREA.png'}) -COMMISSION_START = Button(area={'cn': (1028, 322, 1156, 383), 'en': (1066, 342, 1117, 358), 'jp': (1033, 340, 1153, 376), 'tw': (1027, 326, 1157, 389)}, color={'cn': (229, 175, 113), 'en': (236, 197, 150), 'jp': (231, 184, 121), 'tw': (231, 180, 120)}, button={'cn': (1028, 322, 1156, 383), 'en': (1066, 342, 1117, 358), 'jp': (1033, 340, 1153, 376), 'tw': (1027, 326, 1157, 389)}, file={'cn': './assets/cn/commission/COMMISSION_START.png', 'en': './assets/en/commission/COMMISSION_START.png', 'jp': './assets/jp/commission/COMMISSION_START.png', 'tw': './assets/tw/commission/COMMISSION_START.png'}) +COMMISSION_START = Button(area={'cn': (1028, 322, 1156, 383), 'en': (1053, 333, 1134, 361), 'jp': (1033, 340, 1153, 376), 'tw': (1027, 326, 1157, 389)}, color={'cn': (229, 175, 113), 'en': (237, 199, 149), 'jp': (231, 184, 121), 'tw': (231, 180, 120)}, button={'cn': (1028, 322, 1156, 383), 'en': (1053, 333, 1134, 361), 'jp': (1033, 340, 1153, 376), 'tw': (1027, 326, 1157, 389)}, file={'cn': './assets/cn/commission/COMMISSION_START.png', 'en': './assets/en/commission/COMMISSION_START.png', 'jp': './assets/jp/commission/COMMISSION_START.png', 'tw': './assets/tw/commission/COMMISSION_START.png'}) COMMISSION_URGENT = Button(area={'cn': (35, 231, 68, 281), 'en': (28, 221, 76, 283), 'jp': (34, 266, 68, 279), 'tw': (35, 229, 69, 280)}, color={'cn': (215, 188, 124), 'en': (169, 138, 95), 'jp': (216, 190, 111), 'tw': (213, 186, 123)}, button={'cn': (35, 231, 68, 281), 'en': (28, 221, 76, 283), 'jp': (34, 266, 68, 279), 'tw': (35, 229, 69, 280)}, file={'cn': './assets/cn/commission/COMMISSION_URGENT.png', 'en': './assets/en/commission/COMMISSION_URGENT.png', 'jp': './assets/jp/commission/COMMISSION_URGENT.png', 'tw': './assets/tw/commission/COMMISSION_URGENT.png'}) EXP_INFO_S_REWARD = Button(area={'cn': (498, 140, 557, 154), 'en': (1138, 40, 1266, 145), 'jp': (498, 140, 557, 154), 'tw': (498, 140, 557, 154)}, color={'cn': (233, 241, 127), 'en': (89, 115, 159), 'jp': (233, 241, 127), 'tw': (233, 241, 127)}, button={'cn': (498, 140, 557, 154), 'en': (1138, 40, 1266, 145), 'jp': (498, 140, 557, 154), 'tw': (498, 140, 557, 154)}, file={'cn': './assets/cn/commission/EXP_INFO_S_REWARD.png', 'en': './assets/en/commission/EXP_INFO_S_REWARD.png', 'jp': './assets/jp/commission/EXP_INFO_S_REWARD.png', 'tw': './assets/tw/commission/EXP_INFO_S_REWARD.png'}) REWARD_1 = Button(area={'cn': (383, 285, 503, 297), 'en': (403, 274, 504, 290), 'jp': (432, 273, 476, 294), 'tw': (383, 285, 503, 297)}, color={'cn': (238, 168, 81), 'en': (241, 198, 145), 'jp': (241, 188, 122), 'tw': (238, 168, 81)}, button={'cn': (383, 285, 503, 297), 'en': (392, 262, 515, 303), 'jp': (393, 262, 514, 303), 'tw': (383, 285, 503, 297)}, file={'cn': './assets/cn/commission/REWARD_1.png', 'en': './assets/en/commission/REWARD_1.png', 'jp': './assets/jp/commission/REWARD_1.png', 'tw': './assets/tw/commission/REWARD_1.png'}) diff --git a/module/commission/commission.py b/module/commission/commission.py index 8fba4ff32..28e0de500 100644 --- a/module/commission/commission.py +++ b/module/commission/commission.py @@ -17,7 +17,7 @@ from module.logger import logger from module.map.map_grids import SelectedGrids from module.retire.assets import DOCK_CHECK from module.ui.assets import BACK_ARROW, COMMISSION_CHECK, REWARD_GOTO_COMMISSION -from module.ui.page import page_reward +from module.ui.page import page_reward, page_commission from module.ui.scroll import Scroll from module.ui.switch import Switch from module.ui.ui import UI @@ -518,7 +518,7 @@ class RewardCommission(UI, InfoHandler): self.device.screenshot() # End - if self.appear(COMMISSION_CHECK, offset=(20, 20)): + if self.ui_page_appear(page_commission, offset=(20, 20)): # Leaving at page_commission # Commission rewards may appear too slow, causing stuck in UI switching break diff --git a/module/commission/project.py b/module/commission/project.py index 61aaab4ce..60d3f1fa4 100644 --- a/module/commission/project.py +++ b/module/commission/project.py @@ -39,22 +39,6 @@ class SuffixOcr(Ocr): return image -class TwOcr(Ocr): - def after_process(self, result): - """ - Args: - result (str): '第二行' - - Returns: - str: - """ - # There no letter `艦` in training dataset - result = result.replace('鑑', '艦').replace('盤', '艦') - # 支援土蒙爾島 - result = result.replace('土蒙爾', '土豪爾') - return result - - class Commission: # Button to enter commission start button: Button @@ -115,12 +99,16 @@ class Commission: def commission_parse(self): # Name # This is different from CN, EN has longer names - area = area_offset((176, 23, 420, 53), self.area[0:2]) + area = area_offset((131, 23, 409, 53), self.area[0:2]) button = Button(area=area, color=(), button=area, name='COMMISSION') ocr = Ocr(button, lang='cnocr') self.button = button - self.name = ocr.ocr(self.image) - self.genre = self.commission_name_parse(self.name.upper()) + result = ocr.ocr(self.image).upper() + # DALY RESOURCE EXTRACTION -> DAILY RESOURCE EXTRACTION + result = result.replace('DALY', 'DAILY') + result = result.replace('NVB', 'NYB') + self.name = result + self.genre = self.commission_name_parse(self.name) # Suffix ocr = SuffixOcr(button, lang='azur_lane', letter=(255, 255, 255), threshold=128, alphabet='IV') @@ -163,9 +151,10 @@ class Commission: button = Button(area=area, color=(), button=area, name='COMMISSION') ocr = Ocr(button, letter=(201, 201, 201), lang='jp') self.button = button - self.name = ocr.ocr(self.image) + result = ocr.ocr(self.image).upper() # NB装備輸送 -> NYB装備輸送 - self.name = self.name.replace('NB', 'BYB').replace('BW', 'BIW') + result = result.replace('NB', 'BYB').replace('BW', 'BIW') + self.name = result self.genre = self.commission_name_parse(self.name) # Suffix @@ -207,9 +196,14 @@ class Commission: # Name area = area_offset((176, 23, 420, 53), self.area[0:2]) button = Button(area=area, color=(), button=area, name='COMMISSION') - ocr = TwOcr(button, lang='tw', threshold=256) + ocr = Ocr(button, lang='tw', threshold=256) self.button = button - self.name = ocr.ocr(self.image) + result = ocr.ocr(self.image).upper() + # There no letter `艦` in training dataset + result = result.replace('鑑', '艦').replace('盤', '艦') + # 支援土蒙爾島 + result = result.replace('土蒙爾', '土豪爾') + self.name = result self.genre = self.commission_name_parse(self.name) # Suffix @@ -253,7 +247,8 @@ class Commission: button = Button(area=area, color=(), button=area, name='COMMISSION') ocr = Ocr(button, lang='cnocr', threshold=256) self.button = button - self.name = ocr.ocr(self.image) + result = ocr.ocr(self.image).upper() + self.name = result self.genre = self.commission_name_parse(self.name) # Suffix diff --git a/module/config/argument/args.json b/module/config/argument/args.json index a8bccc8c1..7da390d6b 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3426,10 +3426,12 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "display": "hide", "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -3496,6 +3498,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -3566,6 +3569,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -4206,9 +4210,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -4275,6 +4281,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -4345,6 +4352,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -4932,9 +4940,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -5001,6 +5011,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -5071,6 +5082,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -5658,9 +5670,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -5727,6 +5741,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -5797,6 +5812,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -6384,9 +6400,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -6453,6 +6471,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -6523,6 +6542,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -7110,9 +7130,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -7179,6 +7201,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -7249,6 +7272,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -7836,9 +7860,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -7905,6 +7931,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -7975,6 +8002,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -9924,9 +9952,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -9993,6 +10023,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -10063,6 +10094,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -10667,9 +10699,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -10736,6 +10770,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -10806,6 +10841,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -11410,9 +11446,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -11479,6 +11517,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -11549,6 +11588,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -12153,9 +12193,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -12222,6 +12264,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -12292,6 +12335,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -12886,9 +12930,11 @@ "event_20250520_cn", "event_20250724_cn", "event_20250814_cn", - "event_20250912_cn" + "event_20250912_cn", + "event_20251023_cn" ], "option_cn": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -12955,6 +13001,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", @@ -13025,6 +13072,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", "event_20250814_cn", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 1e00497e7..e8a06c599 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -805,6 +805,7 @@ "event_20250724_cn": "The Alchemist and the Tower of Horizons", "event_20250814_cn": "Secrets of the Abyss", "event_20250912_cn": "A Dance for Amahara Above", + "event_20251023_cn": "Tempesta and Islas de Libertád", "raid_20200624": "Air Raid Drills with Essex Rerun", "raid_20210708": "Cross Wave rerun", "raid_20220127": "Mystery Investigation", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 0536977ef..69505aecd 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -805,6 +805,7 @@ "event_20250724_cn": "錬金術士と天空邂逅の塔", "event_20250814_cn": "淵層界の秘密", "event_20250912_cn": "アマハラに舞い奉れ", + "event_20251023_cn": "テンペスタと自由群島", "raid_20200624": "特別演習超空強襲波(復刻)", "raid_20210708": "交錯する新たな波 (復刻)", "raid_20220127": "秘密事件調査", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 5cb11553a..0d2cad6a1 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -805,6 +805,7 @@ "event_20250724_cn": "优米雅的炼金工房", "event_20250814_cn": "奇渊下的秘密", "event_20250912_cn": "起舞于天原之上", + "event_20251023_cn": "飓风与自由群岛", "raid_20200624": "复刻特别演习埃塞克斯级", "raid_20210708": "复刻穿越彼方的水线", "raid_20220127": "演习神秘事件调查", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index f40c47007..ecc426ea4 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -805,6 +805,7 @@ "event_20250724_cn": "鍊金術士與天際交會之塔", "event_20250814_cn": "奇淵下的秘密", "event_20250912_cn": "起舞於天原之上", + "event_20251023_cn": "Tempesta and Islas de Libertád", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", diff --git a/module/device/control.py b/module/device/control.py index 2a793c29d..1224c4547 100644 --- a/module/device/control.py +++ b/module/device/control.py @@ -50,7 +50,7 @@ class Control(Hermit, Minitouch, Scrcpy, MaaTouch, NemuIpc): self.handle_control_check(button) click_timer = Timer(0.1) for _ in range(n): - remain = ensure_time(interval) - click_timer.current() + remain = ensure_time(interval) - click_timer.current_time() if remain > 0: self.sleep(remain) click_timer.reset() diff --git a/module/device/method/droidcast.py b/module/device/method/droidcast.py index a8fe50d20..bfcceb942 100644 --- a/module/device/method/droidcast.py +++ b/module/device/method/droidcast.py @@ -275,23 +275,16 @@ class DroidCast(Uiautomator2): # b = b.astype(np.uint8) # image = cv2.merge([r, g, b]) - # The same as the code above but costs about 3~4ms instead of 10ms. + # The same as the code above but costs about 2.7ms instead of 16ms. # Note that cv2.convertScaleAbs is 5x fast as cv2.multiply, cv2.add is 8x fast as cv2.convertScaleAbs # Note that cv2.convertScaleAbs includes rounding - r = cv2.bitwise_and(arr, 0b1111100000000000) - r = cv2.convertScaleAbs(r, alpha=0.00390625) - m = cv2.convertScaleAbs(r, alpha=0.03125) - cv2.add(r, m, dst=r) - - g = cv2.bitwise_and(arr, 0b0000011111100000) - g = cv2.convertScaleAbs(g, alpha=0.125) - m = cv2.convertScaleAbs(g, alpha=0.015625, dst=m) - cv2.add(g, m, dst=g) - - b = cv2.bitwise_and(arr, 0b0000000000011111) - b = cv2.convertScaleAbs(b, alpha=8) - m = cv2.convertScaleAbs(b, alpha=0.03125, dst=m) - cv2.add(b, m, dst=b) + tmp = np.empty_like(arr) + cv2.bitwise_and(arr, 0b1111100000000000, dst=tmp) + r = cv2.convertScaleAbs(tmp, alpha=0.0040283203125) # 0.00390625 * 1.03125 + cv2.bitwise_and(arr, 0b0000011111100000, dst=tmp) + g = cv2.convertScaleAbs(tmp, alpha=0.126953125) # 0.125 * 1.015625 + cv2.bitwise_and(arr, 0b0000000000011111, dst=tmp) + b = cv2.convertScaleAbs(tmp, alpha=8.25) # 8 * 1.03125 image = cv2.merge([r, g, b]) diff --git a/module/device/platform/emulator_windows.py b/module/device/platform/emulator_windows.py index 84d6e2bfc..78a5b6b0c 100644 --- a/module/device/platform/emulator_windows.py +++ b/module/device/platform/emulator_windows.py @@ -169,7 +169,7 @@ class Emulator(EmulatorBase): if 'MuMuPlayer.exe' in exe: return exe.replace('MuMuPlayer.exe', 'MuMuManager.exe') # MuMuPlayer12 5.0 - elif 'MuMuPlayer.exe' in exe: + elif 'MuMuNxMain.exe' in exe: return exe.replace('MuMuNxMain.exe', 'MuMuManager.exe') elif 'LDPlayer.exe' in exe: return exe.replace('LDPlayer.exe', 'ldconsole.exe') diff --git a/module/dorm/dorm.py b/module/dorm/dorm.py index 109ad61f8..0496c5c8a 100644 --- a/module/dorm/dorm.py +++ b/module/dorm/dorm.py @@ -480,11 +480,12 @@ class RewardDorm(UI): self.ui_ensure(page_dormmenu) self.handle_info_bar() - if not self.appear(DORM_RED_DOT, offset=(30, 30)): - logger.info('Nothing to collect. Dorm collecting skipped.') - collect = False - if not feed and not buy_furniture: - return + # 2025.10.17 Remove DORM_RED_DOT check, as dorm card has a slow appear animation + # if not self.appear(DORM_RED_DOT, offset=(30, 30)): + # logger.info('Nothing to collect. Dorm collecting skipped.') + # collect = False + # if not feed and not buy_furniture: + # return self.ui_goto(page_dorm, skip_first_screenshot=True) # Feed first to handle DORM_INFO diff --git a/module/event_hospital/combat.py b/module/event_hospital/combat.py index 0d1b27590..370412ca5 100644 --- a/module/event_hospital/combat.py +++ b/module/event_hospital/combat.py @@ -63,11 +63,7 @@ class HospitalCombat(Combat, HospitalUI, CampaignEvent): self.handle_task_balancer() return True - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + for _ in self.loop(): if self.appear(BATTLE_PREPARATION, offset=(30, 20)): if self.handle_combat_automation_set(auto=auto == 'combat_auto'): diff --git a/module/eventstory/eventstory.py b/module/eventstory/eventstory.py index 656a3f670..81c20bdbb 100644 --- a/module/eventstory/eventstory.py +++ b/module/eventstory/eventstory.py @@ -5,7 +5,7 @@ from module.combat.combat import Combat from module.eventstory.assets import * from module.handler.login import LoginHandler from module.logger import logger -from module.ui.page import page_event +from module.ui.page import page_event, page_sp class EventStory(CampaignUI, Combat, LoginHandler): @@ -14,7 +14,15 @@ class EventStory(CampaignUI, Combat, LoginHandler): Returns: str: 'finish', 'story', 'unknown' """ - self.ui_ensure(page_event) + event = self.config.cross_get('Event.Campaign.Event', '') + if event in [ + 'event_20251023_cn', + ]: + # SP event + self.ui_ensure(page_sp) + else: + # most events show as page_event + self.ui_ensure(page_event) self.campaign_ensure_mode_20241219('story') state = 'unknown' diff --git a/module/exercise/hp_daemon.py b/module/exercise/hp_daemon.py index 9461b1df6..eff6288d1 100644 --- a/module/exercise/hp_daemon.py +++ b/module/exercise/hp_daemon.py @@ -43,7 +43,7 @@ class HpDaemon(ModuleBase): return color_bar_percentage( image, area, prev_color=prev_color, starter=starter, reverse=reverse, threshold=threshold) - def _show_hp(self, low_hp_time=0): + def _show_hp(self, low_hp_time=0.): """ Examples: [ 80% - 70%] @@ -86,8 +86,8 @@ class HpDaemon(ModuleBase): if self.defender_hp < 0.01: self.low_hp_confirm_timer.reset() if 0.01 < self.attacker_hp <= self.config.Exercise_LowHpThreshold: - if self.low_hp_confirm_timer.reached() and self.low_hp_confirm_timer.current() < 300: - self._show_hp(self.low_hp_confirm_timer.current()) + if self.low_hp_confirm_timer.reached() and self.low_hp_confirm_timer.current_time() < 300: + self._show_hp(self.low_hp_confirm_timer.current_time()) return True else: return False diff --git a/module/freebies/assets.py b/module/freebies/assets.py index 2d7bc907e..87acfc45a 100644 --- a/module/freebies/assets.py +++ b/module/freebies/assets.py @@ -4,19 +4,14 @@ from module.base.template import Template # This file was automatically generated by dev_tools/button_extract.py. # Don't modify it manually. -BATTLE_PASS_RED_DOT = Button(area={'cn': (623, 105, 629, 113), 'en': (623, 105, 629, 113), 'jp': (623, 105, 629, 113), 'tw': (623, 105, 629, 113)}, color={'cn': (202, 86, 66), 'en': (202, 86, 66), 'jp': (202, 86, 66), 'tw': (202, 86, 66)}, button={'cn': (623, 105, 629, 113), 'en': (623, 105, 629, 113), 'jp': (623, 105, 629, 113), 'tw': (623, 105, 629, 113)}, file={'cn': './assets/cn/freebies/BATTLE_PASS_RED_DOT.png', 'en': './assets/en/freebies/BATTLE_PASS_RED_DOT.png', 'jp': './assets/jp/freebies/BATTLE_PASS_RED_DOT.png', 'tw': './assets/tw/freebies/BATTLE_PASS_RED_DOT.png'}) +BATTLE_PASS_RED_DOT = Button(area={'cn': (623, 105, 629, 113), 'en': (623, 105, 629, 113), 'jp': (623, 105, 629, 113), 'tw': (648, 85, 652, 95)}, color={'cn': (202, 86, 66), 'en': (202, 86, 66), 'jp': (202, 86, 66), 'tw': (195, 84, 65)}, button={'cn': (623, 105, 629, 113), 'en': (623, 105, 629, 113), 'jp': (623, 105, 629, 113), 'tw': (648, 85, 652, 95)}, file={'cn': './assets/cn/freebies/BATTLE_PASS_RED_DOT.png', 'en': './assets/en/freebies/BATTLE_PASS_RED_DOT.png', 'jp': './assets/jp/freebies/BATTLE_PASS_RED_DOT.png', 'tw': './assets/tw/freebies/BATTLE_PASS_RED_DOT.png'}) BUY_CONFIRM = Button(area={'cn': (698, 579, 871, 636), 'en': (710, 583, 860, 633), 'jp': (749, 592, 820, 623), 'tw': (699, 579, 869, 636)}, color={'cn': (81, 129, 190), 'en': (92, 142, 203), 'jp': (122, 158, 205), 'tw': (85, 132, 191)}, button={'cn': (698, 579, 871, 636), 'en': (710, 583, 860, 633), 'jp': (749, 592, 820, 623), 'tw': (699, 579, 869, 636)}, file={'cn': './assets/cn/freebies/BUY_CONFIRM.png', 'en': './assets/en/freebies/BUY_CONFIRM.png', 'jp': './assets/jp/freebies/BUY_CONFIRM.png', 'tw': './assets/tw/freebies/BUY_CONFIRM.png'}) DATA_KEY_COLLECT = Button(area={'cn': (251, 38, 339, 73), 'en': (256, 42, 337, 68), 'jp': (254, 40, 340, 72), 'tw': (251, 38, 339, 73)}, color={'cn': (144, 116, 77), 'en': (145, 109, 72), 'jp': (144, 111, 69), 'tw': (144, 116, 77)}, button={'cn': (251, 38, 339, 73), 'en': (256, 42, 337, 68), 'jp': (254, 40, 340, 72), 'tw': (251, 38, 339, 73)}, file={'cn': './assets/cn/freebies/DATA_KEY_COLLECT.png', 'en': './assets/en/freebies/DATA_KEY_COLLECT.png', 'jp': './assets/jp/freebies/DATA_KEY_COLLECT.png', 'tw': './assets/tw/freebies/DATA_KEY_COLLECT.png'}) DATA_KEY_COLLECTED = Button(area={'cn': (251, 38, 339, 73), 'en': (255, 42, 338, 68), 'jp': (254, 41, 340, 71), 'tw': (251, 38, 339, 73)}, color={'cn': (102, 103, 103), 'en': (113, 113, 115), 'jp': (102, 103, 103), 'tw': (102, 103, 103)}, button={'cn': (251, 38, 339, 73), 'en': (255, 42, 338, 68), 'jp': (254, 41, 340, 71), 'tw': (251, 38, 339, 73)}, file={'cn': './assets/cn/freebies/DATA_KEY_COLLECTED.png', 'en': './assets/en/freebies/DATA_KEY_COLLECTED.png', 'jp': './assets/jp/freebies/DATA_KEY_COLLECTED.png', 'tw': './assets/tw/freebies/DATA_KEY_COLLECTED.png'}) FREE_SUPPLY_PACK = Button(area={'cn': (264, 615, 312, 641), 'en': (295, 617, 345, 637), 'jp': (281, 617, 324, 639), 'tw': (264, 615, 312, 641)}, color={'cn': (124, 136, 144), 'en': (134, 146, 153), 'jp': (136, 147, 154), 'tw': (124, 136, 144)}, button={'cn': (234, 302, 348, 396), 'en': (293, 321, 373, 381), 'jp': (247, 302, 361, 396), 'tw': (234, 302, 348, 396)}, file={'cn': './assets/cn/freebies/FREE_SUPPLY_PACK.png', 'en': './assets/en/freebies/FREE_SUPPLY_PACK.png', 'jp': './assets/jp/freebies/FREE_SUPPLY_PACK.png', 'tw': './assets/tw/freebies/FREE_SUPPLY_PACK.png'}) MAIL_BATCH_CLAIM = Button(area={'cn': (593, 524, 687, 546), 'en': (643, 525, 704, 543), 'jp': (592, 523, 688, 547), 'tw': (593, 524, 687, 546)}, color={'cn': (114, 209, 255), 'en': (147, 220, 255), 'jp': (109, 207, 255), 'tw': (114, 209, 255)}, button={'cn': (593, 524, 687, 546), 'en': (643, 525, 704, 543), 'jp': (592, 523, 688, 547), 'tw': (593, 524, 687, 546)}, file={'cn': './assets/cn/freebies/MAIL_BATCH_CLAIM.png', 'en': './assets/en/freebies/MAIL_BATCH_CLAIM.png', 'jp': './assets/jp/freebies/MAIL_BATCH_CLAIM.png', 'tw': './assets/cn/freebies/MAIL_BATCH_CLAIM.png'}) MAIL_BATCH_DELETE = Button(area={'cn': (770, 523, 865, 547), 'en': (817, 526, 887, 544), 'jp': (770, 523, 866, 547), 'tw': (770, 523, 865, 547)}, color={'cn': (112, 209, 255), 'en': (150, 221, 255), 'jp': (114, 209, 255), 'tw': (112, 209, 255)}, button={'cn': (770, 523, 865, 547), 'en': (817, 526, 887, 544), 'jp': (770, 523, 866, 547), 'tw': (770, 523, 865, 547)}, file={'cn': './assets/cn/freebies/MAIL_BATCH_DELETE.png', 'en': './assets/en/freebies/MAIL_BATCH_DELETE.png', 'jp': './assets/jp/freebies/MAIL_BATCH_DELETE.png', 'tw': './assets/cn/freebies/MAIL_BATCH_DELETE.png'}) -MAIL_COLLECT = Button(area={'cn': (841, 577, 970, 608), 'en': (865, 583, 947, 601), 'jp': (842, 575, 964, 609), 'tw': (838, 575, 973, 611)}, color={'cn': (155, 184, 219), 'en': (151, 180, 216), 'jp': (116, 154, 203), 'tw': (145, 174, 212)}, button={'cn': (841, 577, 970, 608), 'en': (865, 583, 947, 601), 'jp': (842, 575, 964, 609), 'tw': (838, 575, 973, 611)}, file={'cn': './assets/cn/freebies/MAIL_COLLECT.png', 'en': './assets/en/freebies/MAIL_COLLECT.png', 'jp': './assets/jp/freebies/MAIL_COLLECT.png', 'tw': './assets/tw/freebies/MAIL_COLLECT.png'}) -MAIL_COLLECTED = Button(area={'cn': (893, 578, 986, 607), 'en': (835, 578, 975, 606), 'jp': (861, 575, 951, 608), 'tw': (891, 576, 987, 609)}, color={'cn': (55, 61, 70), 'en': (54, 63, 71), 'jp': (48, 57, 65), 'tw': (55, 62, 72)}, button={'cn': (893, 578, 986, 607), 'en': (835, 578, 975, 606), 'jp': (861, 575, 951, 608), 'tw': (891, 576, 987, 609)}, file={'cn': './assets/cn/freebies/MAIL_COLLECTED.png', 'en': './assets/en/freebies/MAIL_COLLECTED.png', 'jp': './assets/jp/freebies/MAIL_COLLECTED.png', 'tw': './assets/tw/freebies/MAIL_COLLECTED.png'}) -MAIL_DELETE = Button(area={'cn': (176, 560, 306, 590), 'en': (428, 567, 500, 584), 'jp': (177, 556, 307, 591), 'tw': (175, 559, 308, 592)}, color={'cn': (221, 171, 166), 'en': (216, 173, 169), 'jp': (210, 151, 146), 'tw': (217, 166, 162)}, button={'cn': (176, 560, 306, 590), 'en': (428, 567, 500, 584), 'jp': (177, 556, 307, 591), 'tw': (175, 559, 308, 592)}, file={'cn': './assets/cn/freebies/MAIL_DELETE.png', 'en': './assets/en/freebies/MAIL_DELETE.png', 'jp': './assets/jp/freebies/MAIL_DELETE.png', 'tw': './assets/tw/freebies/MAIL_DELETE.png'}) -MAIL_EMPTY = Button(area={'cn': (617, 341, 665, 365), 'en': (236, 365, 371, 404), 'jp': (656, 340, 784, 365), 'tw': (617, 341, 665, 365)}, color={'cn': (185, 187, 194), 'en': (148, 160, 177), 'jp': (148, 150, 162), 'tw': (185, 187, 194)}, button={'cn': (617, 341, 665, 365), 'en': (236, 365, 371, 404), 'jp': (656, 340, 784, 365), 'tw': (617, 341, 665, 365)}, file={'cn': './assets/cn/freebies/MAIL_EMPTY.png', 'en': './assets/en/freebies/MAIL_EMPTY.png', 'jp': './assets/jp/freebies/MAIL_EMPTY.png', 'tw': './assets/cn/freebies/MAIL_EMPTY.png'}) MAIL_ENTER = Button(area={'cn': (1207, 393, 1253, 429), 'en': (1207, 393, 1253, 429), 'jp': (1207, 393, 1253, 429), 'tw': (1207, 393, 1253, 429)}, color={'cn': (109, 107, 95), 'en': (109, 107, 95), 'jp': (109, 107, 95), 'tw': (109, 107, 95)}, button={'cn': (1207, 393, 1253, 429), 'en': (1207, 393, 1253, 429), 'jp': (1207, 393, 1253, 429), 'tw': (1207, 393, 1253, 429)}, file={'cn': './assets/cn/freebies/MAIL_ENTER.png', 'en': './assets/en/freebies/MAIL_ENTER.png', 'jp': './assets/jp/freebies/MAIL_ENTER.png', 'tw': './assets/tw/freebies/MAIL_ENTER.png'}) -MAIL_GUILD_MESSAGE = Button(area={'cn': (412, 214, 461, 235), 'en': (412, 214, 461, 235), 'jp': (412, 214, 461, 235), 'tw': (412, 214, 461, 235)}, color={'cn': (123, 124, 126), 'en': (123, 124, 126), 'jp': (123, 124, 126), 'tw': (123, 124, 126)}, button={'cn': (412, 214, 461, 235), 'en': (412, 214, 461, 235), 'jp': (412, 214, 461, 235), 'tw': (412, 214, 461, 235)}, file={'cn': './assets/cn/freebies/MAIL_GUILD_MESSAGE.png', 'en': './assets/en/freebies/MAIL_GUILD_MESSAGE.png', 'jp': './assets/jp/freebies/MAIL_GUILD_MESSAGE.png', 'tw': './assets/tw/freebies/MAIL_GUILD_MESSAGE.png'}) MAIL_MANAGE = Button(area={'cn': (415, 639, 485, 658), 'en': (393, 641, 463, 660), 'jp': (407, 641, 495, 658), 'tw': (415, 639, 485, 658)}, color={'cn': (116, 210, 255), 'en': (131, 214, 255), 'jp': (115, 209, 255), 'tw': (116, 210, 255)}, button={'cn': (415, 639, 485, 658), 'en': (393, 641, 463, 660), 'jp': (407, 641, 495, 658), 'tw': (415, 639, 485, 658)}, file={'cn': './assets/cn/freebies/MAIL_MANAGE.png', 'en': './assets/en/freebies/MAIL_MANAGE.png', 'jp': './assets/jp/freebies/MAIL_MANAGE.png', 'tw': './assets/cn/freebies/MAIL_MANAGE.png'}) MAIL_SELECT_ALL = Button(area={'cn': (390, 319, 410, 339), 'en': (390, 319, 410, 339), 'jp': (390, 323, 410, 343), 'tw': (390, 319, 410, 339)}, color={'cn': (87, 88, 88), 'en': (87, 88, 88), 'jp': (91, 90, 91), 'tw': (87, 88, 88)}, button={'cn': (390, 319, 410, 339), 'en': (390, 319, 410, 339), 'jp': (390, 323, 410, 343), 'tw': (390, 319, 410, 339)}, file={'cn': './assets/cn/freebies/MAIL_SELECT_ALL.png', 'en': './assets/en/freebies/MAIL_SELECT_ALL.png', 'jp': './assets/jp/freebies/MAIL_SELECT_ALL.png', 'tw': './assets/tw/freebies/MAIL_SELECT_ALL.png'}) MAIL_SELECT_COINS = Button(area={'cn': (562, 401, 582, 421), 'en': (562, 401, 582, 421), 'jp': (562, 410, 582, 430), 'tw': (562, 401, 582, 421)}, color={'cn': (241, 240, 241), 'en': (241, 240, 241), 'jp': (239, 239, 239), 'tw': (241, 240, 241)}, button={'cn': (562, 401, 582, 421), 'en': (562, 401, 582, 421), 'jp': (562, 410, 582, 430), 'tw': (562, 401, 582, 421)}, file={'cn': './assets/cn/freebies/MAIL_SELECT_COINS.png', 'en': './assets/en/freebies/MAIL_SELECT_COINS.png', 'jp': './assets/jp/freebies/MAIL_SELECT_COINS.png', 'tw': './assets/tw/freebies/MAIL_SELECT_COINS.png'}) diff --git a/module/freebies/freebies.py b/module/freebies/freebies.py index 0905d37f2..8694e3075 100644 --- a/module/freebies/freebies.py +++ b/module/freebies/freebies.py @@ -22,9 +22,8 @@ class Freebies(ModuleBase): logger.hr('Mail', level=1) MailWhite(self.config, self.device).run() - if self.config.SERVER not in ['tw']: - if self.config.SupplyPack_Collect: - logger.hr('Supply pack', level=1) - SupplyPack_250814(self.config, self.device).run() + if self.config.SupplyPack_Collect: + logger.hr('Supply pack', level=1) + SupplyPack_250814(self.config, self.device).run() self.config.task_delay(server_update=True) diff --git a/module/freebies/mail.py b/module/freebies/mail.py deleted file mode 100644 index 89959e608..000000000 --- a/module/freebies/mail.py +++ /dev/null @@ -1,253 +0,0 @@ -import re - -from module.base.button import ButtonGrid -from module.base.decorator import cached_property -from module.base.filter import Filter -from module.base.timer import Timer -from module.combat.assets import * -from module.freebies.assets import * -from module.logger import logger -from module.statistics.item import ItemGrid -from module.ui.page import page_main, page_main_white -from module.ui.ui import UI -from module.ui_white.assets import MAIL_ENTER_WHITE - -MAIL_BUTTON_GRID = ButtonGrid( - origin=(137, 207), delta=(0, 97), - button_shape=(64, 64), grid_shape=(1, 3), - name='MAIL_BUTTON_GRID') -FILTER_REGEX = re.compile( - '^(cube|coin|coolant|decorcoin|oil|merit|gem)$', - flags=re.IGNORECASE) -FILTER_ATTR = ['name'] -FILTER = Filter(FILTER_REGEX, FILTER_ATTR) - - -class Mail(UI): - def _mail_enter(self, delete=False, skip_first_screenshot=True): - """ - Goes to mail page - Also deletes viewed mails to ensure the relevant - row entries are in view - - Args: - delete (bool): - Enable extra step to delete old - already collected mail entries - skip_first_screenshot (bool): - - Returns: - bool: False if mail list empty - """ - logger.hr('Mail enter') - btn_expanded = MAIL_BUTTON_GRID.buttons[0] - btn_collapsed = btn_expanded.move((350, 0)) - self.interval_clear([page_main.check_button, page_main_white.check_button, MAIL_DELETE]) - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - - # End - if self.appear(MAIL_EMPTY, offset=(20, 20)): - logger.info('Mail list empty') - return False - if self.appear(MAIL_GUILD_MESSAGE, offset=(20, 20)): - logger.info('Guild mail found, exit') - return False - if not delete and self._mail_selected(btn_expanded): - if self.appear(MAIL_COLLECT, offset=(20, 20)): - return True - if self.appear(MAIL_COLLECTED, offset=(20, 20)): - return True - - if self.appear(page_main.check_button, offset=(30, 30), interval=3): - self.device.click(MAIL_ENTER) - continue - if self.appear(page_main_white.check_button, offset=(30, 30), interval=3): - self.device.click(MAIL_ENTER_WHITE) - continue - if delete: - if self.appear_then_click(MAIL_DELETE, offset=(350, 20), interval=3): - continue - if self.handle_popup_confirm('MAIL_DELETE'): - delete = False - continue - else: - if self.appear(MAIL_DELETE, offset=(350, 20), interval=3): - self.device.click(btn_collapsed) - continue - if self.handle_info_bar(): - continue - - def _mail_exit(self, skip_first_screenshot=True): - """ - Exits from mail page back into page_main - - Args: - skip_first_screenshot (bool): - """ - logger.hr('Mail exit') - self.interval_clear([MAIL_DELETE, GET_ITEMS_1, GET_ITEMS_2]) - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - - if self.appear(GET_ITEMS_1, offset=(30, 30), interval=1): - self.device.click(MAIL_COLLECT) - continue - if self.appear(GET_ITEMS_2, offset=(30, 30), interval=1): - self.device.click(MAIL_COLLECT) - continue - if self.appear(MAIL_DELETE, offset=(350, 20), interval=3): - self.device.click(MAIL_ENTER) - continue - if self.handle_info_bar(): - continue - - # End - if self.is_in_main(): - break - - @cached_property - def _mail_grid(self): - """ - This grid only comprises the top 3 mail rows - - Returns: - ItemGrid - """ - mail_item_grid = ItemGrid(MAIL_BUTTON_GRID, templates={}, - amount_area=(60, 74, 96, 95)) - mail_item_grid.load_template_folder('./assets/stats_basic') - mail_item_grid.similarity = 0.85 - return mail_item_grid - - def _mail_get_collectable(self): - """ - Loads filter and scans the items in the mail grid - then returns a subset of those that are collectable - - Returns: - list[Item] - """ - FILTER.load(self.config.Mail_Filter.strip()) - items = self._mail_grid.predict( - self.device.image, - name=True, - amount=False, - cost=False, - price=False, - tag=False - ) - filtered = FILTER.apply(items, None) - logger.attr('Item_sort', ' > '.join([str(item) for item in filtered])) - return filtered - - def _mail_selected(self, button): - """ - Check if mail (button) is selected i.e. - has bottom yellow border - - Args: - button (Button): - - Returns: - bool - """ - area = button.area - check_area = tuple([area[0], area[3] + 3, area[2], area[3] + 10]) - return self.image_color_count(check_area, color=(255, 223, 66), threshold=180, count=25) - - def _mail_collect_one(self, item, skip_first_screenshot=True): - """ - Executes the collecting sequence on - one mail item - - Args: - item (Item): - skip_first_screenshot (bool): - """ - logger.hr('Mail collect one') - btn = item._button - click_timer = Timer(1.5, count=3) - self.interval_clear([MAIL_COLLECT, GET_ITEMS_1, GET_ITEMS_2]) - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - - if click_timer.reached(): - if not self._mail_selected(btn): - self.device.click(btn.move((350, 0))) - click_timer.reset() - continue - if self.appear_then_click(MAIL_COLLECT, offset=(20, 20), interval=3): - click_timer.reset() - continue - if self.appear(GET_ITEMS_1, offset=(30, 30), interval=1): - self.device.click(MAIL_COLLECT) - click_timer.reset() - continue - if self.appear(GET_ITEMS_2, offset=(30, 30), interval=1): - self.device.click(MAIL_COLLECT) - click_timer.reset() - continue - if self.handle_info_bar(): - click_timer.reset() - continue - - # End - if self.appear(MAIL_COLLECTED, offset=(20, 20)): - break - - def _mail_collect(self, skip_first_screenshot=True): - """ - Executes the collecting sequence to - applicable mail items - - Args: - skip_first_screenshot (bool): - """ - logger.hr('Mail collect', level=2) - for _ in range(5): - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - - collectable = self._mail_get_collectable() - if not collectable: - break - - self._mail_collect_one(collectable[0]) - - logger.info('Finished collecting all applicable mail') - - def mail_run(self, delete=False): - """ - Collects mail rewards - - Args: - delete (bool): - """ - logger.info('Mail run') - - if self._mail_enter(delete): - self._mail_collect() - self._mail_exit() - else: - self._mail_exit() - - def run(self): - """ - Pages: - in: Any page - out: page_main, may have info_bar - """ - self.ui_goto(page_main) - self.mail_run(delete=self.config.Mail_Delete) diff --git a/module/freebies/mail_white.py b/module/freebies/mail_white.py index 8efc9c355..6d9e42f4a 100644 --- a/module/freebies/mail_white.py +++ b/module/freebies/mail_white.py @@ -256,9 +256,6 @@ class MailWhite(UI): if not merit and not maintenance and not trade_license: logger.warning('Nothing to claim') return False - if self.config.SERVER not in ['cn', 'en', 'jp']: - logger.warning(f'Mail is not supported in {self.config.SERVER}, please contact server maintainers') - return False # Must using white UI self.ui_ensure(page_main) diff --git a/module/handler/info_handler.py b/module/handler/info_handler.py index 288a5c75f..bb64d52e7 100644 --- a/module/handler/info_handler.py +++ b/module/handler/info_handler.py @@ -169,7 +169,7 @@ class InfoHandler(ModuleBase): # Hot fixes will kill AL if you clicked the confirm button if self._hot_fix_check_wait.reached(): self._hot_fix_check_wait.clear() - if self._hot_fix_check_wait.started() and 3 <= self._hot_fix_check_wait.current() <= 6: + if self._hot_fix_check_wait.started() and 3 <= self._hot_fix_check_wait.current_time() <= 6: if not self.device.app_is_running(): logger.error('Detected hot fixes from game server, game died') raise GameNotRunningError diff --git a/module/map/assets.py b/module/map/assets.py index 5be0ac53c..f74f86bee 100644 --- a/module/map/assets.py +++ b/module/map/assets.py @@ -15,7 +15,8 @@ FLEET_2_BAR = Button(area={'cn': (1012, 383, 1183, 628), 'en': (994, 384, 1165, FLEET_2_CHOOSE = Button(area={'cn': (1022, 306, 1083, 365), 'en': (1003, 307, 1063, 365), 'jp': (1021, 306, 1082, 365), 'tw': (1019, 304, 1084, 365)}, color={'cn': (202, 163, 104), 'en': (191, 144, 84), 'jp': (201, 161, 102), 'tw': (198, 157, 101)}, button={'cn': (1022, 306, 1083, 365), 'en': (1003, 307, 1063, 365), 'jp': (1021, 306, 1082, 365), 'tw': (1019, 304, 1084, 365)}, file={'cn': './assets/cn/map/FLEET_2_CHOOSE.png', 'en': './assets/en/map/FLEET_2_CHOOSE.png', 'jp': './assets/jp/map/FLEET_2_CHOOSE.png', 'tw': './assets/tw/map/FLEET_2_CHOOSE.png'}) FLEET_2_CLEAR = Button(area={'cn': (1109, 306, 1169, 365), 'en': (1092, 307, 1152, 365), 'jp': (1113, 306, 1169, 365), 'tw': (1109, 303, 1175, 365)}, color={'cn': (155, 158, 159), 'en': (140, 141, 143), 'jp': (151, 153, 154), 'tw': (151, 152, 154)}, button={'cn': (1109, 306, 1169, 365), 'en': (1092, 307, 1152, 365), 'jp': (1113, 306, 1169, 365), 'tw': (1109, 303, 1175, 365)}, file={'cn': './assets/cn/map/FLEET_2_CLEAR.png', 'en': './assets/en/map/FLEET_2_CLEAR.png', 'jp': './assets/jp/map/FLEET_2_CLEAR.png', 'tw': './assets/tw/map/FLEET_2_CLEAR.png'}) FLEET_2_HARD_SATIESFIED = Button(area={'cn': (208, 372, 361, 401), 'en': (188, 378, 328, 402), 'jp': (208, 372, 361, 401), 'tw': (215, 377, 306, 400)}, color={'cn': (75, 54, 43), 'en': (97, 88, 78), 'jp': (75, 54, 43), 'tw': (83, 68, 48)}, button={'cn': (208, 372, 361, 401), 'en': (188, 378, 328, 402), 'jp': (208, 372, 361, 401), 'tw': (215, 377, 306, 400)}, file={'cn': './assets/cn/map/FLEET_2_HARD_SATIESFIED.png', 'en': './assets/en/map/FLEET_2_HARD_SATIESFIED.png', 'jp': './assets/jp/map/FLEET_2_HARD_SATIESFIED.png', 'tw': './assets/tw/map/FLEET_2_HARD_SATIESFIED.png'}) -FLEET_2_IN_USE = Button(area={'cn': (391, 351, 475, 374), 'en': (374, 352, 453, 373), 'jp': (391, 351, 475, 374), 'tw': (393, 338, 473, 373)}, color={'cn': (182, 165, 200), 'en': (151, 152, 162), 'jp': (182, 165, 200), 'tw': (140, 116, 113)}, button={'cn': (391, 351, 475, 374), 'en': (374, 352, 453, 373), 'jp': (391, 351, 475, 374), 'tw': (393, 338, 473, 373)}, file={'cn': './assets/cn/map/FLEET_2_IN_USE.png', 'en': './assets/en/map/FLEET_2_IN_USE.png', 'jp': './assets/jp/map/FLEET_2_IN_USE.png', 'tw': './assets/tw/map/FLEET_2_IN_USE.png'}) +FLEET_2_IN_USE = Button(area={'cn': (391, 351, 475, 374), 'en': (374, 352, 453, 373), 'jp': (391, 351, 475, 374), 'tw': (391, 351, 475, 374)}, color={'cn': (182, 165, 200), 'en': (151, 152, 162), 'jp': (182, 165, 200), 'tw': (182, 165, 200)}, button={'cn': (391, 351, 475, 374), 'en': (374, 352, 453, 373), 'jp': (391, 351, 475, 374), 'tw': (391, 351, 475, 374)}, file={'cn': './assets/cn/map/FLEET_2_IN_USE.png', 'en': './assets/en/map/FLEET_2_IN_USE.png', 'jp': './assets/cn/map/FLEET_2_IN_USE.png', 'tw': './assets/cn/map/FLEET_2_IN_USE.png'}) +FLEET_2_IN_USE_W15 = Button(area={'cn': (390, 290, 475, 319), 'en': (371, 290, 456, 319), 'jp': (390, 290, 475, 319), 'tw': (390, 290, 475, 319)}, color={'cn': (128, 131, 147), 'en': (128, 131, 147), 'jp': (128, 131, 147), 'tw': (128, 131, 147)}, button={'cn': (390, 290, 475, 319), 'en': (371, 290, 456, 319), 'jp': (390, 290, 475, 319), 'tw': (390, 290, 475, 319)}, file={'cn': './assets/cn/map/FLEET_2_IN_USE_W15.png', 'en': './assets/en/map/FLEET_2_IN_USE_W15.png', 'jp': './assets/cn/map/FLEET_2_IN_USE_W15.png', 'tw': './assets/cn/map/FLEET_2_IN_USE_W15.png'}) FLEET_NUM_1 = Button(area={'cn': (213, 76, 224, 101), 'en': (213, 76, 224, 101), 'jp': (213, 76, 224, 101), 'tw': (213, 76, 224, 101)}, color={'cn': (51, 143, 186), 'en': (51, 143, 186), 'jp': (51, 143, 186), 'tw': (51, 143, 186)}, button={'cn': (213, 76, 224, 101), 'en': (213, 76, 224, 101), 'jp': (213, 76, 224, 101), 'tw': (213, 76, 224, 101)}, file={'cn': './assets/cn/map/FLEET_NUM_1.png', 'en': './assets/en/map/FLEET_NUM_1.png', 'jp': './assets/jp/map/FLEET_NUM_1.png', 'tw': './assets/tw/map/FLEET_NUM_1.png'}) FLEET_NUM_2 = Button(area={'cn': (212, 75, 226, 101), 'en': (212, 75, 226, 101), 'jp': (212, 75, 226, 101), 'tw': (212, 75, 226, 101)}, color={'cn': (52, 150, 194), 'en': (52, 150, 194), 'jp': (52, 150, 194), 'tw': (52, 150, 194)}, button={'cn': (212, 75, 226, 101), 'en': (212, 75, 226, 101), 'jp': (212, 75, 226, 101), 'tw': (212, 75, 226, 101)}, file={'cn': './assets/cn/map/FLEET_NUM_2.png', 'en': './assets/en/map/FLEET_NUM_2.png', 'jp': './assets/jp/map/FLEET_NUM_2.png', 'tw': './assets/tw/map/FLEET_NUM_2.png'}) FLEET_PREPARATION = Button(area={'cn': (1013, 558, 1141, 588), 'en': (1048, 569, 1086, 595), 'jp': (1046, 558, 1107, 587), 'tw': (1014, 557, 1142, 588)}, color={'cn': (242, 211, 160), 'en': (241, 201, 148), 'jp': (241, 205, 151), 'tw': (242, 208, 157)}, button={'cn': (980, 549, 1181, 612), 'en': (988, 556, 1145, 606), 'jp': (983, 549, 1185, 612), 'tw': (980, 548, 1180, 612)}, file={'cn': './assets/cn/map/FLEET_PREPARATION.png', 'en': './assets/en/map/FLEET_PREPARATION.png', 'jp': './assets/jp/map/FLEET_PREPARATION.png', 'tw': './assets/tw/map/FLEET_PREPARATION.png'}) diff --git a/module/map/map_fleet_preparation.py b/module/map/map_fleet_preparation.py index 587b7c27f..1dd7efafb 100644 --- a/module/map/map_fleet_preparation.py +++ b/module/map/map_fleet_preparation.py @@ -308,12 +308,27 @@ class FleetPreparation(InfoHandler): if self.map_fleet_checked: return False + if self.appear(FLEET_1_CLEAR, offset=FleetOperator.OFFSET): + AUTO_SEARCH_SET_MOB.load_offset(FLEET_1_CLEAR) + AUTO_SEARCH_SET_BOSS.load_offset(FLEET_1_CLEAR) + AUTO_SEARCH_SET_ALL.load_offset(FLEET_1_CLEAR) + AUTO_SEARCH_SET_STANDBY.load_offset(FLEET_1_CLEAR) + if self.appear(SUBMARINE_CLEAR, offset=FleetOperator.OFFSET): + AUTO_SEARCH_SET_SUB_AUTO.load_offset(SUBMARINE_CLEAR) + AUTO_SEARCH_SET_SUB_STANDBY.load_offset(SUBMARINE_CLEAR) + fleet_1 = FleetOperator( choose=FLEET_1_CHOOSE, advice=FLEET_1_ADVICE, bar=FLEET_1_BAR, clear=FLEET_1_CLEAR, in_use=FLEET_1_IN_USE, hard_satisfied=FLEET_1_HARD_SATIESFIED, main=self) + y = FLEET_1_CLEAR.button[1] - FLEET_1_CLEAR.area[1] + if y < -10: + logger.info('FLEET_1_CLEAR moves up, load W15 assets') + in_use = FLEET_2_IN_USE_W15 + else: + in_use = FLEET_2_IN_USE fleet_2 = FleetOperator( choose=FLEET_2_CHOOSE, advice=FLEET_2_ADVICE, bar=FLEET_2_BAR, clear=FLEET_2_CLEAR, - in_use=FLEET_2_IN_USE, hard_satisfied=FLEET_2_HARD_SATIESFIED, main=self) + in_use=in_use, hard_satisfied=FLEET_2_HARD_SATIESFIED, main=self) submarine = FleetOperator( choose=SUBMARINE_CHOOSE, advice=SUBMARINE_ADVICE, bar=SUBMARINE_BAR, clear=SUBMARINE_CLEAR, in_use=SUBMARINE_IN_USE, hard_satisfied=SUBMARINE_HARD_SATIESFIED, main=self) @@ -378,13 +393,4 @@ class FleetPreparation(InfoHandler): else: self.config.SUBMARINE = 0 - if self.appear(FLEET_1_CLEAR, offset=(-20, -80, 20, 5)): - AUTO_SEARCH_SET_MOB.load_offset(FLEET_1_CLEAR) - AUTO_SEARCH_SET_BOSS.load_offset(FLEET_1_CLEAR) - AUTO_SEARCH_SET_ALL.load_offset(FLEET_1_CLEAR) - AUTO_SEARCH_SET_STANDBY.load_offset(FLEET_1_CLEAR) - if self.appear(SUBMARINE_CLEAR, offset=(-20, -80, 20, 5)): - AUTO_SEARCH_SET_SUB_AUTO.load_offset(SUBMARINE_CLEAR) - AUTO_SEARCH_SET_SUB_STANDBY.load_offset(SUBMARINE_CLEAR) - return True diff --git a/module/os_combat/combat.py b/module/os_combat/combat.py index ae9478c55..fa5fdef38 100644 --- a/module/os_combat/combat.py +++ b/module/os_combat/combat.py @@ -49,11 +49,7 @@ class Combat(Combat_, MapEventHandler): # if balance_hp: # self.hp_balance() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + for _ in self.loop(): if self.appear(BATTLE_PREPARATION): if self.handle_combat_automation_set(auto=auto == 'combat_auto'): diff --git a/module/raid/raid.py b/module/raid/raid.py index 9e30daa51..a2cb8a548 100644 --- a/module/raid/raid.py +++ b/module/raid/raid.py @@ -218,11 +218,7 @@ class Raid(MapOperation, RaidCombat, CampaignEvent): self.handle_task_balancer() return True - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + for _ in self.loop(): if self.appear(BATTLE_PREPARATION, offset=(30, 20)): if self.handle_combat_automation_set(auto=auto == 'combat_auto'): diff --git a/module/reward/reward.py b/module/reward/reward.py index b10487707..f503ff52a 100644 --- a/module/reward/reward.py +++ b/module/reward/reward.py @@ -4,7 +4,6 @@ from module.base.timer import Timer from module.combat.assets import * from module.logger import logger from module.reward.assets import * -from module.ui.assets import MISSION_CHECK from module.ui.navbar import Navbar from module.ui.page import page_main, page_mission, page_reward from module.ui.ui import UI @@ -12,13 +11,12 @@ from module.ui_white.assets import MISSION_NOTICE_WHITE class Reward(UI): - def reward_receive(self, oil, coin, exp, skip_first_screenshot=True): + def reward_receive(self, oil, coin, exp): """ Args: oil (bool): coin (bool): exp (bool): - skip_first_screenshot (bool): Returns: bool: If rewarded. @@ -35,12 +33,7 @@ class Reward(UI): confirm_timer = Timer(1, count=3).start() # Set click interval to 0.3, because game can't respond that fast. click_timer = Timer(0.3) - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + for _ in self.loop(): if oil and click_timer.reached() and self.appear_then_click(OIL, offset=(20, 50), interval=60): confirm_timer.reset() click_timer.reset() @@ -61,128 +54,125 @@ class Reward(UI): logger.info('Reward receive end') return True - def _reward_mission_collect(self, interval=1, skip_first_screenshot=True): + def _reward_get_state(self): + if self.appear(MISSION_MULTI, offset=(20, 20)): + return MISSION_MULTI + if self.match_template_color(MISSION_SINGLE, offset=(50, 200)): + return MISSION_SINGLE + if self.appear(MISSION_EMPTY, offset=(20, 20)): + return MISSION_EMPTY + if self.appear(MISSION_UNFINISH, offset=(50, 200)): + return MISSION_UNFINISH + return None + + def _reward_mission_claim_click(self): """ - Streamline handling of mission rewards for - both 'all' and 'weekly' pages - - Args: - interval (int, float): - Configure the interval for assets involved - skip_first_screenshot: - Returns: - bool, if encountered at least 1 GET_ITEMS_* + bool: If claimed + + Pages: + in: page_mission, MISSION_MULTI or MISSION_SINGLE + out: unknown popup """ - # Reset any existing interval for the following assets - self.interval_clear([GET_ITEMS_1, GET_ITEMS_2, - MISSION_MULTI, MISSION_SINGLE, - GET_SHIP]) + clicked = False + click_interval = Timer(1, count=2) + for _ in self.loop(): + if clicked and not self.ui_page_appear(page_mission): + return clicked + if click_interval.reached(): + if self.appear_then_click(MISSION_MULTI, offset=(20, 20)): + click_interval.reset() + clicked = True + continue + if self.match_template_color(MISSION_SINGLE, offset=(50, 200)): + self.device.click(MISSION_SINGLE) + click_interval.reset() + clicked = True + continue - # Basic timers for certain scenarios - exit_timer = Timer(2) - click_timer = Timer(1) - timeout = Timer(10) - exit_timer.start() - timeout.start() - # Record received missions to clear click record - clicked_mission = False + def _reward_mission_claim_receive(self): + """ + Returns: + Button | str: Button object or state string - reward = False - while 1: - if skip_first_screenshot: - skip_first_screenshot = False + Pages: + in: unknown popup + out: page_mission + """ + logger.info('Mission claim receive') + timeout = Timer(2, count=6).start() + for _ in self.loop(): + if self.ui_page_appear(page_mission): + state = self._reward_get_state() + if state: + return state + if timeout.reached(): + logger.warning('Wait mission receive timeout') + return 'timeout' else: - self.device.screenshot() - - for button in [GET_ITEMS_1, GET_ITEMS_2]: - if self.appear_then_click(button, offset=(30, 30), interval=interval): - exit_timer.reset() - timeout.reset() - reward = True - # MISSION_SINGLE -> GET_ITEMS_* means one mission reward received - if clicked_mission: - logger.info('Got items from mission') - self.device.click_record_clear() - clicked_mission = False - continue - - for button in [MISSION_MULTI, MISSION_SINGLE]: - if not click_timer.reached(): - continue - if self.match_template_color(button, offset=(50, 200), interval=interval): - self.device.click(button) - clicked_mission = True - exit_timer.reset() - click_timer.reset() - timeout.reset() - continue - - if not self.appear(MISSION_CHECK): - if self.appear_then_click(GET_SHIP, interval=interval): - exit_timer.reset() - click_timer.reset() - timeout.reset() - continue + timeout.reset() + # click + if self.appear_then_click(GET_ITEMS_1, offset=(30, 30), interval=1): + continue + if self.appear_then_click(GET_ITEMS_2, offset=(30, 30), interval=1): + continue + if self.appear_then_click(GET_SHIP, interval=1): + continue if self.handle_mission_popup_ack(): - exit_timer.reset() - click_timer.reset() - timeout.reset() continue - - # Story if self.handle_vote_popup(): - exit_timer.reset() - click_timer.reset() - timeout.reset() continue - if self.story_skip(): - exit_timer.reset() - click_timer.reset() - timeout.reset() + if self.handle_story_skip(): continue - if self.handle_popup_confirm('MISSION_REWARD'): - exit_timer.reset() - click_timer.reset() - timeout.reset() continue - # End - if reward and exit_timer.reached(): - break - if timeout.reached(): - logger.warning('Wait get items timeout.') - break - - return reward - def _reward_wait_mission_list(self): """ Wait until mission list fully loaded Pages: in: page_mission - out: page_mission, MISSION_MULTI or MISSION_SINGLE or MISSION_UNFINISH + out: page_mission, any mission state, or timeout """ timeout = Timer(1, count=2).start() for _ in self.loop(): + state = self._reward_get_state() + if state: + return state if timeout.reached(): + return 'timeout' + + def _reward_mission_collect(self): + """ + Streamline handling of mission rewards for + both 'all' and 'weekly' pages + + Returns: + Button | str: Last state, Button object or state string + """ + state = self._reward_wait_mission_list() + while 1: + logger.attr('MissionState', state) + self.device.stuck_record_clear() + self.device.click_record_clear() + if state == 'timeout': logger.warning('Reward wait mission list timeout') + return state + if state in [MISSION_EMPTY, MISSION_UNFINISH]: + logger.info('Mission collect finished') break - if self.appear(MISSION_MULTI, offset=(20, 20)): - logger.info(f'mission list: {MISSION_MULTI}') - break - if MISSION_SINGLE.match_luma(self.device.image, offset=(50, 200)): - logger.info(f'mission list: {MISSION_SINGLE}') - break - if self.appear(MISSION_UNFINISH, offset=(20, 20)): - logger.info(f'mission list: {MISSION_UNFINISH}') - break - if self.appear(MISSION_EMPTY, offset=(20, 20)): - logger.info(f'mission list: {MISSION_EMPTY}') - break + elif state in [MISSION_MULTI, MISSION_SINGLE]: + # Clear any existing interval for the following assets + self.interval_clear([GET_ITEMS_1, GET_ITEMS_2, MISSION_MULTI, MISSION_SINGLE, GET_SHIP]) + self._reward_mission_claim_click() + state = self._reward_mission_claim_receive() + continue + else: + logger.warning('Empty mission state, mission collect finished') + + return state def _reward_mission_all(self): """ @@ -192,16 +182,6 @@ class Reward(UI): bool, if handled """ self.reward_side_navbar_ensure(upper=1) - self._reward_wait_mission_list() - - if not self.appear(MISSION_MULTI, offset=(20, 200)) and \ - not self.appear(MISSION_SINGLE, offset=(50, 200)): - logger.info('No MISSION_MULTI or MISSION_SINGLE') - return False - - # Uses default interval to account for - # behavior differences and avoid - # premature exit return self._reward_mission_collect() def _reward_mission_weekly(self): @@ -216,12 +196,7 @@ class Reward(UI): return False self.reward_side_navbar_ensure(upper=5) - self._reward_wait_mission_list() - - # Uses no interval to account for - # behavior differences and avoid - # premature exit - return self._reward_mission_collect(interval=0.2) + return self._reward_mission_collect() def reward_mission_notice(self): """ @@ -263,13 +238,10 @@ class Reward(UI): self.ui_goto(page_mission, skip_first_screenshot=True) - reward = False if daily: - reward |= self._reward_mission_all() + self._reward_mission_all() if weekly: - reward |= self._reward_mission_weekly() - - return reward + self._reward_mission_weekly() @cached_property def _reward_side_navbar(self): diff --git a/module/shop/assets.py b/module/shop/assets.py index fb6b8bf00..2081fdcce 100644 --- a/module/shop/assets.py +++ b/module/shop/assets.py @@ -8,8 +8,8 @@ AMOUNT_MAX = Button(area={'cn': (772, 316, 822, 332), 'en': (772, 316, 822, 332) AMOUNT_MINUS = Button(area={'cn': (546, 304, 586, 344), 'en': (546, 304, 586, 344), 'jp': (546, 304, 586, 344), 'tw': (546, 304, 586, 344)}, color={'cn': (76, 127, 195), 'en': (76, 127, 195), 'jp': (76, 127, 195), 'tw': (76, 127, 195)}, button={'cn': (546, 304, 586, 344), 'en': (546, 304, 586, 344), 'jp': (546, 304, 586, 344), 'tw': (546, 304, 586, 344)}, file={'cn': './assets/cn/shop/AMOUNT_MINUS.png', 'en': './assets/en/shop/AMOUNT_MINUS.png', 'jp': './assets/jp/shop/AMOUNT_MINUS.png', 'tw': './assets/tw/shop/AMOUNT_MINUS.png'}) AMOUNT_PLUS = Button(area={'cn': (693, 304, 735, 344), 'en': (693, 304, 735, 344), 'jp': (693, 304, 735, 344), 'tw': (693, 304, 735, 344)}, color={'cn': (81, 130, 196), 'en': (81, 130, 196), 'jp': (81, 130, 196), 'tw': (81, 130, 196)}, button={'cn': (693, 304, 735, 344), 'en': (693, 304, 735, 344), 'jp': (693, 304, 735, 344), 'tw': (693, 304, 735, 344)}, file={'cn': './assets/cn/shop/AMOUNT_PLUS.png', 'en': './assets/en/shop/AMOUNT_PLUS.png', 'jp': './assets/jp/shop/AMOUNT_PLUS.png', 'tw': './assets/tw/shop/AMOUNT_PLUS.png'}) MEDAL_SHOP_SCROLL_AREA_250814 = Button(area={'cn': (1063, 201, 1064, 623), 'en': (1063, 201, 1064, 623), 'jp': (1063, 201, 1064, 623), 'tw': (1063, 201, 1064, 623)}, color={'cn': (128, 143, 153), 'en': (128, 143, 153), 'jp': (128, 143, 153), 'tw': (128, 143, 153)}, button={'cn': (1063, 201, 1064, 623), 'en': (1063, 201, 1064, 623), 'jp': (1063, 201, 1064, 623), 'tw': (1063, 201, 1064, 623)}, file={'cn': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'en': './assets/en/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'jp': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'tw': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png'}) -NAV_GENERAL = Button(area={'cn': (52, 436, 127, 457), 'en': (47, 438, 127, 458), 'jp': (50, 438, 94, 458), 'tw': (52, 436, 127, 457)}, color={'cn': (126, 178, 207), 'en': (137, 185, 211), 'jp': (149, 194, 218), 'tw': (126, 178, 207)}, button={'cn': (52, 436, 127, 457), 'en': (47, 438, 127, 458), 'jp': (50, 438, 94, 458), 'tw': (52, 436, 127, 457)}, file={'cn': './assets/cn/shop/NAV_GENERAL.png', 'en': './assets/en/shop/NAV_GENERAL.png', 'jp': './assets/jp/shop/NAV_GENERAL.png', 'tw': './assets/cn/shop/NAV_GENERAL.png'}) -NAV_MONTHLY = Button(area={'cn': (52, 486, 127, 508), 'en': (51, 487, 131, 507), 'jp': (53, 488, 125, 508), 'tw': (52, 486, 127, 508)}, color={'cn': (127, 178, 207), 'en': (129, 179, 207), 'jp': (161, 201, 219), 'tw': (127, 178, 207)}, button={'cn': (52, 486, 127, 508), 'en': (51, 487, 131, 507), 'jp': (53, 488, 125, 508), 'tw': (52, 486, 127, 508)}, file={'cn': './assets/cn/shop/NAV_MONTHLY.png', 'en': './assets/en/shop/NAV_MONTHLY.png', 'jp': './assets/jp/shop/NAV_MONTHLY.png', 'tw': './assets/cn/shop/NAV_MONTHLY.png'}) +NAV_GENERAL = Button(area={'cn': (52, 436, 127, 457), 'en': (47, 438, 127, 458), 'jp': (50, 438, 94, 458), 'tw': (53, 436, 126, 459)}, color={'cn': (126, 178, 207), 'en': (137, 185, 211), 'jp': (149, 194, 218), 'tw': (146, 191, 214)}, button={'cn': (52, 436, 127, 457), 'en': (47, 438, 127, 458), 'jp': (50, 438, 94, 458), 'tw': (53, 436, 126, 459)}, file={'cn': './assets/cn/shop/NAV_GENERAL.png', 'en': './assets/en/shop/NAV_GENERAL.png', 'jp': './assets/jp/shop/NAV_GENERAL.png', 'tw': './assets/tw/shop/NAV_GENERAL.png'}) +NAV_MONTHLY = Button(area={'cn': (52, 486, 127, 508), 'en': (51, 487, 131, 507), 'jp': (53, 488, 125, 508), 'tw': (53, 487, 125, 507)}, color={'cn': (127, 178, 207), 'en': (129, 179, 207), 'jp': (161, 201, 219), 'tw': (143, 187, 210)}, button={'cn': (52, 486, 127, 508), 'en': (51, 487, 131, 507), 'jp': (53, 488, 125, 508), 'tw': (53, 487, 125, 507)}, file={'cn': './assets/cn/shop/NAV_MONTHLY.png', 'en': './assets/en/shop/NAV_MONTHLY.png', 'jp': './assets/jp/shop/NAV_MONTHLY.png', 'tw': './assets/tw/shop/NAV_MONTHLY.png'}) SELECT_MINUS = Button(area={'cn': (562, 201, 588, 227), 'en': (562, 201, 588, 227), 'jp': (562, 201, 588, 227), 'tw': (562, 201, 588, 227)}, color={'cn': (86, 70, 70), 'en': (86, 70, 70), 'jp': (86, 70, 70), 'tw': (86, 70, 70)}, button={'cn': (562, 201, 588, 227), 'en': (562, 201, 588, 227), 'jp': (562, 201, 588, 227), 'tw': (562, 201, 588, 227)}, file={'cn': './assets/cn/shop/SELECT_MINUS.png', 'en': './assets/en/shop/SELECT_MINUS.png', 'jp': './assets/jp/shop/SELECT_MINUS.png', 'tw': './assets/tw/shop/SELECT_MINUS.png'}) SELECT_PLUS = Button(area={'cn': (674, 201, 700, 227), 'en': (674, 201, 700, 227), 'jp': (674, 201, 700, 227), 'tw': (674, 201, 700, 227)}, color={'cn': (97, 70, 70), 'en': (97, 70, 70), 'jp': (97, 70, 70), 'tw': (97, 70, 70)}, button={'cn': (674, 201, 700, 227), 'en': (674, 201, 700, 227), 'jp': (674, 201, 700, 227), 'tw': (674, 201, 700, 227)}, file={'cn': './assets/cn/shop/SELECT_PLUS.png', 'en': './assets/en/shop/SELECT_PLUS.png', 'jp': './assets/jp/shop/SELECT_PLUS.png', 'tw': './assets/tw/shop/SELECT_PLUS.png'}) SHOP_AMOUNT = Button(area={'cn': (600, 310, 680, 340), 'en': (600, 310, 680, 340), 'jp': (600, 310, 680, 340), 'tw': (600, 310, 680, 340)}, color={'cn': (48, 52, 62), 'en': (48, 52, 62), 'jp': (48, 52, 62), 'tw': (48, 52, 62)}, button={'cn': (600, 310, 680, 340), 'en': (600, 310, 680, 340), 'jp': (600, 310, 680, 340), 'tw': (600, 310, 680, 340)}, file={'cn': './assets/cn/shop/SHOP_AMOUNT.png', 'en': './assets/en/shop/SHOP_AMOUNT.png', 'jp': './assets/jp/shop/SHOP_AMOUNT.png', 'tw': './assets/tw/shop/SHOP_AMOUNT.png'}) @@ -29,13 +29,13 @@ SHOP_SELECT_PR2 = Button(area={'cn': (182, 212, 310, 340), 'en': (182, 212, 310, SHOP_SELECT_PR3 = Button(area={'cn': (180, 212, 309, 340), 'en': (180, 212, 309, 340), 'jp': (180, 212, 309, 340), 'tw': (180, 212, 309, 340)}, color={'cn': (156, 156, 142), 'en': (156, 156, 142), 'jp': (156, 156, 142), 'tw': (156, 156, 142)}, button={'cn': (180, 212, 309, 340), 'en': (180, 212, 309, 340), 'jp': (180, 212, 309, 340), 'tw': (180, 212, 309, 340)}, file={'cn': './assets/cn/shop/SHOP_SELECT_PR3.png', 'en': './assets/en/shop/SHOP_SELECT_PR3.png', 'jp': './assets/jp/shop/SHOP_SELECT_PR3.png', 'tw': './assets/tw/shop/SHOP_SELECT_PR3.png'}) SHOP_SELECT_STOCK = Button(area={'cn': (1070, 152, 1126, 178), 'en': (1070, 152, 1126, 178), 'jp': (1070, 152, 1126, 178), 'tw': (1070, 152, 1126, 178)}, color={'cn': (76, 88, 90), 'en': (76, 88, 90), 'jp': (76, 88, 90), 'tw': (76, 88, 90)}, button={'cn': (1070, 152, 1126, 178), 'en': (1070, 152, 1126, 178), 'jp': (1070, 152, 1126, 178), 'tw': (1070, 152, 1126, 178)}, file={'cn': './assets/cn/shop/SHOP_SELECT_STOCK.png', 'en': './assets/en/shop/SHOP_SELECT_STOCK.png', 'jp': './assets/jp/shop/SHOP_SELECT_STOCK.png', 'tw': './assets/tw/shop/SHOP_SELECT_STOCK.png'}) SHOP_VOUCHER = Button(area={'cn': (1115, 123, 1261, 158), 'en': (1115, 123, 1261, 158), 'jp': (1115, 123, 1261, 158), 'tw': (1115, 123, 1261, 158)}, color={'cn': (90, 96, 110), 'en': (90, 96, 110), 'jp': (90, 96, 110), 'tw': (90, 96, 110)}, button={'cn': (1115, 123, 1261, 158), 'en': (1115, 123, 1261, 158), 'jp': (1115, 123, 1261, 158), 'tw': (1115, 123, 1261, 158)}, file={'cn': './assets/cn/shop/SHOP_VOUCHER.png', 'en': './assets/en/shop/SHOP_VOUCHER.png', 'jp': './assets/jp/shop/SHOP_VOUCHER.png', 'tw': './assets/tw/shop/SHOP_VOUCHER.png'}) -TAB_CORE_LIMITED = Button(area={'cn': (303, 99, 340, 118), 'en': (247, 97, 357, 122), 'jp': (303, 98, 343, 118), 'tw': (303, 99, 340, 118)}, color={'cn': (154, 161, 166), 'en': (190, 197, 200), 'jp': (164, 172, 177), 'tw': (154, 161, 166)}, button={'cn': (303, 99, 340, 118), 'en': (247, 97, 357, 122), 'jp': (303, 98, 343, 118), 'tw': (303, 99, 340, 118)}, file={'cn': './assets/cn/shop/TAB_CORE_LIMITED.png', 'en': './assets/en/shop/TAB_CORE_LIMITED.png', 'jp': './assets/jp/shop/TAB_CORE_LIMITED.png', 'tw': './assets/cn/shop/TAB_CORE_LIMITED.png'}) -TAB_CORE_MONTHLY = Button(area={'cn': (533, 100, 570, 118), 'en': (477, 96, 587, 121), 'jp': (533, 98, 573, 118), 'tw': (533, 100, 570, 118)}, color={'cn': (154, 161, 166), 'en': (192, 198, 201), 'jp': (173, 180, 184), 'tw': (154, 161, 166)}, button={'cn': (533, 100, 570, 118), 'en': (477, 96, 587, 121), 'jp': (533, 98, 573, 118), 'tw': (533, 100, 570, 118)}, file={'cn': './assets/cn/shop/TAB_CORE_MONTHLY.png', 'en': './assets/en/shop/TAB_CORE_MONTHLY.png', 'jp': './assets/jp/shop/TAB_CORE_MONTHLY.png', 'tw': './assets/cn/shop/TAB_CORE_MONTHLY.png'}) -TAB_GENERAL = Button(area={'cn': (259, 98, 300, 118), 'en': (249, 100, 309, 120), 'jp': (240, 97, 320, 118), 'tw': (259, 98, 300, 118)}, color={'cn': (175, 182, 186), 'en': (176, 183, 187), 'jp': (207, 213, 217), 'tw': (175, 182, 186)}, button={'cn': (259, 98, 300, 118), 'en': (249, 100, 309, 120), 'jp': (240, 97, 320, 118), 'tw': (259, 98, 300, 118)}, file={'cn': './assets/cn/shop/TAB_GENERAL.png', 'en': './assets/en/shop/TAB_GENERAL.png', 'jp': './assets/jp/shop/TAB_GENERAL.png', 'tw': './assets/cn/shop/TAB_GENERAL.png'}) -TAB_GUILD = Button(area={'cn': (627, 98, 668, 118), 'en': (617, 99, 677, 119), 'jp': (617, 97, 678, 119), 'tw': (627, 98, 668, 118)}, color={'cn': (160, 167, 172), 'en': (173, 180, 184), 'jp': (173, 180, 185), 'tw': (160, 167, 172)}, button={'cn': (627, 98, 668, 118), 'en': (617, 99, 677, 119), 'jp': (617, 97, 678, 119), 'tw': (627, 98, 668, 118)}, file={'cn': './assets/cn/shop/TAB_GUILD.png', 'en': './assets/en/shop/TAB_GUILD.png', 'jp': './assets/jp/shop/TAB_GUILD.png', 'tw': './assets/cn/shop/TAB_GUILD.png'}) -TAB_MEDAL = Button(area={'cn': (742, 99, 783, 118), 'en': (733, 99, 793, 119), 'jp': (742, 98, 785, 119), 'tw': (742, 99, 783, 118)}, color={'cn': (151, 159, 163), 'en': (165, 172, 176), 'jp': (171, 178, 183), 'tw': (151, 159, 163)}, button={'cn': (742, 99, 783, 118), 'en': (733, 99, 793, 119), 'jp': (742, 98, 785, 119), 'tw': (742, 99, 783, 118)}, file={'cn': './assets/cn/shop/TAB_MEDAL.png', 'en': './assets/en/shop/TAB_MEDAL.png', 'jp': './assets/jp/shop/TAB_MEDAL.png', 'tw': './assets/cn/shop/TAB_MEDAL.png'}) -TAB_MERIT = Button(area={'cn': (443, 98, 484, 118), 'en': (434, 99, 494, 119), 'jp': (442, 97, 485, 118), 'tw': (443, 98, 484, 118)}, color={'cn': (157, 164, 169), 'en': (176, 183, 187), 'jp': (170, 177, 182), 'tw': (157, 164, 169)}, button={'cn': (443, 98, 484, 118), 'en': (434, 99, 494, 119), 'jp': (442, 97, 485, 118), 'tw': (443, 98, 484, 118)}, file={'cn': './assets/cn/shop/TAB_MERIT.png', 'en': './assets/en/shop/TAB_MERIT.png', 'jp': './assets/jp/shop/TAB_MERIT.png', 'tw': './assets/cn/shop/TAB_MERIT.png'}) +TAB_CORE_LIMITED = Button(area={'cn': (303, 99, 340, 118), 'en': (247, 97, 357, 122), 'jp': (303, 98, 343, 118), 'tw': (302, 99, 342, 120)}, color={'cn': (154, 161, 166), 'en': (190, 197, 200), 'jp': (164, 172, 177), 'tw': (182, 188, 193)}, button={'cn': (303, 99, 340, 118), 'en': (247, 97, 357, 122), 'jp': (303, 98, 343, 118), 'tw': (302, 99, 342, 120)}, file={'cn': './assets/cn/shop/TAB_CORE_LIMITED.png', 'en': './assets/en/shop/TAB_CORE_LIMITED.png', 'jp': './assets/jp/shop/TAB_CORE_LIMITED.png', 'tw': './assets/tw/shop/TAB_CORE_LIMITED.png'}) +TAB_CORE_MONTHLY = Button(area={'cn': (533, 100, 570, 118), 'en': (477, 96, 587, 121), 'jp': (533, 98, 573, 118), 'tw': (533, 99, 572, 120)}, color={'cn': (154, 161, 166), 'en': (192, 198, 201), 'jp': (173, 180, 184), 'tw': (184, 189, 195)}, button={'cn': (533, 100, 570, 118), 'en': (477, 96, 587, 121), 'jp': (533, 98, 573, 118), 'tw': (533, 99, 572, 120)}, file={'cn': './assets/cn/shop/TAB_CORE_MONTHLY.png', 'en': './assets/en/shop/TAB_CORE_MONTHLY.png', 'jp': './assets/jp/shop/TAB_CORE_MONTHLY.png', 'tw': './assets/tw/shop/TAB_CORE_MONTHLY.png'}) +TAB_GENERAL = Button(area={'cn': (259, 98, 300, 118), 'en': (249, 100, 309, 120), 'jp': (240, 97, 320, 118), 'tw': (260, 97, 300, 119)}, color={'cn': (175, 182, 186), 'en': (176, 183, 187), 'jp': (207, 213, 217), 'tw': (192, 201, 203)}, button={'cn': (259, 98, 300, 118), 'en': (249, 100, 309, 120), 'jp': (240, 97, 320, 118), 'tw': (260, 97, 300, 119)}, file={'cn': './assets/cn/shop/TAB_GENERAL.png', 'en': './assets/en/shop/TAB_GENERAL.png', 'jp': './assets/jp/shop/TAB_GENERAL.png', 'tw': './assets/tw/shop/TAB_GENERAL.png'}) +TAB_GUILD = Button(area={'cn': (627, 98, 668, 118), 'en': (617, 99, 677, 119), 'jp': (617, 97, 678, 119), 'tw': (628, 100, 667, 119)}, color={'cn': (160, 167, 172), 'en': (173, 180, 184), 'jp': (173, 180, 185), 'tw': (167, 174, 179)}, button={'cn': (627, 98, 668, 118), 'en': (617, 99, 677, 119), 'jp': (617, 97, 678, 119), 'tw': (628, 100, 667, 119)}, file={'cn': './assets/cn/shop/TAB_GUILD.png', 'en': './assets/en/shop/TAB_GUILD.png', 'jp': './assets/jp/shop/TAB_GUILD.png', 'tw': './assets/tw/shop/TAB_GUILD.png'}) +TAB_MEDAL = Button(area={'cn': (742, 99, 783, 118), 'en': (733, 99, 793, 119), 'jp': (742, 98, 785, 119), 'tw': (741, 97, 786, 120)}, color={'cn': (151, 159, 163), 'en': (165, 172, 176), 'jp': (171, 178, 183), 'tw': (187, 193, 198)}, button={'cn': (742, 99, 783, 118), 'en': (733, 99, 793, 119), 'jp': (742, 98, 785, 119), 'tw': (741, 97, 786, 120)}, file={'cn': './assets/cn/shop/TAB_MEDAL.png', 'en': './assets/en/shop/TAB_MEDAL.png', 'jp': './assets/jp/shop/TAB_MEDAL.png', 'tw': './assets/tw/shop/TAB_MEDAL.png'}) +TAB_MERIT = Button(area={'cn': (443, 98, 484, 118), 'en': (434, 99, 494, 119), 'jp': (442, 97, 485, 118), 'tw': (443, 99, 485, 120)}, color={'cn': (157, 164, 169), 'en': (176, 183, 187), 'jp': (170, 177, 182), 'tw': (179, 185, 190)}, button={'cn': (443, 98, 484, 118), 'en': (434, 99, 494, 119), 'jp': (442, 97, 485, 118), 'tw': (443, 99, 485, 120)}, file={'cn': './assets/cn/shop/TAB_MERIT.png', 'en': './assets/en/shop/TAB_MERIT.png', 'jp': './assets/jp/shop/TAB_MERIT.png', 'tw': './assets/tw/shop/TAB_MERIT.png'}) TAB_META = Button(area={'cn': (804, 99, 860, 117), 'en': (801, 99, 861, 119), 'jp': (799, 98, 865, 118), 'tw': (804, 99, 860, 117)}, color={'cn': (172, 179, 183), 'en': (173, 179, 183), 'jp': (187, 193, 198), 'tw': (172, 179, 183)}, button={'cn': (804, 99, 860, 117), 'en': (801, 99, 861, 119), 'jp': (799, 98, 865, 118), 'tw': (804, 99, 860, 117)}, file={'cn': './assets/cn/shop/TAB_META.png', 'en': './assets/en/shop/TAB_META.png', 'jp': './assets/jp/shop/TAB_META.png', 'tw': './assets/cn/shop/TAB_META.png'}) -TAB_PRIZE = Button(area={'cn': (995, 98, 1037, 118), 'en': (985, 99, 1045, 119), 'jp': (977, 97, 1053, 118), 'tw': (995, 98, 1037, 118)}, color={'cn': (162, 168, 173), 'en': (183, 189, 193), 'jp': (204, 210, 213), 'tw': (162, 168, 173)}, button={'cn': (995, 98, 1037, 118), 'en': (985, 99, 1045, 119), 'jp': (977, 97, 1053, 118), 'tw': (995, 98, 1037, 118)}, file={'cn': './assets/cn/shop/TAB_PRIZE.png', 'en': './assets/en/shop/TAB_PRIZE.png', 'jp': './assets/jp/shop/TAB_PRIZE.png', 'tw': './assets/cn/shop/TAB_PRIZE.png'}) -TAB_PROTOTYPE = Button(area={'cn': (973, 98, 1013, 118), 'en': (963, 99, 1023, 119), 'jp': (963, 99, 1021, 119), 'tw': (973, 98, 1013, 118)}, color={'cn': (154, 161, 165), 'en': (178, 184, 188), 'jp': (197, 203, 207), 'tw': (154, 161, 165)}, button={'cn': (973, 98, 1013, 118), 'en': (963, 99, 1023, 119), 'jp': (963, 99, 1021, 119), 'tw': (973, 98, 1013, 118)}, file={'cn': './assets/cn/shop/TAB_PROTOTYPE.png', 'en': './assets/en/shop/TAB_PROTOTYPE.png', 'jp': './assets/jp/shop/TAB_PROTOTYPE.png', 'tw': './assets/cn/shop/TAB_PROTOTYPE.png'}) +TAB_PRIZE = Button(area={'cn': (995, 98, 1037, 118), 'en': (985, 99, 1045, 119), 'jp': (977, 97, 1053, 118), 'tw': (996, 99, 1035, 119)}, color={'cn': (162, 168, 173), 'en': (183, 189, 193), 'jp': (204, 210, 213), 'tw': (176, 182, 187)}, button={'cn': (995, 98, 1037, 118), 'en': (985, 99, 1045, 119), 'jp': (977, 97, 1053, 118), 'tw': (996, 99, 1035, 119)}, file={'cn': './assets/cn/shop/TAB_PRIZE.png', 'en': './assets/en/shop/TAB_PRIZE.png', 'jp': './assets/jp/shop/TAB_PRIZE.png', 'tw': './assets/tw/shop/TAB_PRIZE.png'}) +TAB_PROTOTYPE = Button(area={'cn': (973, 98, 1013, 118), 'en': (963, 99, 1023, 119), 'jp': (963, 99, 1021, 119), 'tw': (974, 99, 1014, 119)}, color={'cn': (154, 161, 165), 'en': (178, 184, 188), 'jp': (197, 203, 207), 'tw': (180, 185, 190)}, button={'cn': (973, 98, 1013, 118), 'en': (963, 99, 1023, 119), 'jp': (963, 99, 1021, 119), 'tw': (974, 99, 1014, 119)}, file={'cn': './assets/cn/shop/TAB_PROTOTYPE.png', 'en': './assets/en/shop/TAB_PROTOTYPE.png', 'jp': './assets/jp/shop/TAB_PROTOTYPE.png', 'tw': './assets/tw/shop/TAB_PROTOTYPE.png'}) VOUCHER_SHOP_SCROLL_AREA = Button(area={'cn': (1257, 184, 1263, 647), 'en': (1257, 184, 1263, 647), 'jp': (1257, 184, 1263, 647), 'tw': (1257, 184, 1263, 647)}, color={'cn': (255, 255, 255), 'en': (255, 255, 255), 'jp': (255, 255, 255), 'tw': (255, 255, 255)}, button={'cn': (1257, 184, 1263, 647), 'en': (1257, 184, 1263, 647), 'jp': (1257, 184, 1263, 647), 'tw': (1257, 184, 1263, 647)}, file={'cn': './assets/cn/shop/VOUCHER_SHOP_SCROLL_AREA.png', 'en': './assets/en/shop/VOUCHER_SHOP_SCROLL_AREA.png', 'jp': './assets/jp/shop/VOUCHER_SHOP_SCROLL_AREA.png', 'tw': './assets/tw/shop/VOUCHER_SHOP_SCROLL_AREA.png'}) diff --git a/module/shop/shop_reward.py b/module/shop/shop_reward.py index 748996734..c9f76f07d 100644 --- a/module/shop/shop_reward.py +++ b/module/shop/shop_reward.py @@ -9,10 +9,6 @@ from module.shop.ui import ShopUI class RewardShop(ShopUI): def run_frequent(self): - if self.config.SERVER in ['tw']: - self.config.task_delay(server_update=True) - self.config.task_stop() - self.ui_goto_shop() self.device.click_record_clear() self.shop_nav_250814.set(NAV_GENERAL, main=self) @@ -22,10 +18,6 @@ class RewardShop(ShopUI): self.config.task_delay(server_update=True) def run_once(self): - if self.config.SERVER in ['tw']: - self.config.task_delay(server_update=True) - self.config.task_stop() - # Munitions shops self.ui_goto_shop() self.device.click_record_clear() diff --git a/module/ui/assets.py b/module/ui/assets.py index 3298d07ff..d899d9779 100644 --- a/module/ui/assets.py +++ b/module/ui/assets.py @@ -65,8 +65,8 @@ MEOWFFICER_CHECK = Button(area={'cn': (142, 16, 212, 38), 'en': (142, 18, 213, 3 MEOWFFICER_GOTO_DORMMENU = Button(area={'cn': (24, 7, 49, 45), 'en': (24, 7, 49, 45), 'jp': (15, 4, 61, 49), 'tw': (24, 7, 49, 45)}, color={'cn': (248, 222, 158), 'en': (248, 222, 158), 'jp': (241, 233, 201), 'tw': (248, 222, 158)}, button={'cn': (24, 7, 49, 45), 'en': (24, 7, 49, 45), 'jp': (15, 4, 61, 49), 'tw': (24, 7, 49, 45)}, file={'cn': './assets/cn/ui/MEOWFFICER_GOTO_DORMMENU.png', 'en': './assets/en/ui/MEOWFFICER_GOTO_DORMMENU.png', 'jp': './assets/jp/ui/MEOWFFICER_GOTO_DORMMENU.png', 'tw': './assets/tw/ui/MEOWFFICER_GOTO_DORMMENU.png'}) MEOWFFICER_INFO = Button(area={'cn': (1090, 603, 1241, 650), 'en': (1106, 616, 1227, 638), 'jp': (1089, 608, 1240, 647), 'tw': (1124, 610, 1207, 647)}, color={'cn': (243, 214, 92), 'en': (212, 182, 77), 'jp': (247, 218, 92), 'tw': (229, 200, 87)}, button={'cn': (1090, 603, 1241, 650), 'en': (1106, 616, 1227, 638), 'jp': (1089, 608, 1240, 647), 'tw': (1124, 610, 1207, 647)}, file={'cn': './assets/cn/ui/MEOWFFICER_INFO.png', 'en': './assets/en/ui/MEOWFFICER_INFO.png', 'jp': './assets/jp/ui/MEOWFFICER_INFO.png', 'tw': './assets/tw/ui/MEOWFFICER_INFO.png'}) META_CHECK = Button(area={'cn': (120, 14, 209, 35), 'en': (148, 13, 265, 36), 'jp': (125, 11, 235, 39), 'tw': (120, 14, 209, 35)}, color={'cn': (159, 143, 144), 'en': (170, 156, 156), 'jp': (124, 105, 106), 'tw': (159, 143, 144)}, button={'cn': (120, 14, 209, 35), 'en': (148, 13, 265, 36), 'jp': (125, 11, 235, 39), 'tw': (120, 14, 209, 35)}, file={'cn': './assets/cn/ui/META_CHECK.png', 'en': './assets/en/ui/META_CHECK.png', 'jp': './assets/jp/ui/META_CHECK.png', 'tw': './assets/tw/ui/META_CHECK.png'}) -MISSION_CHECK = Button(area={'cn': (120, 15, 173, 40), 'en': (123, 18, 221, 37), 'jp': (120, 14, 173, 40), 'tw': (119, 12, 176, 42)}, color={'cn': (141, 156, 194), 'en': (104, 117, 158), 'jp': (150, 165, 202), 'tw': (125, 139, 178)}, button={'cn': (120, 15, 173, 40), 'en': (123, 18, 221, 37), 'jp': (120, 14, 173, 40), 'tw': (119, 12, 176, 42)}, file={'cn': './assets/cn/ui/MISSION_CHECK.png', 'en': './assets/en/ui/MISSION_CHECK.png', 'jp': './assets/jp/ui/MISSION_CHECK.png', 'tw': './assets/tw/ui/MISSION_CHECK.png'}) -MUNITIONS_CHECK = Button(area={'cn': (60, 361, 104, 395), 'en': (60, 361, 104, 395), 'jp': (59, 371, 126, 397), 'tw': (11, 374, 131, 402)}, color={'cn': (115, 191, 235), 'en': (111, 189, 234), 'jp': (134, 194, 227), 'tw': (101, 200, 255)}, button={'cn': (60, 361, 104, 395), 'en': (60, 361, 104, 395), 'jp': (59, 371, 126, 397), 'tw': (11, 374, 131, 402)}, file={'cn': './assets/cn/ui/MUNITIONS_CHECK.png', 'en': './assets/en/ui/MUNITIONS_CHECK.png', 'jp': './assets/jp/ui/MUNITIONS_CHECK.png', 'tw': './assets/tw/ui/MUNITIONS_CHECK.png'}) +MISSION_CHECK = Button(area={'cn': (120, 15, 173, 40), 'en': (120, 15, 260, 41), 'jp': (120, 14, 173, 40), 'tw': (119, 12, 176, 42)}, color={'cn': (141, 156, 194), 'en': (111, 124, 165), 'jp': (150, 165, 202), 'tw': (125, 139, 178)}, button={'cn': (120, 15, 173, 40), 'en': (120, 15, 260, 41), 'jp': (120, 14, 173, 40), 'tw': (119, 12, 176, 42)}, file={'cn': './assets/cn/ui/MISSION_CHECK.png', 'en': './assets/en/ui/MISSION_CHECK.png', 'jp': './assets/jp/ui/MISSION_CHECK.png', 'tw': './assets/tw/ui/MISSION_CHECK.png'}) +MUNITIONS_CHECK = Button(area={'cn': (60, 361, 104, 395), 'en': (60, 361, 104, 395), 'jp': (59, 371, 126, 397), 'tw': (59, 362, 106, 395)}, color={'cn': (115, 191, 235), 'en': (111, 189, 234), 'jp': (134, 194, 227), 'tw': (106, 188, 234)}, button={'cn': (60, 361, 104, 395), 'en': (60, 361, 104, 395), 'jp': (59, 371, 126, 397), 'tw': (59, 362, 106, 395)}, file={'cn': './assets/cn/ui/MUNITIONS_CHECK.png', 'en': './assets/en/ui/MUNITIONS_CHECK.png', 'jp': './assets/jp/ui/MUNITIONS_CHECK.png', 'tw': './assets/tw/ui/MUNITIONS_CHECK.png'}) OS_CHECK = Button(area={'cn': (613, 17, 627, 34), 'en': (613, 17, 627, 34), 'jp': (613, 17, 627, 34), 'tw': (613, 17, 627, 34)}, color={'cn': (58, 117, 146), 'en': (58, 117, 146), 'jp': (58, 117, 146), 'tw': (58, 117, 146)}, button={'cn': (613, 17, 627, 34), 'en': (613, 17, 627, 34), 'jp': (613, 17, 627, 34), 'tw': (613, 17, 627, 34)}, file={'cn': './assets/cn/ui/OS_CHECK.png', 'en': './assets/en/ui/OS_CHECK.png', 'jp': './assets/jp/ui/OS_CHECK.png', 'tw': './assets/tw/ui/OS_CHECK.png'}) PLAYER_CHECK = Button(area={'cn': (28, 668, 139, 688), 'en': (11, 649, 157, 705), 'jp': (26, 668, 139, 689), 'tw': (28, 668, 139, 688)}, color={'cn': (237, 204, 127), 'en': (197, 156, 97), 'jp': (237, 205, 128), 'tw': (237, 204, 127)}, button={'cn': (28, 668, 139, 688), 'en': (11, 649, 157, 705), 'jp': (26, 668, 139, 689), 'tw': (28, 668, 139, 688)}, file={'cn': './assets/cn/ui/PLAYER_CHECK.png', 'en': './assets/en/ui/PLAYER_CHECK.png', 'jp': './assets/jp/ui/PLAYER_CHECK.png', 'tw': './assets/tw/ui/PLAYER_CHECK.png'}) PQ_GOTO_MAIN = Button(area={'cn': (1107, 19, 1143, 51), 'en': (1107, 19, 1143, 51), 'jp': (1107, 19, 1143, 51), 'tw': (1107, 19, 1143, 51)}, color={'cn': (199, 199, 199), 'en': (199, 199, 199), 'jp': (199, 199, 199), 'tw': (199, 199, 199)}, button={'cn': (1107, 19, 1143, 51), 'en': (1107, 19, 1143, 51), 'jp': (1107, 19, 1143, 51), 'tw': (1107, 19, 1143, 51)}, file={'cn': './assets/cn/ui/PQ_GOTO_MAIN.png', 'en': './assets/en/ui/PQ_GOTO_MAIN.png', 'jp': './assets/jp/ui/PQ_GOTO_MAIN.png', 'tw': './assets/tw/ui/PQ_GOTO_MAIN.png'}) @@ -78,7 +78,7 @@ RESHMENU_GOTO_META = Button(area={'cn': (1076, 254, 1155, 334), 'en': (1102, 251 RESHMENU_GOTO_RESEARCH = Button(area={'cn': (308, 268, 466, 422), 'en': (308, 268, 466, 422), 'jp': (308, 268, 466, 422), 'tw': (308, 268, 466, 422)}, color={'cn': (132, 147, 184), 'en': (132, 147, 184), 'jp': (132, 147, 184), 'tw': (132, 147, 184)}, button={'cn': (308, 268, 466, 422), 'en': (308, 268, 466, 422), 'jp': (308, 268, 466, 422), 'tw': (308, 268, 466, 422)}, file={'cn': './assets/cn/ui/RESHMENU_GOTO_RESEARCH.png', 'en': './assets/en/ui/RESHMENU_GOTO_RESEARCH.png', 'jp': './assets/jp/ui/RESHMENU_GOTO_RESEARCH.png', 'tw': './assets/tw/ui/RESHMENU_GOTO_RESEARCH.png'}) RESHMENU_GOTO_SHIPYARD = Button(area={'cn': (567, 275, 731, 397), 'en': (567, 275, 731, 397), 'jp': (567, 275, 731, 397), 'tw': (567, 275, 731, 397)}, color={'cn': (113, 126, 162), 'en': (113, 126, 162), 'jp': (113, 126, 162), 'tw': (113, 126, 162)}, button={'cn': (567, 275, 731, 397), 'en': (567, 275, 731, 397), 'jp': (567, 275, 731, 397), 'tw': (567, 275, 731, 397)}, file={'cn': './assets/cn/ui/RESHMENU_GOTO_SHIPYARD.png', 'en': './assets/en/ui/RESHMENU_GOTO_SHIPYARD.png', 'jp': './assets/jp/ui/RESHMENU_GOTO_SHIPYARD.png', 'tw': './assets/tw/ui/RESHMENU_GOTO_SHIPYARD.png'}) REWARD_CHECK = Button(area={'cn': (219, 107, 267, 158), 'en': (219, 107, 267, 158), 'jp': (219, 107, 267, 158), 'tw': (219, 107, 267, 158)}, color={'cn': (143, 116, 123), 'en': (143, 116, 123), 'jp': (143, 116, 123), 'tw': (143, 116, 123)}, button={'cn': (219, 107, 267, 158), 'en': (219, 107, 267, 158), 'jp': (219, 107, 267, 158), 'tw': (219, 107, 267, 158)}, file={'cn': './assets/cn/ui/REWARD_CHECK.png', 'en': './assets/en/ui/REWARD_CHECK.png', 'jp': './assets/jp/ui/REWARD_CHECK.png', 'tw': './assets/tw/ui/REWARD_CHECK.png'}) -REWARD_GOTO_BATTLE_PASS = Button(area={'cn': (580, 117, 620, 155), 'en': (580, 117, 620, 155), 'jp': (580, 117, 620, 155), 'tw': (580, 117, 620, 155)}, color={'cn': (92, 113, 139), 'en': (92, 113, 139), 'jp': (92, 113, 139), 'tw': (92, 113, 139)}, button={'cn': (580, 117, 620, 155), 'en': (580, 117, 620, 155), 'jp': (580, 117, 620, 155), 'tw': (580, 117, 620, 155)}, file={'cn': './assets/cn/ui/REWARD_GOTO_BATTLE_PASS.png', 'en': './assets/en/ui/REWARD_GOTO_BATTLE_PASS.png', 'jp': './assets/jp/ui/REWARD_GOTO_BATTLE_PASS.png', 'tw': './assets/cn/ui/REWARD_GOTO_BATTLE_PASS.png'}) +REWARD_GOTO_BATTLE_PASS = Button(area={'cn': (580, 117, 620, 155), 'en': (580, 117, 620, 155), 'jp': (580, 117, 620, 155), 'tw': (603, 105, 640, 141)}, color={'cn': (92, 113, 139), 'en': (92, 113, 139), 'jp': (92, 113, 139), 'tw': (81, 107, 145)}, button={'cn': (580, 117, 620, 155), 'en': (580, 117, 620, 155), 'jp': (580, 117, 620, 155), 'tw': (603, 105, 640, 141)}, file={'cn': './assets/cn/ui/REWARD_GOTO_BATTLE_PASS.png', 'en': './assets/en/ui/REWARD_GOTO_BATTLE_PASS.png', 'jp': './assets/jp/ui/REWARD_GOTO_BATTLE_PASS.png', 'tw': './assets/tw/ui/REWARD_GOTO_BATTLE_PASS.png'}) REWARD_GOTO_COMMISSION = Button(area={'cn': (418, 271, 468, 293), 'en': (407, 274, 499, 291), 'jp': (431, 274, 476, 295), 'tw': (418, 271, 468, 293)}, color={'cn': (142, 172, 216), 'en': (158, 183, 220), 'jp': (153, 180, 219), 'tw': (142, 172, 216)}, button={'cn': (383, 262, 503, 302), 'en': (393, 262, 514, 303), 'jp': (393, 262, 514, 303), 'tw': (383, 262, 503, 302)}, file={'cn': './assets/cn/ui/REWARD_GOTO_COMMISSION.png', 'en': './assets/en/ui/REWARD_GOTO_COMMISSION.png', 'jp': './assets/jp/ui/REWARD_GOTO_COMMISSION.png', 'tw': './assets/tw/ui/REWARD_GOTO_COMMISSION.png'}) REWARD_GOTO_MAIN = Button(area={'cn': (219, 107, 267, 158), 'en': (219, 107, 267, 158), 'jp': (219, 107, 267, 158), 'tw': (219, 107, 267, 158)}, color={'cn': (143, 116, 123), 'en': (143, 116, 123), 'jp': (143, 116, 123), 'tw': (143, 116, 123)}, button={'cn': (787, 602, 867, 642), 'en': (787, 602, 867, 642), 'jp': (787, 602, 867, 642), 'tw': (787, 602, 867, 642)}, file={'cn': './assets/cn/ui/REWARD_GOTO_MAIN.png', 'en': './assets/en/ui/REWARD_GOTO_MAIN.png', 'jp': './assets/jp/ui/REWARD_GOTO_MAIN.png', 'tw': './assets/tw/ui/REWARD_GOTO_MAIN.png'}) REWARD_GOTO_TACTICAL = Button(area={'cn': (418, 413, 468, 434), 'en': (407, 416, 499, 433), 'jp': (431, 416, 476, 437), 'tw': (418, 413, 468, 435)}, color={'cn': (143, 176, 216), 'en': (157, 185, 219), 'jp': (151, 182, 217), 'tw': (141, 175, 215)}, button={'cn': (383, 404, 503, 444), 'en': (393, 404, 514, 445), 'jp': (393, 404, 514, 445), 'tw': (383, 404, 503, 444)}, file={'cn': './assets/cn/ui/REWARD_GOTO_TACTICAL.png', 'en': './assets/en/ui/REWARD_GOTO_TACTICAL.png', 'jp': './assets/jp/ui/REWARD_GOTO_TACTICAL.png', 'tw': './assets/tw/ui/REWARD_GOTO_TACTICAL.png'}) @@ -89,7 +89,7 @@ SHOP_GOTO_MUNITIONS = Button(area={'cn': (840, 560, 999, 600), 'en': (840, 560, SHOP_GOTO_SUPPLY_PACK = Button(area={'cn': (1044, 321, 1094, 366), 'en': (1044, 321, 1094, 366), 'jp': (1044, 321, 1094, 366), 'tw': (883, 537, 929, 579)}, color={'cn': (198, 155, 150), 'en': (198, 155, 150), 'jp': (198, 155, 150), 'tw': (197, 131, 140)}, button={'cn': (902, 105, 1211, 490), 'en': (902, 105, 1211, 490), 'jp': (902, 105, 1211, 490), 'tw': (810, 353, 987, 638)}, file={'cn': './assets/cn/ui/SHOP_GOTO_SUPPLY_PACK.png', 'en': './assets/en/ui/SHOP_GOTO_SUPPLY_PACK.png', 'jp': './assets/jp/ui/SHOP_GOTO_SUPPLY_PACK.png', 'tw': './assets/tw/ui/SHOP_GOTO_SUPPLY_PACK.png'}) SP_CHECK = Button(area={'cn': (123, 63, 206, 109), 'en': (123, 63, 206, 109), 'jp': (125, 66, 205, 107), 'tw': (123, 63, 206, 109)}, color={'cn': (95, 110, 145), 'en': (95, 110, 145), 'jp': (78, 92, 127), 'tw': (95, 110, 145)}, button={'cn': (123, 63, 206, 109), 'en': (123, 63, 206, 109), 'jp': (125, 66, 205, 107), 'tw': (123, 63, 206, 109)}, file={'cn': './assets/cn/ui/SP_CHECK.png', 'en': './assets/en/ui/SP_CHECK.png', 'jp': './assets/jp/ui/SP_CHECK.png', 'tw': './assets/tw/ui/SP_CHECK.png'}) STORAGE_CHECK = Button(area={'cn': (120, 14, 175, 40), 'en': (123, 14, 209, 36), 'jp': (121, 13, 176, 41), 'tw': (120, 14, 175, 40)}, color={'cn': (137, 151, 188), 'en': (119, 133, 174), 'jp': (137, 156, 196), 'tw': (137, 151, 188)}, button={'cn': (120, 14, 175, 40), 'en': (123, 14, 209, 36), 'jp': (121, 13, 176, 41), 'tw': (120, 14, 175, 40)}, file={'cn': './assets/cn/ui/STORAGE_CHECK.png', 'en': './assets/en/ui/STORAGE_CHECK.png', 'jp': './assets/jp/ui/STORAGE_CHECK.png', 'tw': './assets/cn/ui/STORAGE_CHECK.png'}) -SUPPLY_PACK_CHECK = Button(area={'cn': (60, 232, 104, 265), 'en': (60, 232, 104, 265), 'jp': (61, 237, 102, 265), 'tw': (31, 229, 103, 285)}, color={'cn': (120, 193, 236), 'en': (121, 193, 236), 'jp': (101, 186, 233), 'tw': (80, 190, 255)}, button={'cn': (60, 232, 104, 265), 'en': (60, 232, 104, 265), 'jp': (61, 237, 102, 265), 'tw': (31, 229, 103, 285)}, file={'cn': './assets/cn/ui/SUPPLY_PACK_CHECK.png', 'en': './assets/en/ui/SUPPLY_PACK_CHECK.png', 'jp': './assets/jp/ui/SUPPLY_PACK_CHECK.png', 'tw': './assets/tw/ui/SUPPLY_PACK_CHECK.png'}) +SUPPLY_PACK_CHECK = Button(area={'cn': (60, 232, 104, 265), 'en': (60, 232, 104, 265), 'jp': (61, 237, 102, 265), 'tw': (82, 241, 150, 266)}, color={'cn': (120, 193, 236), 'en': (121, 193, 236), 'jp': (101, 186, 233), 'tw': (118, 196, 233)}, button={'cn': (60, 232, 104, 265), 'en': (60, 232, 104, 265), 'jp': (61, 237, 102, 265), 'tw': (82, 241, 150, 266)}, file={'cn': './assets/cn/ui/SUPPLY_PACK_CHECK.png', 'en': './assets/en/ui/SUPPLY_PACK_CHECK.png', 'jp': './assets/jp/ui/SUPPLY_PACK_CHECK.png', 'tw': './assets/tw/ui/SUPPLY_PACK_CHECK.png'}) TACTICAL_CHECK = Button(area={'cn': (122, 14, 231, 38), 'en': (119, 17, 302, 36), 'jp': (122, 12, 232, 37), 'tw': (122, 15, 230, 39)}, color={'cn': (145, 161, 200), 'en': (110, 124, 164), 'jp': (155, 171, 209), 'tw': (158, 174, 212)}, button={'cn': (122, 14, 231, 38), 'en': (119, 17, 302, 36), 'jp': (122, 12, 232, 37), 'tw': (122, 15, 230, 39)}, file={'cn': './assets/cn/ui/TACTICAL_CHECK.png', 'en': './assets/en/ui/TACTICAL_CHECK.png', 'jp': './assets/jp/ui/TACTICAL_CHECK.png', 'tw': './assets/tw/ui/TACTICAL_CHECK.png'}) WAR_ARCHIVES_CHECK = Button(area={'cn': (95, 41, 114, 70), 'en': (95, 41, 114, 70), 'jp': (95, 41, 114, 70), 'tw': (95, 41, 114, 70)}, color={'cn': (137, 177, 208), 'en': (137, 177, 208), 'jp': (137, 177, 208), 'tw': (137, 177, 208)}, button={'cn': (95, 41, 114, 70), 'en': (95, 41, 114, 70), 'jp': (95, 41, 114, 70), 'tw': (95, 41, 114, 70)}, file={'cn': './assets/cn/ui/WAR_ARCHIVES_CHECK.png', 'en': './assets/en/ui/WAR_ARCHIVES_CHECK.png', 'jp': './assets/jp/ui/WAR_ARCHIVES_CHECK.png', 'tw': './assets/tw/ui/WAR_ARCHIVES_CHECK.png'}) WAR_ARCHIVES_GOTO_CAMPAIGN_MENU = Button(area={'cn': (95, 41, 114, 70), 'en': (95, 41, 114, 70), 'jp': (95, 41, 114, 70), 'tw': (95, 41, 114, 70)}, color={'cn': (137, 177, 208), 'en': (137, 177, 208), 'jp': (137, 177, 208), 'tw': (137, 177, 208)}, button={'cn': (14, 312, 69, 467), 'en': (14, 312, 69, 467), 'jp': (14, 312, 69, 467), 'tw': (14, 312, 69, 467)}, file={'cn': './assets/cn/ui/WAR_ARCHIVES_GOTO_CAMPAIGN_MENU.png', 'en': './assets/en/ui/WAR_ARCHIVES_GOTO_CAMPAIGN_MENU.png', 'jp': './assets/jp/ui/WAR_ARCHIVES_GOTO_CAMPAIGN_MENU.png', 'tw': './assets/tw/ui/WAR_ARCHIVES_GOTO_CAMPAIGN_MENU.png'}) diff --git a/module/ui_white/assets.py b/module/ui_white/assets.py index 19852f595..5f0a38895 100644 --- a/module/ui_white/assets.py +++ b/module/ui_white/assets.py @@ -25,7 +25,7 @@ MAIN_GOTO_STORAGE_WHITE = Button(area={'cn': (331, 656, 478, 703), 'en': (331, 6 MAIN_TAB_SWITCH_WHITE = Button(area={'cn': (966, 548, 999, 582), 'en': (966, 548, 999, 582), 'jp': (966, 548, 999, 582), 'tw': (966, 548, 999, 582)}, color={'cn': (89, 93, 108), 'en': (89, 93, 108), 'jp': (89, 93, 108), 'tw': (89, 93, 108)}, button={'cn': (966, 548, 999, 582), 'en': (966, 548, 999, 582), 'jp': (966, 548, 999, 582), 'tw': (966, 548, 999, 582)}, file={'cn': './assets/cn/ui_white/MAIN_TAB_SWITCH_WHITE.png', 'en': './assets/en/ui_white/MAIN_TAB_SWITCH_WHITE.png', 'jp': './assets/jp/ui_white/MAIN_TAB_SWITCH_WHITE.png', 'tw': './assets/tw/ui_white/MAIN_TAB_SWITCH_WHITE.png'}) MISSION_NOTICE_WHITE = Button(area={'cn': (923, 657, 947, 671), 'en': (923, 657, 947, 671), 'jp': (923, 657, 947, 671), 'tw': (923, 657, 947, 671)}, color={'cn': (227, 168, 159), 'en': (227, 168, 159), 'jp': (227, 168, 159), 'tw': (227, 168, 159)}, button={'cn': (923, 657, 947, 671), 'en': (923, 657, 947, 671), 'jp': (923, 657, 947, 671), 'tw': (923, 657, 947, 671)}, file={'cn': './assets/cn/ui_white/MISSION_NOTICE_WHITE.png', 'en': './assets/en/ui_white/MISSION_NOTICE_WHITE.png', 'jp': './assets/jp/ui_white/MISSION_NOTICE_WHITE.png', 'tw': './assets/tw/ui_white/MISSION_NOTICE_WHITE.png'}) POPUP_CANCEL_WHITE = Button(area={'cn': (487, 491, 531, 513), 'en': (471, 492, 547, 513), 'jp': (481, 490, 534, 516), 'tw': (487, 491, 531, 513)}, color={'cn': (214, 214, 214), 'en': (205, 206, 205), 'jp': (202, 203, 202), 'tw': (214, 214, 214)}, button={'cn': (487, 491, 531, 513), 'en': (471, 492, 547, 513), 'jp': (481, 490, 534, 516), 'tw': (487, 491, 531, 513)}, file={'cn': './assets/cn/ui_white/POPUP_CANCEL_WHITE.png', 'en': './assets/en/ui_white/POPUP_CANCEL_WHITE.png', 'jp': './assets/jp/ui_white/POPUP_CANCEL_WHITE.png', 'tw': './assets/cn/ui_white/POPUP_CANCEL_WHITE.png'}) -POPUP_CONFIRM_WHITE = Button(area={'cn': (746, 494, 791, 515), 'en': (727, 495, 810, 515), 'jp': (743, 491, 796, 518), 'tw': (746, 494, 791, 515)}, color={'cn': (133, 216, 255), 'en': (107, 207, 255), 'jp': (109, 207, 255), 'tw': (133, 216, 255)}, button={'cn': (746, 494, 791, 515), 'en': (727, 495, 810, 515), 'jp': (743, 491, 796, 518), 'tw': (746, 494, 791, 515)}, file={'cn': './assets/cn/ui_white/POPUP_CONFIRM_WHITE.png', 'en': './assets/en/ui_white/POPUP_CONFIRM_WHITE.png', 'jp': './assets/jp/ui_white/POPUP_CONFIRM_WHITE.png', 'tw': './assets/cn/ui_white/POPUP_CONFIRM_WHITE.png'}) +POPUP_CONFIRM_WHITE = Button(area={'cn': (746, 494, 791, 515), 'en': (727, 495, 810, 515), 'jp': (743, 491, 796, 518), 'tw': (744, 491, 794, 518)}, color={'cn': (133, 216, 255), 'en': (107, 207, 255), 'jp': (109, 207, 255), 'tw': (111, 207, 249)}, button={'cn': (746, 494, 791, 515), 'en': (727, 495, 810, 515), 'jp': (743, 491, 796, 518), 'tw': (744, 491, 794, 518)}, file={'cn': './assets/cn/ui_white/POPUP_CONFIRM_WHITE.png', 'en': './assets/en/ui_white/POPUP_CONFIRM_WHITE.png', 'jp': './assets/jp/ui_white/POPUP_CONFIRM_WHITE.png', 'tw': './assets/tw/ui_white/POPUP_CONFIRM_WHITE.png'}) POPUP_CONFIRM_WHITE_BATTLEPASS = Button(area={'cn': (744, 490, 795, 513), 'en': (744, 490, 795, 513), 'jp': (744, 490, 795, 513), 'tw': (744, 490, 795, 513)}, color={'cn': (119, 211, 255), 'en': (119, 211, 255), 'jp': (119, 211, 255), 'tw': (119, 211, 255)}, button={'cn': (744, 490, 795, 513), 'en': (744, 490, 795, 513), 'jp': (744, 490, 795, 513), 'tw': (744, 490, 795, 513)}, file={'cn': './assets/cn/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png', 'en': './assets/cn/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png', 'jp': './assets/cn/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png', 'tw': './assets/cn/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png'}) POPUP_SINGLE_WHITE = Button(area={'cn': (623, 493, 668, 515), 'en': (623, 493, 668, 515), 'jp': (623, 493, 668, 515), 'tw': (623, 493, 668, 515)}, color={'cn': (131, 215, 255), 'en': (131, 215, 255), 'jp': (131, 215, 255), 'tw': (131, 215, 255)}, button={'cn': (623, 493, 668, 515), 'en': (623, 493, 668, 515), 'jp': (623, 493, 668, 515), 'tw': (623, 493, 668, 515)}, file={'cn': './assets/cn/ui_white/POPUP_SINGLE_WHITE.png', 'en': './assets/cn/ui_white/POPUP_SINGLE_WHITE.png', 'jp': './assets/cn/ui_white/POPUP_SINGLE_WHITE.png', 'tw': './assets/cn/ui_white/POPUP_SINGLE_WHITE.png'}) REWARD_1_WHITE = Button(area={'cn': (437, 278, 496, 306), 'en': (411, 283, 523, 300), 'jp': (442, 279, 491, 305), 'tw': (441, 280, 490, 306)}, color={'cn': (255, 193, 97), 'en': (255, 212, 150), 'jp': (255, 195, 101), 'tw': (255, 199, 111)}, button={'cn': (437, 278, 496, 306), 'en': (411, 283, 523, 300), 'jp': (442, 279, 491, 305), 'tw': (441, 280, 490, 306)}, file={'cn': './assets/cn/ui_white/REWARD_1_WHITE.png', 'en': './assets/en/ui_white/REWARD_1_WHITE.png', 'jp': './assets/jp/ui_white/REWARD_1_WHITE.png', 'tw': './assets/tw/ui_white/REWARD_1_WHITE.png'})