1
0
mirror of https://github.com/0O0o0oOoO00/Alas.git synced 2026-05-14 13:09:25 +08:00

Merge remote-tracking branch 'LmeSzinc/master' into dev

# Conflicts:
#	module/config/argument/args.json
#	module/config/i18n/en-US.json
#	module/config/i18n/ja-JP.json
#	module/config/i18n/zh-CN.json
#	module/config/i18n/zh-TW.json
This commit is contained in:
0O0o0oOoO00
2026-02-28 12:16:14 +08:00
30 changed files with 1251 additions and 84 deletions

View File

@@ -41,11 +41,21 @@ class CampaignOcr(ModuleBase):
@staticmethod
def _campaign_ocr_result_process(result):
# The result will be like '7--2', because tha dash in game is '' not '-'
result = result.lower().replace('--', '-').replace('--', '-')
if result.startswith('-'):
result = result[1:]
result = result.replace('--', '-').replace('--', '-').lstrip('-')
# Replace wrong 'I' from results like 'I1-1', '1I-1', 'I-I', '11-I', 'I4-4', to '1'
# while keeping results like 'isp-2', 'sp1'
def replace_func(match):
segment = match.group(0)
return segment.replace('I', '1')
result = re.sub(r'[0-9I]+-[0-9I]+', replace_func, result, count=1)
# Convert '72' to '7-2'
if len(result) == 2 and result[0].isdigit():
result = '-'.join(result)
result = result.lower()
return result
@staticmethod

View File

@@ -3521,10 +3521,12 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"display": "hide",
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -3594,6 +3596,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -3666,6 +3669,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -4314,9 +4318,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -4386,6 +4392,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -4458,6 +4465,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -5055,9 +5063,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -5127,6 +5137,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -5199,6 +5210,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -5796,9 +5808,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -5868,6 +5882,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -5940,6 +5955,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -6537,9 +6553,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -6609,6 +6627,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -6681,6 +6700,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -7278,9 +7298,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -7350,6 +7372,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -7422,6 +7445,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -8019,9 +8043,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -8091,6 +8117,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -8163,6 +8190,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -10671,9 +10699,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -10743,6 +10773,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -10815,6 +10846,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -11429,9 +11461,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -11501,6 +11535,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -11573,6 +11608,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -12187,9 +12223,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -12259,6 +12297,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -12331,6 +12370,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -12945,9 +12985,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -13017,6 +13059,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -13089,6 +13132,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -13693,9 +13737,11 @@
"event_20250912_cn",
"event_20251023_cn",
"event_20251218_cn",
"event_20260226_cn",
"event_general_cn"
],
"option_cn": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -13765,6 +13811,7 @@
"event_general_cn"
],
"option_en": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -13837,6 +13884,7 @@
"event_20200227_cn"
],
"option_jp": [
"event_20260226_cn",
"event_20231221_cn",
"event_20251218_cn",
"event_20230914_cn",
@@ -16270,7 +16318,8 @@
"option": [
2,
3,
4
4,
5
]
},
"ShipIndex": {
@@ -16305,7 +16354,8 @@
2,
3,
4,
5
5,
6
]
},
"ShipIndex": {

View File

@@ -553,7 +553,7 @@ CoreShop:
ShipyardDr:
ResearchSeries:
value: 2
option: [ 2, 3, 4 ]
option: [ 2, 3, 4, 5 ]
ShipIndex:
value: 0
option: [ 0, 1, 2, 3, 4, 5, 6 ]
@@ -562,7 +562,7 @@ ShipyardDr:
Shipyard:
ResearchSeries:
value: 1
option: [ 1, 2, 3, 4, 5 ]
option: [ 1, 2, 3, 4, 5, 6 ]
ShipIndex:
value: 0
option: [ 0, 1, 2, 3, 4, 5, 6 ]

View File

@@ -307,13 +307,13 @@ class GeneratedConfig:
CoreShop_Filter = 'Array'
# Group `ShipyardDr`
ShipyardDr_ResearchSeries = 2 # 2, 3, 4
ShipyardDr_ResearchSeries = 2 # 2, 3, 4, 5
ShipyardDr_ShipIndex = 0 # 0, 1, 2, 3, 4, 5, 6
ShipyardDr_BuyAmount = 2
ShipyardDr_LastRun = datetime.datetime(2020, 1, 1, 0, 0)
# Group `Shipyard`
Shipyard_ResearchSeries = 1 # 1, 2, 3, 4, 5
Shipyard_ResearchSeries = 1 # 1, 2, 3, 4, 5, 6
Shipyard_ShipIndex = 0 # 0, 1, 2, 3, 4, 5, 6
Shipyard_BuyAmount = 2
Shipyard_LastRun = datetime.datetime(2020, 1, 1, 0, 0)

View File

@@ -822,6 +822,7 @@
"event_20250912_cn": "A Dance for Amahara Above",
"event_20251023_cn": "Tempesta and Islas de Libertád",
"event_20251218_cn": "A Note Through the Firmament",
"event_20260226_cn": "Springtide Inn Online",
"event_general_cn": "通用活动图(紧急委托)",
"raid_20200624": "Air Raid Drills with Essex Rerun",
"raid_20210708": "Cross Wave rerun",
@@ -1990,7 +1991,8 @@
"help": "",
"2": "DR2",
"3": "DR3",
"4": "DR4"
"4": "DR4",
"5": "DR5"
},
"ShipIndex": {
"name": "Ship Index",
@@ -2024,7 +2026,8 @@
"2": "PR2",
"3": "PR3",
"4": "PR4",
"5": "PR5"
"5": "PR5",
"6": "PR6"
},
"ShipIndex": {
"name": "Ship Index",

View File

@@ -822,6 +822,7 @@
"event_20250912_cn": "アマハラに舞い奉れ",
"event_20251023_cn": "テンペスタと自由群島",
"event_20251218_cn": "天穹に響く音謡",
"event_20260226_cn": "春色旅籠Online",
"event_general_cn": "通用活动图(紧急委托)",
"raid_20200624": "特別演習超空強襲波(復刻)",
"raid_20210708": "交錯する新たな波 (復刻)",
@@ -1990,7 +1991,8 @@
"help": "ShipyardDr.ResearchSeries.help",
"2": "2",
"3": "3",
"4": "4"
"4": "4",
"5": "5"
},
"ShipIndex": {
"name": "ShipyardDr.ShipIndex.name",
@@ -2024,7 +2026,8 @@
"2": "2",
"3": "3",
"4": "4",
"5": "5"
"5": "5",
"6": "6"
},
"ShipIndex": {
"name": "Shipyard.ShipIndex.name",

View File

@@ -822,6 +822,7 @@
"event_20250912_cn": "起舞于天原之上",
"event_20251023_cn": "飓风与自由群岛",
"event_20251218_cn": "响彻于天穹之音",
"event_20260226_cn": "春满客栈Online",
"event_general_cn": "通用活动图(紧急委托)",
"raid_20200624": "复刻特别演习埃塞克斯级",
"raid_20210708": "复刻穿越彼方的水线",
@@ -1990,7 +1991,8 @@
"help": "",
"2": "二期科研",
"3": "三期科研",
"4": "四期科研"
"4": "四期科研",
"5": "五期科研"
},
"ShipIndex": {
"name": "舰船序号",
@@ -2024,7 +2026,8 @@
"2": "二期科研",
"3": "三期科研",
"4": "四期科研",
"5": "五期科研"
"5": "五期科研",
"6": "六期科研"
},
"ShipIndex": {
"name": "舰船序号",

View File

@@ -822,6 +822,7 @@
"event_20250912_cn": "起舞於天原之上",
"event_20251023_cn": "颶風與自由群島",
"event_20251218_cn": "響徹於天穹之音",
"event_20260226_cn": "Springtide Inn Online",
"event_general_cn": "通用活动图(紧急委托)",
"raid_20200624": "特別演習埃塞克斯級(復刻)",
"raid_20210708": "復刻穿越彼方的水線",
@@ -1990,7 +1991,8 @@
"help": "",
"2": "二期科研",
"3": "三期科研",
"4": "四期科研"
"4": "四期科研",
"5": "五期科研"
},
"ShipIndex": {
"name": "艦船序號",
@@ -2024,7 +2026,8 @@
"2": "二期科研",
"3": "三期科研",
"4": "四期科研",
"5": "五期科研"
"5": "五期科研",
"6": "六期科研"
},
"ShipIndex": {
"name": "艦船序號",

View File

@@ -2,6 +2,7 @@ import numpy as np
from module.base.button import ButtonGrid
from module.base.decorator import Config
from module.base.timer import Timer
from module.handler.assets import *
from module.handler.enemy_searching import EnemySearchingHandler
from module.logger import logger
@@ -49,21 +50,14 @@ class AutoSearchHandler(EnemySearchingHandler):
origin=(1185, 155 + offset), delta=(0, 111),
button_shape=(53, 104), grid_shape=(1, 3), name='FLEET_SIDEBAR')
def _fleet_preparation_sidebar_click(self, index):
def _fleet_preparation_get(self):
"""
Args:
index (int):
Returns:
int:
1 for formation
2 for meowfficers
3 for auto search setting
Returns:
bool: If changed.
"""
if index <= 0 or index > 3:
logger.warning(f'Sidebar index cannot be clicked, {index}, limit to 1 through 5 only')
return False
current = 0
total = 0
sidebar = self._fleet_sidebar()
@@ -81,46 +75,38 @@ class AutoSearchHandler(EnemySearchingHandler):
if not current:
logger.warning('No fleet sidebar active.')
logger.attr('Fleet_sidebar', f'{current}/{total}')
if current == index:
return False
return current
self.device.click(sidebar[0, index - 1])
return True
def fleet_preparation_sidebar_ensure(self, index, skip_first_screenshot=True):
def fleet_preparation_sidebar_ensure(self, index):
"""
Args:
index (int):
1 for formation
2 for meowfficers
3 for auto search setting
skip_first_screenshot (bool):
Returns:
bool: whether sidebar could be ensured
at most 3 attempts are made before
return False otherwise True
Returns:
bool: whether sidebar could be ensured
at most 3 attempts are made before
return False otherwise True
"""
if index <= 0 or index > 5:
logger.warning(f'Sidebar index cannot be ensured, {index}, limit 1 through 5 only')
return False
counter = 0
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if self._fleet_preparation_sidebar_click(index):
if counter >= 2:
logger.warning('Sidebar could not be ensured')
return False
counter += 1
self.device.sleep((0.3, 0.5))
continue
else:
interval = Timer(1, count=2)
sidebar = self._fleet_sidebar()
for _ in self.loop(timeout=3):
current = self._fleet_preparation_get()
if current == index:
return True
if interval.reached():
self.device.click(sidebar[0, index - 1])
interval.reset()
continue
else:
logger.warning('Sidebar could not be ensured')
return False
def _auto_search_set_click(self, setting):
"""

View File

@@ -3,8 +3,8 @@ from module.combat.assets import GET_ITEMS_1
from module.logger import logger
from module.minigame.assets import *
from module.ocr.ocr import Digit
from module.ui.assets import GAME_ROOM_CHECK
from module.ui.page import page_game_room
from module.ui.assets import ACADEMY_GOTO_GAME_ROOM, GAME_ROOM_CHECK
from module.ui.page import page_academy, page_game_room
from module.ui.scroll import Scroll
from module.ui.ui import UI
@@ -131,6 +131,7 @@ class Minigame(UI):
in: page_game_room main_page/choose_game_page
out: page_game_room main_page
"""
logger.info('minigame go_to_main_page')
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
@@ -183,8 +184,19 @@ class Minigame(UI):
in: Any page
out: page_game_room
"""
# TEMP: 2026.02.18 separate self.ui_ensure(page_game_room) into 2 steps
# EN has different page_academy detection, to use ui_ensure(page_game_room),
# ui_goto must use `if self.ui_page_appear(page)` instead of `if self.appear(page.check_button)`
# But that would cause page_main/page_main_white clicking a static switch button
self.ui_ensure(page_academy)
# page_academy -> page_game_room
for _ in self.loop():
if self.ui_page_appear(page_game_room):
break
if self.ui_page_appear(page_academy, interval=5):
self.device.click(ACADEMY_GOTO_GAME_ROOM)
continue
self.ui_ensure(page_game_room)
# game room and choose game have same header, go to game room first
self.go_to_main_page()
coin_collected = False

View File

@@ -20,7 +20,7 @@ from module.os.assets import FLEET_EMP_DEBUFF, MAP_EXIT, MAP_GOTO_GLOBE, STRONGH
from module.os.camera import OSCamera
from module.os.map_base import OSCampaignMap
from module.os_ash.ash import OSAsh
from module.os_combat.combat import Combat
from module.os_combat.combat import Combat, BATTLE_PREPARATION, SIREN_PREPARATION
from module.os_handler.assets import AUTO_SEARCH_REWARD, CLICK_SAFE_AREA, IN_MAP, PORT_ENTER
from module.os_shop.assets import PORT_SUPPLY_CHECK
from module.ui.assets import BACK_ARROW
@@ -283,6 +283,13 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh):
clicked_story = False
stuck_timer = Timer(20, count=5).start()
confirm_timer.reset()
def abyssal_expected_end():
# add handle_map_event() because OSCombat.combat_status() removes get_items
if self.handle_map_event(drop=drop):
return False
return self.is_in_map()
for _ in self.loop(skip_first=skip_first_screenshot):
# Map event
event = self.handle_map_event(drop=drop)
@@ -347,7 +354,7 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh):
if self.combat_appear():
# Use ui_back() for testing, because there are too few abyssal loggers every month.
# self.ui_back(check_button=self.is_in_map)
self.combat(expected_end=self.is_in_map, fleet_index=self.fleet_show_index, save_get_items=drop)
self.combat(expected_end=abyssal_expected_end, fleet_index=self.fleet_show_index, save_get_items=drop)
confirm_timer.reset()
stuck_timer.reset()
result.add('event')
@@ -700,6 +707,7 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh):
logger.hr('BOSS leave')
# Update local view
self.update_os()
self.predict()
click_timer = Timer(3)
pause_interval = Timer(0.5, count=1)
@@ -713,8 +721,13 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh):
# Re-enter boss accidentally
if pause_interval.reached():
if self.combat_appear():
logger.info(f'combat_appear -> {BACK_ARROW}')
if self.appear(BATTLE_PREPARATION):
logger.info(f'{BATTLE_PREPARATION} -> {BACK_ARROW}')
self.device.click(BACK_ARROW)
pause_interval.reset()
continue
if self.appear(SIREN_PREPARATION, offset=(20, 20)):
logger.info(f'{SIREN_PREPARATION} -> {BACK_ARROW}')
self.device.click(BACK_ARROW)
pause_interval.reset()
continue

View File

@@ -47,7 +47,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle
name = ocr.ocr(self.device.image)
name = "".join(name.split())
name = name.lower()
name = name.strip('\\/-')
name = name.strip('\\/-—–-')
if '-' in name:
name = name.split('-')[0]
if 'é' in name: # Méditerranée name maps
@@ -80,7 +80,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle
# For JP only
ocr = Ocr(MAP_NAME, lang='jp', letter=(157, 173, 192), threshold=127, name='OCR_OS_MAP_NAME')
name = ocr.ocr(self.device.image)
name = name.strip('\\/-')
name = name.strip('\\/-—–-')
self.is_zone_name_hidden = '安全' in name
# Remove punctuations
for char in '':
@@ -109,7 +109,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle
# For TW only
ocr = Ocr(MAP_NAME, lang='tw', letter=(198, 215, 239), threshold=127, name='OCR_OS_MAP_NAME')
name = ocr.ocr(self.device.image)
name = name.strip('\\/-')
name = name.strip('\\/-—–-')
self.is_zone_name_hidden = '安全' in name
# Remove '塞壬要塞海域'
if '' in name:
@@ -123,7 +123,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle
# For CN only
ocr = Ocr(MAP_NAME, lang='cnocr', letter=(214, 231, 255), threshold=127, name='OCR_OS_MAP_NAME')
name = ocr.ocr(self.device.image)
name = name.strip('\\/-')
name = name.strip('\\/-—–-')
self.is_zone_name_hidden = '安全' in name
if '-' in name:
name = name.split('-')[0]

View File

@@ -15,6 +15,15 @@ from module.ui.assets import RAID_CHECK
from module.ui.page import page_rpg_stage
class RaidCounterPostMixin(DigitCounter):
def after_process(self, result):
# fix result like "915/", "1515"
result = result.strip('/')
if result.isdigit() and len(result) > 2 and result.endswith('15'):
result = f'{result[:-2]}/15'
return result
class RaidCounter(DigitCounter):
def pre_process(self, image):
image = super().pre_process(image)
@@ -163,7 +172,7 @@ def raid_ocr(raid, mode):
if mode == 'ex':
return Digit(button, letter=(255, 239, 215), threshold=128)
else:
return DigitCounter(button, lang='cnocr', letter=(154, 148, 133), threshold=128)
return RaidCounterPostMixin(button, lang='cnocr', letter=(154, 148, 133), threshold=128)
def pt_ocr(raid):

View File

@@ -95,7 +95,7 @@ class RaidRun(Raid, CampaignEvent):
# UI switches
if not self._raid_has_oil_icon:
self.ui_goto(page_campaign_menu)
self.ui_ensure(page_campaign_menu)
if self.triggered_stop_condition(oil_check=True, coin_check=True):
break

View File

@@ -45,8 +45,12 @@ class StorageHandler(StorageUI):
def _handle_use_box_amount(self, amount):
"""
Args:
amount (int): Expected amount to set
Returns:
bool: if clicked
int: Actual amount set in the UI.
May be less than expected if not enough boxes available.
Pages:
in: SHOP_BUY_CONFIRM_AMOUNT
@@ -84,6 +88,7 @@ class StorageHandler(StorageUI):
logger.info(f'Set box amount: {amount}')
skip_first = True
retry = Timer(1, count=2)
click_count = 0
for _ in self.loop():
if skip_first:
skip_first = False
@@ -92,13 +97,19 @@ class StorageHandler(StorageUI):
diff = amount - current
if diff == 0:
break
if click_count >= 2:
logger.warning(f'Box amount stuck at {current}, '
f'requested {amount} but only {current} available')
break
if retry.reached():
button = AMOUNT_PLUS if diff > 0 else AMOUNT_MINUS
self.device.multi_click(button, n=abs(diff), interval=(0.1, 0.2))
click_count += 1
retry.reset()
return True
logger.info(f'Box amount set to {current}')
return current
def _storage_use_one_box(self, button, amount=1):
"""
@@ -155,10 +166,10 @@ class StorageHandler(StorageUI):
# use match_template_color on BOX_AMOUNT_CONFIRM
# a long animation that opens a box, will be on the top of BOX_AMOUNT_CONFIRM
if self.match_template_color(BOX_AMOUNT_CONFIRM, offset=(20, 20), interval=5):
self._handle_use_box_amount(amount)
actual = self._handle_use_box_amount(amount)
self.device.click(BOX_AMOUNT_CONFIRM)
self.interval_reset(BOX_AMOUNT_CONFIRM)
used = amount
used = actual
continue
if self.appear_then_click(EQUIP_CONFIRM, offset=(20, 20), interval=5):
self.interval_reset(MATERIAL_CHECK)

View File

@@ -50,20 +50,16 @@ def patch_mimetype():
all deployment, we use the builtin mimetype table only.
"""
import mimetypes
if mimetypes.inited:
# ohno mimetypes already inited
db = mimetypes.MimeTypes()
mimetypes._db = db
# override global variable
mimetypes.encodings_map = db.encodings_map
mimetypes.suffix_map = db.suffix_map
mimetypes.types_map = db.types_map[True]
mimetypes.common_types = db.types_map[False]
else:
# init db with the default table
db = mimetypes.MimeTypes()
mimetypes._db = db
mimetypes.inited = True
# lock as inited
mimetypes.inited = True
# create a new clean instance
db = mimetypes.MimeTypes(filenames=())
mimetypes._db = db
# override global variable
mimetypes.encodings_map = db.encodings_map
mimetypes.suffix_map = db.suffix_map
mimetypes.types_map = db.types_map[True]
mimetypes.common_types = db.types_map[False]
def fix_py37_subprocess_communicate():