['初級木材輸送護衛', '中級木材輸送護衛', '上級木材輸送護衛', '初級鉄鋼輸送護衛', '中級鉄鋼輸送護衛', '上級鉄鋼輸送護衛'], 'extra_cube': ['船団護衛演習', '艦隊輸送演習', '艦隊実弾演習', '装備慣熟演習', '艦隊慣熟演習', '艦隊運動演習'], 'extra_oil': ['小型油田開発', '中型油田開発', '大型油田開発'], 'extra_book': ['小型船団護衛', '中型船団護衛', '大型船団護衛'], 'urgent_drill': ['敵偵察部隊迎撃', '敵主力艦隊撃破', '敵精鋭部隊撃破', '輸送部隊護衛'], 'urgent_part': ['近海掃海任務', '近海航行展示', '離島火力支援', '離島兵員輸送', '外敵生態調査', '兵站航路確保'], 'urgent_book': ['離島物資輸送', '近海パトロール', '離島漸減支援', '外敵動静哨戒', '前線部隊支援', '外敵中枢偵察'], 'urgent_box': ['装備輸送', '物資交換', '装備試験'], 'urgent_cube': ['船団救出', '敵襲'], 'urgent_gem': ['要人護衛', '休暇護衛'], 'urgent_ship': ['小型観艦式', '連合艦隊観艦式', '多国連合観艦式'], } COMMISSION_SWITCH = Switch('Commission_switch', is_selector=True) COMMISSION_SWITCH.add_status('daily', COMMISSION_DAILY) COMMISSION_SWITCH.add_status('urgent', COMMISSION_URGENT) COMMISSION_SCROLL = Scroll(COMMISSION_SCROLL_AREA, color=(247, 211, 66), name='COMMISSION_SCROLL') class Commission: button: Button name: str genre: str status: str duration: timedelta expire: timedelta def __init__(self, image, y, config):
from module.base.button import ButtonGrid from module.base.decorator import cached_property from module.base.timer import Timer from module.equipment.assets import * from module.logger import logger from module.ui.navbar import Navbar from module.ui.ui import UI from module.ui.switch import Switch equipping_filter = Switch('Equiping_filter') equipping_filter.add_status('on', check_button=EQUIPPING_ON) equipping_filter.add_status('off', check_button=EQUIPPING_OFF) SWIPE_DISTANCE = 250 SWIPE_RANDOM_RANGE = (-40, -20, 40, 20) class Equipment(UI): equipment_has_take_on = False def equipping_set(self, enable=False): if equipping_filter.set('on' if enable else 'off', main=self): self.wait_until_stable(SWIPE_AREA) def _equip_view_swipe(self, distance, check_button=EQUIPMENT_OPEN): swipe_count = 0 swipe_timer = Timer(5, count=10) self.ensure_no_info_bar(timeout=3) SWIPE_CHECK.load_color(self.device.image) SWIPE_CHECK._match_init = True # Disable ensure_template() on match(), allows ship to be properly determined # whether actually different or not
from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.exception import RequestHumanTakeover from module.logger import logger from module.ui.assets import WAR_ARCHIVES_CHECK from module.ui.page import page_archives from module.ui.scroll import Scroll from module.ui.switch import Switch from module.war_archives.assets import (WAR_ARCHIVES_CAMPAIGN_CHECK, WAR_ARCHIVES_EX_ON, WAR_ARCHIVES_SCROLL, WAR_ARCHIVES_SP_ON) from module.war_archives.dictionary import dic_archives_template WAR_ARCHIVES_SWITCH = Switch('War_Archives_switch', is_selector=True) WAR_ARCHIVES_SWITCH.add_status('ex', WAR_ARCHIVES_EX_ON) WAR_ARCHIVES_SWITCH.add_status('sp', WAR_ARCHIVES_SP_ON) WAR_ARCHIVES_SCROLL = Scroll(WAR_ARCHIVES_SCROLL, color=(247, 211, 66), name='WAR_ARCHIVES_SCROLL') class CampaignBase(CampaignBase_): # Helper variable to keep track of whether is the first runthrough first_run = True def _get_archives_entrance(self, name): """ Create entrance button to target archive campaign using a template acquired by event folder name Args:
from module.campaign.assets import * from module.campaign.campaign_ocr import CampaignOcr from module.exception import CampaignNameError, ScriptEnd from module.logger import logger from module.ui.switch import Switch from module.ui.ui import UI STAGE_SHOWN_WAIT = (1, 1.2) MODE_SWITCH_1 = Switch('Mode_switch_1', offset=(30, 10)) MODE_SWITCH_1.add_status('normal', SWITCH_1_NORMAL, sleep=STAGE_SHOWN_WAIT) MODE_SWITCH_1.add_status('hard', SWITCH_1_HARD, sleep=STAGE_SHOWN_WAIT) MODE_SWITCH_2 = Switch('Mode_switch_2', offset=(30, 10)) MODE_SWITCH_2.add_status('hard', SWITCH_2_HARD, sleep=STAGE_SHOWN_WAIT) MODE_SWITCH_2.add_status('ex', SWITCH_2_EX, sleep=STAGE_SHOWN_WAIT) class CampaignUI(UI, CampaignOcr): ENTRANCE = Button(area=(), color=(), button=(), name='default_button') def campaign_ensure_chapter(self, index): """ Args: index (int, str): Chapter. Such as 7, 'd', 'sp'. """ index = self._campaign_get_chapter_index(index) # A tricky way to use ui_ensure_index. self.ui_ensure_index(index, letter=self.get_chapter_index, prev_button=CHAPTER_PREV, next_button=CHAPTER_NEXT,
from module.base.utils import color_bar_percentage from module.handler.assets import * from module.handler.auto_search import AutoSearchHandler from module.logger import logger from module.ui.switch import Switch fast_forward = Switch('Fast_Forward') fast_forward.add_status('on', check_button=FAST_FORWARD_ON) fast_forward.add_status('off', check_button=FAST_FORWARD_OFF) fleet_lock = Switch('Fleet_Lock', offset=(5, 5)) fleet_lock.add_status('on', check_button=FLEET_LOCKED) fleet_lock.add_status('off', check_button=FLEET_UNLOCKED) auto_search = Switch('Auto_Search', offset=(20, 20)) auto_search.add_status('on', check_button=AUTO_SEARCH_ON) auto_search.add_status('off', check_button=AUTO_SEARCH_OFF) book_prep = Switch('2x Book Prep') book_prep.add_status('on', check_button=BOOK_ON_PREP) book_prep.add_status('off', check_button=BOOK_OFF_PREP) book_auto = Switch('2x Book Auto') book_auto.add_status('on', check_button=BOOK_ON_AUTO) book_auto.add_status('off', check_button=BOOK_OFF_AUTO) class FastForwardHandler(AutoSearchHandler): map_clear_percentage = 0. map_achieved_star_1 = False map_achieved_star_2 = False map_achieved_star_3 = False map_is_clear = False map_is_3_star = False map_is_green = False
from module.base.timer import Timer from module.combat.assets import * from module.exception import CampaignEnd from module.handler.assets import * from module.logger import logger from module.os.assets import GLOBE_GOTO_MAP from module.os_handler.assets import * from module.os_handler.enemy_searching import EnemySearchingHandler from module.ui.switch import Switch fleet_lock = Switch('Fleet_Lock', offset=(10, 120)) fleet_lock.add_status('on', check_button=OS_FLEET_LOCKED) fleet_lock.add_status('off', check_button=OS_FLEET_UNLOCKED) class MapEventHandler(EnemySearchingHandler): ash_popup_canceled = False def handle_map_get_items(self, interval=2): if self.is_in_map(): return False if self.appear(GET_ITEMS_1, interval=interval) \ or self.appear(GET_ITEMS_2, interval=interval) \ or self.appear(GET_ITEMS_3, interval=interval): self.device.click(CLICK_SAFE_AREA) return True if self.appear(GET_ADAPTABILITY, interval=interval): self.device.click(CLICK_SAFE_AREA) return True if self.appear(GET_MEOWFFICER_ITEMS_1, interval=interval):
import numpy as np from module.handler.assets import * from module.handler.info_handler import InfoHandler from module.logger import logger from module.template.assets import TEMPLATE_FORMATION_1, TEMPLATE_FORMATION_2, TEMPLATE_FORMATION_3 from module.ui.switch import Switch formation = Switch('Formation', offset=120) formation.add_status('line_ahead', check_button=FORMATION_1) formation.add_status('double_line', check_button=FORMATION_2) formation.add_status('diamond', check_button=FORMATION_3) submarine_hunt = Switch('Submarine_hunt', offset=120) submarine_hunt.add_status('on', check_button=SUBMARINE_HUNT_ON) submarine_hunt.add_status('off', check_button=SUBMARINE_HUNT_OFF) submarine_view = Switch('Submarine_view', offset=120) submarine_view.add_status('on', check_button=SUBMARINE_VIEW_ON) submarine_view.add_status('off', check_button=SUBMARINE_VIEW_OFF) class StrategyHandler(InfoHandler): fleet_1_formation_fixed = False fleet_2_formation_fixed = False def strategy_open(self): logger.info('Strategy open') while 1: if self.appear(IN_MAP, interval=5) and not self.appear( STRATEGY_OPENED, offset=120):
from module.os_handler.assets import IN_MAP from module.ui.page import page_os from module.ui.switch import Switch from module.ui.ui import UI OCR_BEACON_REMAIN = DigitCounter(BEACON_REMAIN, threshold=256, name='OCR_ASH_REMAIN') OCR_BEACON_TIER = Digit(BEACON_TIER, name='OCR_ASH_TIER') OCR_ASH_COLLECT_STATUS = DigitCounter(ASH_COLLECT_STATUS, letter=(235, 235, 235), threshold=160, name='OCR_ASH_COLLECT_STATUS') SWITCH_BEACON = Switch(name='Beacon', offset=(20, 20)) SWITCH_BEACON.add_status('mine', BEACON_LIST) SWITCH_BEACON.add_status('list', BEACON_MY) RECORD_OPTION = ('DailyRecord', 'ash') RECORD_SINCE = (0, ) class AshCombat(Combat): def handle_battle_status(self, save_get_items=False): """ Args: save_get_items (bool): Returns: bool: """
from module.base.base import ModuleBase from module.base.utils import color_bar_percentage from module.handler.assets import * from module.logger import logger from module.ui.switch import Switch fast_forward = Switch('Fast_Forward') fast_forward.add_status('on', check_button=FAST_FORWARD_ON) fast_forward.add_status('off', check_button=FAST_FORWARD_OFF) fleet_lock = Switch('Fleet_Lock', offset=(5, 5)) fleet_lock.add_status('on', check_button=FLEET_LOCKED) fleet_lock.add_status('off', check_button=FLEET_UNLOCKED) class FastForwardHandler(ModuleBase): map_clear_percentage = 0. map_achieved_star_1 = False map_achieved_star_2 = False map_achieved_star_3 = False map_is_clear = False map_is_3_star = False map_is_green = False map_has_fast_forward = False map_is_clear_mode = False # Clear mode == fast forward def map_get_info(self): """ Logs: | INFO | [Map_info] 98%, star_1, star_2, star_3, clear, 3_star, green, fast_forward """ self.map_clear_percentage = color_bar_percentage(
from module.base.button import ButtonGrid from module.equipment.equipment import Equipment from module.exception import ScriptError from module.retire.assets import * from module.ui.switch import Switch dock_sorting = Switch('Dork_sorting') dock_sorting.add_status('Ascending', check_button=SORT_ASC, click_button=SORTING_CLICK) dock_sorting.add_status('Descending', check_button=SORT_DESC, click_button=SORTING_CLICK) favourite_filter = Switch('Favourite_filter') favourite_filter.add_status('on', check_button=COMMON_SHIP_FILTER_ENABLE) favourite_filter.add_status('off', check_button=COMMON_SHIP_FILTER_DISABLE) filter_extra_enhanceable = Switch('Filter_extra_enhanceable') filter_extra_enhanceable.add_status('on', check_button=FILTER_EXTRA_ENHANCEABLE_ON) filter_extra_enhanceable.add_status('off', check_button=FILTER_EXTRA_ENHANCEABLE_OFF) filter_extra_no_limit = Switch('Filter_extra_no_limit') filter_extra_no_limit.add_status('on', check_button=FILTER_EXTRA_NO_LIMIT_ON) filter_extra_no_limit.add_status('off', check_button=FILTER_EXTRA_NO_LIMIT_OFF) filter_index_all = Switch('Filter_index_all') filter_index_all.add_status('on', check_button=FILTER_INDEX_ALL_ON) filter_index_all.add_status('off', check_button=FILTER_INDEX_ALL_OFF)
import numpy as np from module.base.timer import Timer from module.handler.assets import * from module.handler.info_handler import InfoHandler from module.logger import logger from module.template.assets import TEMPLATE_FORMATION_1, TEMPLATE_FORMATION_2, TEMPLATE_FORMATION_3 from module.ui.switch import Switch formation = Switch('Formation', offset=120) formation.add_status('1', check_button=FORMATION_1) formation.add_status('2', check_button=FORMATION_2) formation.add_status('3', check_button=FORMATION_3) submarine_hunt = Switch('Submarine_hunt', offset=120) submarine_hunt.add_status('on', check_button=SUBMARINE_HUNT_ON) submarine_hunt.add_status('off', check_button=SUBMARINE_HUNT_OFF) class SwitchWithHandler(Switch): @staticmethod def handle_submarine_zone_icon_bug(main): """ When switching the submarine zone, the icon in the strategy don't change. If click submarine hunt, submarine zone will show the correct icon. So the key to deal with submarine zone icon bug, is to double click submarine_hunt. Args: main (ModuleBase): """ current = submarine_hunt.get(main=main)
from module.campaign.assets import * from module.campaign.campaign_ocr import CampaignOcr from module.exception import CampaignNameError, ScriptEnd from module.logger import logger from module.ui.assets import CAMPAIGN_CHECK from module.ui.switch import Switch from module.ui.ui import UI MODE_SWITCH_1 = Switch('Mode_switch_1', offset=(30, 10)) MODE_SWITCH_1.add_status('normal', SWITCH_1_NORMAL) MODE_SWITCH_1.add_status('hard', SWITCH_1_HARD) MODE_SWITCH_2 = Switch('Mode_switch_2', offset=(30, 10)) MODE_SWITCH_2.add_status('hard', SWITCH_2_HARD) MODE_SWITCH_2.add_status('ex', SWITCH_2_EX) class CampaignUI(UI, CampaignOcr): ENTRANCE = Button(area=(), color=(), button=(), name='default_button') def campaign_ensure_chapter(self, index): """ Args: index (int, str): Chapter. Such as 7, 'd', 'sp'. """ index = self._campaign_get_chapter_index(index) # A tricky way to use ui_ensure_index. self.ui_ensure_index(index, letter=self.get_chapter_index, prev_button=CHAPTER_PREV, next_button=CHAPTER_NEXT,
from module.base.button import ButtonGrid from module.equipment.equipment import Equipment from module.exception import ScriptError from module.retire.assets import * from module.ui.switch import Switch dock_sorting = Switch('Dork_sorting') dock_sorting.add_status('Ascending', check_button=SORT_ASC, click_button=SORTING_CLICK) dock_sorting.add_status('Descending', check_button=SORT_DESC, click_button=SORTING_CLICK) favourite_filter = Switch('Favourite_filter') favourite_filter.add_status('on', check_button=COMMON_SHIP_FILTER_ENABLE) favourite_filter.add_status('off', check_button=COMMON_SHIP_FILTER_DISABLE) FILTER_SORT_GRIDS = ButtonGrid( origin=(284, 109), delta=(157.5, 0), button_shape=(137, 38), grid_shape=(6, 1), name='FILTER_SORT') FILTER_SORT_TYPES = [ ['rarity', 'level', 'total', 'join', 'intimacy', 'stat']] # stat has extra grid, not worth pursuing FILTER_INDEX_GRIDS = ButtonGrid( origin=(284, 183), delta=(157.5, 56.5), button_shape=(137, 38), grid_shape=(6, 2), name='FILTER_INDEX') FILTER_INDEX_TYPES = [['all', 'vanguard', 'main', 'dd', 'cl', 'ca'], ['bb', 'cv', 'repair', 'ss', 'others', 'not_available']] FILTER_FACTION_GRIDS = ButtonGrid( origin=(284, 316), delta=(157.5, 56.5), button_shape=(137, 38), grid_shape=(6, 2), name='FILTER_FACTION') FILTER_FACTION_TYPES = [['all', 'eagle', 'royal', 'sakura', 'iron', 'dragon'], ['sardegna', 'northern', 'iris', 'vichya', 'other', 'not_available']] FILTER_RARITY_GRIDS = ButtonGrid( origin=(284, 449), delta=(157.5, 0), button_shape=(137, 38), grid_shape=(6, 1), name='FILTER_RARITY')
from module.base.timer import Timer from module.base.utils import color_bar_percentage from module.handler.assets import * from module.handler.auto_search import AutoSearchHandler from module.logger import logger from module.ui.switch import Switch fast_forward = Switch('Fast_Forward') fast_forward.add_status('on', check_button=FAST_FORWARD_ON) fast_forward.add_status('off', check_button=FAST_FORWARD_OFF) fleet_lock = Switch('Fleet_Lock', offset=(5, 5)) fleet_lock.add_status('on', check_button=FLEET_LOCKED) fleet_lock.add_status('off', check_button=FLEET_UNLOCKED) auto_search = Switch('Auto_Search', offset=(20, 20)) auto_search.add_status('on', check_button=AUTO_SEARCH_ON) auto_search.add_status('off', check_button=AUTO_SEARCH_OFF) class FastForwardHandler(AutoSearchHandler): map_clear_percentage = 0. map_achieved_star_1 = False map_achieved_star_2 = False map_achieved_star_3 = False map_is_clear = False map_is_3_star = False map_is_green = False map_has_fast_forward = False map_is_clear_mode = False # Clear mode == fast forward map_is_auto_search = False map_is_2x_book = False
from module.base.button import ButtonGrid from module.equipment.equipment import Equipment from module.logger import logger from module.ocr.ocr import DigitCounter from module.retire.assets import * from module.ui.scroll import Scroll from module.ui.switch import Switch DOCK_SORTING = Switch('Dork_sorting') DOCK_SORTING.add_status('Ascending', check_button=SORT_ASC, click_button=SORTING_CLICK) DOCK_SORTING.add_status('Descending', check_button=SORT_DESC, click_button=SORTING_CLICK) DOCK_FAVOURITE = Switch('Favourite_filter') DOCK_FAVOURITE.add_status('on', check_button=COMMON_SHIP_FILTER_ENABLE) DOCK_FAVOURITE.add_status('off', check_button=COMMON_SHIP_FILTER_DISABLE) FILTER_SORT_GRIDS = ButtonGrid(origin=(284, 60), delta=(158, 0), button_shape=(137, 38), grid_shape=(6, 1), name='FILTER_SORT') FILTER_SORT_TYPES = [['rarity', 'level', 'total', 'join', 'intimacy', 'stat']] # stat has extra grid, not worth pursuing FILTER_INDEX_GRIDS = ButtonGrid(origin=(284, 133), delta=(158, 57), button_shape=(137, 38),
MEOWFFICER_TALENT_GRID_1 = ButtonGrid(origin=(875, 559), delta=(105, 0), button_shape=(16, 16), grid_shape=(3, 1), name='MEOWFFICER_TALENT_GRID_1') MEOWFFICER_TALENT_GRID_2 = MEOWFFICER_TALENT_GRID_1.move( vector=(-40, -20), name='MEOWFFICER_TALENT_GRID_2') MEOWFFICER_SHIFT_DETECT = Button(area=(1260, 669, 1280, 720), color=(117, 106, 84), button=(1260, 669, 1280, 720), name='MEOWFFICER_SHIFT_DETECT') SWITCH_LOCK = Switch(name='Meowfficer_Lock', offset=(40, 40)) SWITCH_LOCK.add_status('lock', check_button=MEOWFFICER_APPLY_UNLOCK, click_button=MEOWFFICER_APPLY_LOCK) SWITCH_LOCK.add_status('unlock', check_button=MEOWFFICER_APPLY_LOCK, click_button=MEOWFFICER_APPLY_UNLOCK) class MeowfficerCollect(MeowfficerBase): def _meow_detect_shift(self, skip_first_screenshot=True): """ Serves as innate wait mechanism for loading of meowfficer acquisition complete screen During which screen may shift left randomly Args: skip_first_screenshot (bool):