Sync: [ALAS] Refactored Switch.set()

This commit is contained in:
LmeSzinc 2024-12-10 03:28:20 +08:00
parent 386a2482ad
commit 4ab8337324
17 changed files with 191 additions and 133 deletions

View File

@ -53,9 +53,9 @@ class CampaignBase(CampaignBase_):
map_has_mob_move = True map_has_mob_move = True
def strategy_set_execute(self, formation_index=None, sub_view=None, sub_hunt=None): def strategy_set_execute(self, formation=None, sub_view=None, sub_hunt=None):
super().strategy_set_execute( super().strategy_set_execute(
formation_index=formation_index, formation=formation,
sub_view=sub_view, sub_view=sub_view,
sub_hunt=sub_hunt, sub_hunt=sub_hunt,
) )

View File

@ -12,8 +12,8 @@ from module.war_archives.assets import (WAR_ARCHIVES_CAMPAIGN_CHECK,
from module.war_archives.dictionary import dic_archives_template from module.war_archives.dictionary import dic_archives_template
WAR_ARCHIVES_SWITCH = Switch('War_Archives_switch', is_selector=True) WAR_ARCHIVES_SWITCH = Switch('War_Archives_switch', is_selector=True)
WAR_ARCHIVES_SWITCH.add_status('ex', WAR_ARCHIVES_EX_ON) WAR_ARCHIVES_SWITCH.add_state('ex', WAR_ARCHIVES_EX_ON)
WAR_ARCHIVES_SWITCH.add_status('sp', WAR_ARCHIVES_SP_ON) WAR_ARCHIVES_SWITCH.add_state('sp', WAR_ARCHIVES_SP_ON)
WAR_ARCHIVES_SCROLL = Scroll(WAR_ARCHIVES_SCROLL, color=(247, 211, 66), name='WAR_ARCHIVES_SCROLL') WAR_ARCHIVES_SCROLL = Scroll(WAR_ARCHIVES_SCROLL, color=(247, 211, 66), name='WAR_ARCHIVES_SCROLL')

View File

@ -1,6 +1,6 @@
from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.campaign.campaign_base import CampaignBase as CampaignBase_
from module.combat.assets import GET_ITEMS_1_RYZA from module.combat.assets import GET_ITEMS_1_RYZA
from module.handler.fast_forward import auto_search from module.handler.fast_forward import AUTO_SEARCH
from module.handler.assets import MYSTERY_ITEM from module.handler.assets import MYSTERY_ITEM
from module.logger import logger from module.logger import logger
from module.map.map_grids import SelectedGrids from module.map.map_grids import SelectedGrids
@ -62,7 +62,7 @@ class CampaignBase(CampaignBase_):
# Chapter TH has no map_percentage and no 3_stars # Chapter TH has no map_percentage and no 3_stars
if name.startswith('th') or name.startswith('ht'): if name.startswith('th') or name.startswith('ht'):
appear = auto_search.appear(main=self) appear = AUTO_SEARCH.appear(main=self)
self.map_is_100_percent_clear = self.map_is_3_stars = self.map_is_threat_safe = appear self.map_is_100_percent_clear = self.map_is_3_stars = self.map_is_threat_safe = appear
self.map_has_clear_mode = appear self.map_has_clear_mode = appear
self.map_show_info() self.map_show_info()

View File

@ -4,8 +4,8 @@ from module.campaign.campaign_ui import ModeSwitch
from module.logger import logger from module.logger import logger
MODE_SWITCH_20240725 = ModeSwitch('Mode_switch_20240725', offset=(30, 30)) MODE_SWITCH_20240725 = ModeSwitch('Mode_switch_20240725', offset=(30, 30))
MODE_SWITCH_20240725.add_status('combat', SWITCH_20240725_COMBAT) MODE_SWITCH_20240725.add_state('combat', SWITCH_20240725_COMBAT)
MODE_SWITCH_20240725.add_status('story', SWITCH_20240725_STORY) MODE_SWITCH_20240725.add_state('story', SWITCH_20240725_STORY)
class CampaignBase(CampaignBase_): class CampaignBase(CampaignBase_):

View File

@ -4,8 +4,8 @@ from module.campaign.campaign_ui import ModeSwitch
from module.logger import logger from module.logger import logger
MODE_SWITCH_20240725 = ModeSwitch('Mode_switch_20240725', offset=(30, 30)) MODE_SWITCH_20240725 = ModeSwitch('Mode_switch_20240725', offset=(30, 30))
MODE_SWITCH_20240725.add_status('combat', SWITCH_20240725_COMBAT) MODE_SWITCH_20240725.add_state('combat', SWITCH_20240725_COMBAT)
MODE_SWITCH_20240725.add_status('story', SWITCH_20240725_STORY) MODE_SWITCH_20240725.add_state('story', SWITCH_20240725_STORY)
class CampaignBase(CampaignBase_): class CampaignBase(CampaignBase_):

View File

@ -5,8 +5,8 @@ from module.ui.ui import page_event
MODE_SWITCH_20240912 = ModeSwitch('Mode_switch_20240912', is_selector=True, offset=(30, 30)) MODE_SWITCH_20240912 = ModeSwitch('Mode_switch_20240912', is_selector=True, offset=(30, 30))
MODE_SWITCH_20240912.add_status('combat', SWITCH_20240725_COMBAT, offset=(444, 4)) MODE_SWITCH_20240912.add_state('combat', SWITCH_20240725_COMBAT, offset=(444, 4))
MODE_SWITCH_20240912.add_status('story', SWITCH_20240725_STORY, offset=(444, 4)) MODE_SWITCH_20240912.add_state('story', SWITCH_20240725_STORY, offset=(444, 4))
class CampaignBase(CampaignBase_): class CampaignBase(CampaignBase_):

View File

@ -7,14 +7,14 @@ from module.map_detection.grid import Grid
from module.template.assets import TEMPLATE_ENEMY_BOSS from module.template.assets import TEMPLATE_ENEMY_BOSS
MODE_SWITCH_20240725 = ModeSwitch('Mode_switch_20240725', is_selector=True, offset=(30, 30)) MODE_SWITCH_20240725 = ModeSwitch('Mode_switch_20240725', is_selector=True, offset=(30, 30))
MODE_SWITCH_20240725.add_status('combat', SWITCH_20240725_COMBAT, offset=(444, 4)) MODE_SWITCH_20240725.add_state('combat', SWITCH_20240725_COMBAT, offset=(444, 4))
MODE_SWITCH_20240725.add_status('story', SWITCH_20240725_STORY, offset=(444, 4)) MODE_SWITCH_20240725.add_state('story', SWITCH_20240725_STORY, offset=(444, 4))
CHAPTER_SWITCH_20241024 = ModeSwitch('Chapter_switch_20241024', is_selector=True, offset=(30, 30)) CHAPTER_SWITCH_20241024 = ModeSwitch('Chapter_switch_20241024', is_selector=True, offset=(30, 30))
CHAPTER_SWITCH_20241024.add_status('ab', CHAPTER_20241024_AB) CHAPTER_SWITCH_20241024.add_state('ab', CHAPTER_20241024_AB)
CHAPTER_SWITCH_20241024.add_status('cd', CHAPTER_20241024_CD) CHAPTER_SWITCH_20241024.add_state('cd', CHAPTER_20241024_CD)
CHAPTER_SWITCH_20241024.add_status('sp', CHAPTER_20241024_SP) CHAPTER_SWITCH_20241024.add_state('sp', CHAPTER_20241024_SP)
CHAPTER_SWITCH_20241024.add_status('ex', CHAPTER_20241024_EX) CHAPTER_SWITCH_20241024.add_state('ex', CHAPTER_20241024_EX)
class EventGrid(Grid): class EventGrid(Grid):

View File

@ -18,11 +18,11 @@ class ModeSwitch(Switch):
MODE_SWITCH_1 = ModeSwitch('Mode_switch_1', offset=(30, 10)) MODE_SWITCH_1 = ModeSwitch('Mode_switch_1', offset=(30, 10))
MODE_SWITCH_1.add_status('normal', SWITCH_1_NORMAL) MODE_SWITCH_1.add_state('normal', SWITCH_1_NORMAL)
MODE_SWITCH_1.add_status('hard', SWITCH_1_HARD) MODE_SWITCH_1.add_state('hard', SWITCH_1_HARD)
MODE_SWITCH_2 = ModeSwitch('Mode_switch_2', offset=(30, 10)) MODE_SWITCH_2 = ModeSwitch('Mode_switch_2', offset=(30, 10))
MODE_SWITCH_2.add_status('hard', SWITCH_2_HARD) MODE_SWITCH_2.add_state('hard', SWITCH_2_HARD)
MODE_SWITCH_2.add_status('ex', SWITCH_2_EX) MODE_SWITCH_2.add_state('ex', SWITCH_2_EX)
class CampaignUI(MapOperation, CampaignEvent, CampaignOcr): class CampaignUI(MapOperation, CampaignEvent, CampaignOcr):

View File

@ -24,12 +24,12 @@ class CoalitionUI(Combat):
""" """
MODE_SWITCH = Switch('CoalitionMode', offset=(20, 20)) MODE_SWITCH = Switch('CoalitionMode', offset=(20, 20))
if event == 'coalition_20230323': if event == 'coalition_20230323':
MODE_SWITCH.add_status('story', FROSTFALL_MODE_STORY) MODE_SWITCH.add_state('story', FROSTFALL_MODE_STORY)
MODE_SWITCH.add_status('battle', FROSTFALL_MODE_BATTLE) MODE_SWITCH.add_state('battle', FROSTFALL_MODE_BATTLE)
elif event == 'coalition_20240627': elif event == 'coalition_20240627':
# Note that switch button are reversed # Note that switch button are reversed
MODE_SWITCH.add_status('story', ACADEMY_MODE_BATTLE) MODE_SWITCH.add_state('story', ACADEMY_MODE_BATTLE)
MODE_SWITCH.add_status('battle', ACADEMY_MODE_STORY) MODE_SWITCH.add_state('battle', ACADEMY_MODE_STORY)
else: else:
logger.error(f'MODE_SWITCH is not defined in event {event}') logger.error(f'MODE_SWITCH is not defined in event {event}')
raise ScriptError raise ScriptError
@ -52,11 +52,11 @@ class CoalitionUI(Combat):
""" """
FLEET_SWITCH = Switch('FleetMode', is_selector=True, offset=0) # No offset for color match FLEET_SWITCH = Switch('FleetMode', is_selector=True, offset=0) # No offset for color match
if event == 'coalition_20230323': if event == 'coalition_20230323':
FLEET_SWITCH.add_status('single', FROSTFALL_SWITCH_SINGLE) FLEET_SWITCH.add_state('single', FROSTFALL_SWITCH_SINGLE)
FLEET_SWITCH.add_status('multi', FROSTFALL_SWITCH_MULTI) FLEET_SWITCH.add_state('multi', FROSTFALL_SWITCH_MULTI)
elif event == 'coalition_20240627': elif event == 'coalition_20240627':
FLEET_SWITCH.add_status('single', ACADEMY_SWITCH_SINGLE) FLEET_SWITCH.add_state('single', ACADEMY_SWITCH_SINGLE)
FLEET_SWITCH.add_status('multi', ACADEMY_SWITCH_MULTI) FLEET_SWITCH.add_state('multi', ACADEMY_SWITCH_MULTI)
else: else:
logger.error(f'FLEET_SWITCH is not defined in event {event}') logger.error(f'FLEET_SWITCH is not defined in event {event}')
raise ScriptError raise ScriptError

View File

@ -24,8 +24,8 @@ from module.ui.ui import UI
from module.ui_white.assets import REWARD_1_WHITE, REWARD_GOTO_COMMISSION_WHITE from module.ui_white.assets import REWARD_1_WHITE, REWARD_GOTO_COMMISSION_WHITE
COMMISSION_SWITCH = Switch('Commission_switch', is_selector=True) COMMISSION_SWITCH = Switch('Commission_switch', is_selector=True)
COMMISSION_SWITCH.add_status('daily', COMMISSION_DAILY) COMMISSION_SWITCH.add_state('daily', COMMISSION_DAILY)
COMMISSION_SWITCH.add_status('urgent', COMMISSION_URGENT) COMMISSION_SWITCH.add_state('urgent', COMMISSION_URGENT)
COMMISSION_SCROLL = Scroll(COMMISSION_SCROLL_AREA, color=(247, 211, 66), name='COMMISSION_SCROLL') COMMISSION_SCROLL = Scroll(COMMISSION_SCROLL_AREA, color=(247, 211, 66), name='COMMISSION_SCROLL')

View File

@ -18,8 +18,8 @@ EQUIPMENT_SCROLL = Scroll(EQUIP_SCROLL, color=(247, 211, 66), name='EQUIP_SCROLL
SIM_VALUE = 0.90 SIM_VALUE = 0.90
equipping_filter = Switch('Equipping_filter') equipping_filter = Switch('Equipping_filter')
equipping_filter.add_status('on', check_button=EQUIPPING_ON) equipping_filter.add_state('on', check_button=EQUIPPING_ON)
equipping_filter.add_status('off', check_button=EQUIPPING_OFF) equipping_filter.add_state('off', check_button=EQUIPPING_OFF)
class EquipmentChange(Equipment): class EquipmentChange(Equipment):

View File

@ -7,15 +7,15 @@ from module.handler.auto_search import AutoSearchHandler
from module.logger import logger from module.logger import logger
from module.ui.switch import Switch from module.ui.switch import Switch
fast_forward = Switch('Fast_Forward') FAST_FORWARD = Switch('Fast_Forward')
fast_forward.add_status('on', check_button=FAST_FORWARD_ON) FAST_FORWARD.add_state('on', check_button=FAST_FORWARD_ON)
fast_forward.add_status('off', check_button=FAST_FORWARD_OFF) FAST_FORWARD.add_state('off', check_button=FAST_FORWARD_OFF)
fleet_lock = Switch('Fleet_Lock', offset=(5, 20)) FLEET_LOCK = Switch('Fleet_Lock', offset=(5, 20))
fleet_lock.add_status('on', check_button=FLEET_LOCKED) FLEET_LOCK.add_state('on', check_button=FLEET_LOCKED)
fleet_lock.add_status('off', check_button=FLEET_UNLOCKED) FLEET_LOCK.add_state('off', check_button=FLEET_UNLOCKED)
auto_search = Switch('Auto_Search', offset=(20, 20)) AUTO_SEARCH = Switch('Auto_Search', offset=(20, 20))
auto_search.add_status('on', check_button=AUTO_SEARCH_ON) AUTO_SEARCH.add_state('on', check_button=AUTO_SEARCH_ON)
auto_search.add_status('off', check_button=AUTO_SEARCH_OFF) AUTO_SEARCH.add_state('off', check_button=AUTO_SEARCH_OFF)
def map_files(event): def map_files(event):
@ -127,9 +127,9 @@ class FastForwardHandler(AutoSearchHandler):
# Minor issue here # Minor issue here
# Using auto_search option because clear mode cannot be detected whether on SP # Using auto_search option because clear mode cannot be detected whether on SP
# If user manually turn off auto search, alas can't enable it again # If user manually turn off auto search, alas can't enable it again
self.map_has_clear_mode = auto_search.appear(main=self) self.map_has_clear_mode = AUTO_SEARCH.appear(main=self)
else: else:
self.map_has_clear_mode = self.map_is_100_percent_clear and fast_forward.appear(main=self) self.map_has_clear_mode = self.map_is_100_percent_clear and FAST_FORWARD.appear(main=self)
# Override config # Override config
if self.map_achieved_star_1: if self.map_achieved_star_1:
@ -187,8 +187,8 @@ class FastForwardHandler(AutoSearchHandler):
self.map_is_2x_book = False self.map_is_2x_book = False
pass pass
status = 'on' if self.config.Campaign_UseClearMode else 'off' state = 'on' if self.config.Campaign_UseClearMode else 'off'
changed = fast_forward.set(status=status, main=self) changed = FAST_FORWARD.set(state, main=self)
return changed return changed
def handle_map_fleet_lock(self, enable=None): def handle_map_fleet_lock(self, enable=None):
@ -201,14 +201,14 @@ class FastForwardHandler(AutoSearchHandler):
""" """
# Fleet lock depends on if it appear on map, not depends on map status. # Fleet lock depends on if it appear on map, not depends on map status.
# Because if already in map, there's no map status, # Because if already in map, there's no map status,
if not fleet_lock.appear(main=self): if not FLEET_LOCK.appear(main=self):
logger.info('No fleet lock option.') logger.info('No fleet lock option.')
return False return False
if enable is None: if enable is None:
enable = self.config.Campaign_UseFleetLock enable = self.config.Campaign_UseFleetLock
status = 'on' if enable else 'off' state = 'on' if enable else 'off'
changed = fleet_lock.set(status=status, main=self) changed = FLEET_LOCK.set(state, main=self)
return changed return changed
@ -223,13 +223,13 @@ class FastForwardHandler(AutoSearchHandler):
# if not self.map_is_clear_mode: # if not self.map_is_clear_mode:
# return False # return False
if not auto_search.appear(main=self): if not AUTO_SEARCH.appear(main=self):
logger.info('No auto search option.') logger.info('No auto search option.')
self.map_is_auto_search = False self.map_is_auto_search = False
return False return False
status = 'on' if self.map_is_auto_search else 'off' state = 'on' if self.map_is_auto_search else 'off'
changed = auto_search.set(status=status, main=self) changed = AUTO_SEARCH.set(state, main=self)
return changed return changed
@ -461,8 +461,8 @@ class FastForwardHandler(AutoSearchHandler):
book_check = BOOK_CHECK_AUTO book_check = BOOK_CHECK_AUTO
book_box = BOOK_BOX_AUTO book_box = BOOK_BOX_AUTO
status = 'on' if self.map_is_2x_book else 'off' state = 'on' if self.map_is_2x_book else 'off'
if self._set_2x_book_status(status, book_check, book_box): if self._set_2x_book_status(state, book_check, book_box):
self.emotion.map_is_2x_book = self.map_is_2x_book self.emotion.map_is_2x_book = self.map_is_2x_book
else: else:
self.map_is_2x_book = False self.map_is_2x_book = False

View File

@ -7,18 +7,18 @@ from module.template.assets import (TEMPLATE_FORMATION_1, TEMPLATE_FORMATION_2,
from module.ui.switch import Switch from module.ui.switch import Switch
# 2023.10.19, icons on one row increased from 2 to 3 # 2023.10.19, icons on one row increased from 2 to 3
formation = Switch('Formation', offset=(100, 200)) FORMATION = Switch('Formation', offset=(100, 200))
formation.add_status('line_ahead', check_button=FORMATION_1) FORMATION.add_state('line_ahead', check_button=FORMATION_1)
formation.add_status('double_line', check_button=FORMATION_2) FORMATION.add_state('double_line', check_button=FORMATION_2)
formation.add_status('diamond', check_button=FORMATION_3) FORMATION.add_state('diamond', check_button=SUBMARINE_HUNT_ON)
submarine_hunt = Switch('Submarine_hunt', offset=(200, 200)) SUBMARINE_HUNT = Switch('Submarine_hunt', offset=(200, 200))
submarine_hunt.add_status('on', check_button=SUBMARINE_HUNT_ON) SUBMARINE_HUNT.add_state('on', check_button=SUBMARINE_HUNT_ON)
submarine_hunt.add_status('off', check_button=SUBMARINE_HUNT_OFF) SUBMARINE_HUNT.add_state('off', check_button=SUBMARINE_HUNT_OFF)
submarine_view = Switch('Submarine_view', offset=(100, 200)) SUBMARINE_VIEW = Switch('Submarine_view', offset=(100, 200))
submarine_view.add_status('on', check_button=SUBMARINE_VIEW_ON) SUBMARINE_VIEW.add_state('on', check_button=SUBMARINE_VIEW_ON)
submarine_view.add_status('off', check_button=SUBMARINE_VIEW_OFF) SUBMARINE_VIEW.add_state('off', check_button=SUBMARINE_VIEW_OFF)
MOB_MOVE_OFFSET = (120, 200) MOB_MOVE_OFFSET = (120, 200)
@ -60,20 +60,20 @@ class StrategyHandler(InfoHandler):
if not self.appear(STRATEGY_OPENED, offset=200): if not self.appear(STRATEGY_OPENED, offset=200):
break break
def strategy_set_execute(self, formation_index=None, sub_view=None, sub_hunt=None): def strategy_set_execute(self, formation=None, sub_view=None, sub_hunt=None):
""" """
Args: Args:
formation_index (int): 1-3, or None for don't change formation (str): 'line_ahead', 'double_line', 'diamond', or None for don't change
sub_view (bool): sub_view (bool):
sub_hunt (bool): sub_hunt (bool):
Pages: Pages:
in: STRATEGY_OPENED in: STRATEGY_OPENED
""" """
logger.info(f'Strategy set: formation={formation_index}, submarine_view={sub_view}, submarine_hunt={sub_hunt}') logger.info(f'Strategy set: formation={formation}, submarine_view={sub_view}, submarine_hunt={sub_hunt}')
if formation_index is not None: if formation is not None:
formation.set(str(formation_index), main=self) FORMATION.set(formation, main=self)
# Disable this until the icon bug of submarine zone is fixed # Disable this until the icon bug of submarine zone is fixed
# And don't enable MAP_HAS_DYNAMIC_RED_BORDER when using submarine # And don't enable MAP_HAS_DYNAMIC_RED_BORDER when using submarine
@ -81,13 +81,13 @@ class StrategyHandler(InfoHandler):
# Don't know when but the game bug was fixed, remove the use of SwitchWithHandler # Don't know when but the game bug was fixed, remove the use of SwitchWithHandler
if sub_view is not None: if sub_view is not None:
if submarine_view.appear(main=self): if SUBMARINE_VIEW.appear(main=self):
submarine_view.set('on' if sub_view else 'off', main=self) SUBMARINE_VIEW.set('on' if sub_view else 'off', main=self)
else: else:
logger.warning('Setting up submarine_view but no icon appears') logger.warning('Setting up submarine_view but no icon appears')
if sub_hunt is not None: if sub_hunt is not None:
if submarine_hunt.appear(main=self): if SUBMARINE_HUNT.appear(main=self):
submarine_hunt.set('on' if sub_hunt else 'off', main=self) SUBMARINE_HUNT.set('on' if sub_hunt else 'off', main=self)
else: else:
logger.warning('Setting up submarine_hunt but no icon appears') logger.warning('Setting up submarine_hunt but no icon appears')
@ -110,7 +110,7 @@ class StrategyHandler(InfoHandler):
self.strategy_open() self.strategy_open()
self.strategy_set_execute( self.strategy_set_execute(
formation_index=expected_formation, formation=expected_formation,
sub_view=False, sub_view=False,
sub_hunt=bool(self.config.Submarine_Fleet) and self.config.Submarine_Mode in ['hunt_only', 'hunt_and_boss'] sub_hunt=bool(self.config.Submarine_Fleet) and self.config.Submarine_Mode in ['hunt_only', 'hunt_and_boss']
) )

View File

@ -15,12 +15,12 @@ MEOWFFICER_SHIFT_DETECT = Button(
name='MEOWFFICER_SHIFT_DETECT') name='MEOWFFICER_SHIFT_DETECT')
SWITCH_LOCK = Switch(name='Meowfficer_Lock', offset=(40, 40)) SWITCH_LOCK = Switch(name='Meowfficer_Lock', offset=(40, 40))
SWITCH_LOCK.add_status( SWITCH_LOCK.add_state(
'lock', 'lock',
check_button=MEOWFFICER_APPLY_UNLOCK, check_button=MEOWFFICER_APPLY_UNLOCK,
click_button=MEOWFFICER_APPLY_LOCK click_button=MEOWFFICER_APPLY_LOCK
) )
SWITCH_LOCK.add_status( SWITCH_LOCK.add_state(
'unlock', 'unlock',
check_button=MEOWFFICER_APPLY_LOCK, check_button=MEOWFFICER_APPLY_LOCK,
click_button=MEOWFFICER_APPLY_UNLOCK click_button=MEOWFFICER_APPLY_UNLOCK
@ -175,7 +175,7 @@ class MeowfficerCollect(MeowfficerBase):
lock (bool): lock (bool):
""" """
# Apply designated lock status # Apply designated lock status
SWITCH_LOCK.set(status='lock' if lock else 'unlock', main=self) SWITCH_LOCK.set('lock' if lock else 'unlock', main=self)
# Wait until info bar disappears # Wait until info bar disappears
self.ensure_no_info_bar(timeout=1) self.ensure_no_info_bar(timeout=1)

View File

@ -20,8 +20,8 @@ class FleetLockSwitch(Switch):
fleet_lock = FleetLockSwitch('Fleet_Lock', offset=(10, 120)) fleet_lock = FleetLockSwitch('Fleet_Lock', offset=(10, 120))
fleet_lock.add_status('on', check_button=OS_FLEET_LOCKED) fleet_lock.add_state('on', check_button=OS_FLEET_LOCKED)
fleet_lock.add_status('off', check_button=OS_FLEET_UNLOCKED) fleet_lock.add_state('off', check_button=OS_FLEET_UNLOCKED)
class MapEventHandler(EnemySearchingHandler): class MapEventHandler(EnemySearchingHandler):
@ -306,7 +306,7 @@ class MapEventHandler(EnemySearchingHandler):
if enable is None: if enable is None:
enable = self.config.Campaign_UseFleetLock enable = self.config.Campaign_UseFleetLock
status = 'on' if enable else 'off' state = 'on' if enable else 'off'
changed = fleet_lock.set(status=status, main=self) changed = fleet_lock.set(state, main=self)
return changed return changed

View File

@ -12,12 +12,12 @@ from module.ui.setting import Setting
from module.ui.switch import Switch from module.ui.switch import Switch
DOCK_SORTING = Switch('Dork_sorting') DOCK_SORTING = Switch('Dork_sorting')
DOCK_SORTING.add_status('Ascending', check_button=SORT_ASC, click_button=SORTING_CLICK) DOCK_SORTING.add_state('Ascending', check_button=SORT_ASC, click_button=SORTING_CLICK)
DOCK_SORTING.add_status('Descending', check_button=SORT_DESC, click_button=SORTING_CLICK) DOCK_SORTING.add_state('Descending', check_button=SORT_DESC, click_button=SORTING_CLICK)
DOCK_FAVOURITE = Switch('Favourite_filter') DOCK_FAVOURITE = Switch('Favourite_filter')
DOCK_FAVOURITE.add_status('on', check_button=COMMON_SHIP_FILTER_ENABLE) DOCK_FAVOURITE.add_state('on', check_button=COMMON_SHIP_FILTER_ENABLE)
DOCK_FAVOURITE.add_status('off', check_button=COMMON_SHIP_FILTER_DISABLE) DOCK_FAVOURITE.add_state('off', check_button=COMMON_SHIP_FILTER_DISABLE)
CARD_GRIDS = ButtonGrid( CARD_GRIDS = ButtonGrid(
origin=(93, 76), delta=(164 + 2 / 3, 227), button_shape=(138, 204), grid_shape=(7, 2), name='CARD') origin=(93, 76), delta=(164 + 2 / 3, 227), button_shape=(138, 204), grid_shape=(7, 2), name='CARD')

View File

@ -1,5 +1,4 @@
from module.base.base import ModuleBase from module.base.base import ModuleBase
from module.base.button import Button
from module.base.timer import Timer from module.base.timer import Timer
from module.exception import ScriptError from module.exception import ScriptError
from module.logger import logger from module.logger import logger
@ -7,16 +6,15 @@ from module.logger import logger
class Switch: class Switch:
""" """
A wrapper to handle switches in game. A wrapper to handle switches in game, switch among states with retries.
Set switch status with reties.
Examples: Examples:
# Definitions # Definitions
submarine_hunt = Switch('Submarine_hunt', offset=120) submarine_hunt = Switch('Submarine_hunt', offset=120)
submarine_hunt.add_status('on', check_button=SUBMARINE_HUNT_ON) submarine_hunt.add_state('on', check_button=SUBMARINE_HUNT_ON)
submarine_hunt.add_status('off', check_button=SUBMARINE_HUNT_OFF) submarine_hunt.add_state('off', check_button=SUBMARINE_HUNT_OFF)
# Change status to ON # Change state to ON
submarine_view.set('on', main=self) submarine_view.set('on', main=self)
""" """
@ -28,23 +26,24 @@ class Switch:
For example: | [Daily] | Urgent | -> click -> | Daily | [Urgent] | For example: | [Daily] | Urgent | -> click -> | Daily | [Urgent] |
False if this is a switch, click the switch itself, and it changed in the same position. False if this is a switch, click the switch itself, and it changed in the same position.
For example: | [ON] | -> click -> | [OFF] | For example: | [ON] | -> click -> | [OFF] |
offset (bool, int, tuple): Global offset in current switch
""" """
self.name = name self.name = name
self.is_choice = is_selector self.is_selector = is_selector
self.offset = offset self.offset = offset
self.status_list = [] self.state_list = []
def add_status(self, status, check_button, click_button=None, offset=0): def add_state(self, state, check_button, click_button=None, offset=0):
""" """
Args: Args:
status (str): state (str): State name but cannot use 'unknown' as state name
check_button (Button): check_button (Button):
click_button (Button): click_button (Button):
offset (bool, int, tuple): offset (bool, int, tuple):
""" """
self.status_list.append({ if state == 'unknown':
'status': status, raise ScriptError(f'Cannot use "unknown" as state name')
self.state_list.append({
'state': state,
'check_button': check_button, 'check_button': check_button,
'click_button': click_button if click_button is not None else check_button, 'click_button': click_button if click_button is not None else check_button,
'offset': offset if offset else self.offset 'offset': offset if offset else self.offset
@ -58,7 +57,7 @@ class Switch:
Returns: Returns:
bool bool
""" """
for data in self.status_list: for data in self.state_list:
if main.appear(data['check_button'], offset=data['offset']): if main.appear(data['check_button'], offset=data['offset']):
return True return True
@ -70,31 +69,39 @@ class Switch:
main (ModuleBase): main (ModuleBase):
Returns: Returns:
str: Status name or 'unknown'. str: state name or 'unknown'.
""" """
for data in self.status_list: for data in self.state_list:
if main.appear(data['check_button'], offset=data['offset']): if main.appear(data['check_button'], offset=data['offset']):
return data['status'] return data['state']
return 'unknown' return 'unknown'
def get_data(self, status): def click(self, state, main):
""" """
Args: Args:
status (str): state (str):
main (ModuleBase):
"""
button = self.get_data(state)['click_button']
main.device.click(button)
def get_data(self, state):
"""
Args:
state (str):
Returns: Returns:
dict: Dictionary in add_status dict: Dictionary in add_state
Raises: Raises:
ScriptError: If status invalid ScriptError: If state invalid
""" """
for row in self.status_list: for row in self.state_list:
if row['status'] == status: if row['state'] == state:
return row return row
logger.warning(f'Switch {self.name} received an invalid status {status}') raise ScriptError(f'Switch {self.name} received an invalid state: {state}')
raise ScriptError(f'Switch {self.name} received an invalid status {status}')
def handle_additional(self, main): def handle_additional(self, main):
""" """
@ -106,21 +113,22 @@ class Switch:
""" """
return False return False
def set(self, status, main, skip_first_screenshot=True): def set(self, state, main, skip_first_screenshot=True):
""" """
Args: Args:
status (str): state:
main (ModuleBase): main (ModuleBase):
skip_first_screenshot (bool): skip_first_screenshot (bool):
Returns: Returns:
bool: bool: If clicked
""" """
self.get_data(status) logger.info(f'{self.name} set to {state}')
self.get_data(state)
counter = 0
changed = False changed = False
warning_show_timer = Timer(5, count=10).start() has_unknown = False
unknown_timer = Timer(5, count=10).start()
click_timer = Timer(1, count=3) click_timer = Timer(1, count=3)
while 1: while 1:
if skip_first_screenshot: if skip_first_screenshot:
@ -132,31 +140,81 @@ class Switch:
current = self.get(main=main) current = self.get(main=main)
logger.attr(self.name, current) logger.attr(self.name, current)
# End
if current == state:
return changed
# Handle additional popups # Handle additional popups
if self.handle_additional(main=main): if self.handle_additional(main=main):
continue continue
# End
if current == status:
return changed
# Warning # Warning
if current == 'unknown': if current == 'unknown':
if warning_show_timer.reached(): if unknown_timer.reached():
logger.warning(f'Unknown {self.name} switch') logger.warning(f'Switch {self.name} has states evaluated to unknown, '
warning_show_timer.reset()
if counter >= 1:
logger.warning(f'{self.name} switch {status} asset has evaluated to unknown too many times, '
f'asset should be re-verified') f'asset should be re-verified')
return False has_unknown = True
counter += 1 unknown_timer.reset()
# If unknown_timer never reached, don't click when having an unknown state,
# the unknown state is probably the switching animation.
# If unknown_timer reached once, click target state ignoring whether state is unknown or not,
# the unknown state is probably a new state not yet added.
# By ignoring new states, Switch.set() can still switch among known states.
if not has_unknown:
continue continue
else:
# Known state, reset timer
unknown_timer.reset()
# Click # Click
if click_timer.reached(): if click_timer.reached():
click_status = status if self.is_choice else current if self.is_selector:
main.device.click(self.get_data(click_status)['click_button']) # Click target state to switch
click_timer.reset() click_state = state
else:
# If this is a selector, click on current state to switch to another
# But 'unknown' is not clickable, if it is, click target state instead
# assuming all selector states share the same position.
if current == 'unknown':
click_state = state
else:
click_state = current
self.click(click_state, main=main)
changed = True changed = True
click_timer.reset()
unknown_timer.reset()
return changed return changed
def wait(self, main, skip_first_screenshot=True):
"""
Wait until any state activated
Args:
main (ModuleBase):
skip_first_screenshot:
Returns:
bool: If success
"""
timeout = Timer(2, count=6).start()
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
main.device.screenshot()
# Detect
current = self.get(main=main)
logger.attr(self.name, current)
# End
if current != 'unknown':
return True
if timeout.reached():
logger.warning(f'{self.name} wait activated timeout')
return False
# Handle additional popups
if self.handle_additional(main=main):
continue