mirror of
https://gitee.com/sui-feng-cb/AzurLaneAutoScript1
synced 2026-03-26 03:35:03 +08:00
4
alas.py
4
alas.py
@@ -476,7 +476,9 @@ class AzurLaneAutoScript:
|
|||||||
del_cached_property(self, 'config')
|
del_cached_property(self, 'config')
|
||||||
continue
|
continue
|
||||||
if task.command != 'Restart':
|
if task.command != 'Restart':
|
||||||
self.run('start')
|
self.config.task_call('Restart')
|
||||||
|
del_cached_property(self, 'config')
|
||||||
|
continue
|
||||||
elif method == 'goto_main':
|
elif method == 'goto_main':
|
||||||
logger.info('Goto main page during wait')
|
logger.info('Goto main page during wait')
|
||||||
self.run('goto_main')
|
self.run('goto_main')
|
||||||
|
|||||||
@@ -234,3 +234,5 @@ To add a new event, add a new row in here, and run `python -m module.config.conf
|
|||||||
| 20250213 | event 20240815 cn | Windborne Steel Wings | - | - | - | 鐵翼擎風 |
|
| 20250213 | event 20240815 cn | Windborne Steel Wings | - | - | - | 鐵翼擎風 |
|
||||||
| 20250227 | event 20250227 cn | Paradiso of Shackled Light | 樊笼内的神光 | Paradiso of Shackled Light | 籠檻に囚われし神光 | - |
|
| 20250227 | event 20250227 cn | Paradiso of Shackled Light | 樊笼内的神光 | Paradiso of Shackled Light | 籠檻に囚われし神光 | - |
|
||||||
| 20250227 | event 20240725 cn | Interlude of Illusions | - | - | - | 幻夢間奏曲 |
|
| 20250227 | event 20240725 cn | Interlude of Illusions | - | - | - | 幻夢間奏曲 |
|
||||||
|
| 20250320 | event 20230223 cn | Revelations of Dust | 复刻湮烬尘墟 | Revelations of Dust Rerun | 黙示の遺構(復刻) | - |
|
||||||
|
| 20250320 | event 20240521 cn | Light of the Martyrium | - | - | - | 綻放於輝光之城 |
|
||||||
|
|||||||
@@ -1716,13 +1716,13 @@
|
|||||||
],
|
],
|
||||||
"display": "hide",
|
"display": "hide",
|
||||||
"option_bold": [
|
"option_bold": [
|
||||||
"event_20240725_cn",
|
"event_20230223_cn",
|
||||||
"event_20250227_cn"
|
"event_20240521_cn"
|
||||||
],
|
],
|
||||||
"cn": "event_20250227_cn",
|
"cn": "event_20230223_cn",
|
||||||
"en": "event_20250227_cn",
|
"en": "event_20230223_cn",
|
||||||
"jp": "event_20250227_cn",
|
"jp": "event_20230223_cn",
|
||||||
"tw": "event_20240725_cn"
|
"tw": "event_20240521_cn"
|
||||||
},
|
},
|
||||||
"Mode": {
|
"Mode": {
|
||||||
"type": "select",
|
"type": "select",
|
||||||
@@ -2059,13 +2059,13 @@
|
|||||||
"event_20250227_cn"
|
"event_20250227_cn"
|
||||||
],
|
],
|
||||||
"option_bold": [
|
"option_bold": [
|
||||||
"event_20240725_cn",
|
"event_20230223_cn",
|
||||||
"event_20250227_cn"
|
"event_20240521_cn"
|
||||||
],
|
],
|
||||||
"cn": "event_20250227_cn",
|
"cn": "event_20230223_cn",
|
||||||
"en": "event_20250227_cn",
|
"en": "event_20230223_cn",
|
||||||
"jp": "event_20250227_cn",
|
"jp": "event_20230223_cn",
|
||||||
"tw": "event_20240725_cn"
|
"tw": "event_20240521_cn"
|
||||||
},
|
},
|
||||||
"Mode": {
|
"Mode": {
|
||||||
"type": "select",
|
"type": "select",
|
||||||
@@ -2517,13 +2517,13 @@
|
|||||||
"event_20250227_cn"
|
"event_20250227_cn"
|
||||||
],
|
],
|
||||||
"option_bold": [
|
"option_bold": [
|
||||||
"event_20240725_cn",
|
"event_20230223_cn",
|
||||||
"event_20250227_cn"
|
"event_20240521_cn"
|
||||||
],
|
],
|
||||||
"cn": "event_20250227_cn",
|
"cn": "event_20230223_cn",
|
||||||
"en": "event_20250227_cn",
|
"en": "event_20230223_cn",
|
||||||
"jp": "event_20250227_cn",
|
"jp": "event_20230223_cn",
|
||||||
"tw": "event_20240725_cn"
|
"tw": "event_20240521_cn"
|
||||||
},
|
},
|
||||||
"Mode": {
|
"Mode": {
|
||||||
"type": "select",
|
"type": "select",
|
||||||
@@ -3939,13 +3939,13 @@
|
|||||||
"event_20250227_cn"
|
"event_20250227_cn"
|
||||||
],
|
],
|
||||||
"option_bold": [
|
"option_bold": [
|
||||||
"event_20240725_cn",
|
"event_20230223_cn",
|
||||||
"event_20250227_cn"
|
"event_20240521_cn"
|
||||||
],
|
],
|
||||||
"cn": "event_20250227_cn",
|
"cn": "event_20230223_cn",
|
||||||
"en": "event_20250227_cn",
|
"en": "event_20230223_cn",
|
||||||
"jp": "event_20250227_cn",
|
"jp": "event_20230223_cn",
|
||||||
"tw": "event_20240725_cn"
|
"tw": "event_20240521_cn"
|
||||||
},
|
},
|
||||||
"Mode": {
|
"Mode": {
|
||||||
"type": "select",
|
"type": "select",
|
||||||
@@ -4414,13 +4414,13 @@
|
|||||||
"event_20250227_cn"
|
"event_20250227_cn"
|
||||||
],
|
],
|
||||||
"option_bold": [
|
"option_bold": [
|
||||||
"event_20240725_cn",
|
"event_20230223_cn",
|
||||||
"event_20250227_cn"
|
"event_20240521_cn"
|
||||||
],
|
],
|
||||||
"cn": "event_20250227_cn",
|
"cn": "event_20230223_cn",
|
||||||
"en": "event_20250227_cn",
|
"en": "event_20230223_cn",
|
||||||
"jp": "event_20250227_cn",
|
"jp": "event_20230223_cn",
|
||||||
"tw": "event_20240725_cn"
|
"tw": "event_20240521_cn"
|
||||||
},
|
},
|
||||||
"Mode": {
|
"Mode": {
|
||||||
"type": "select",
|
"type": "select",
|
||||||
@@ -4889,13 +4889,13 @@
|
|||||||
"event_20250227_cn"
|
"event_20250227_cn"
|
||||||
],
|
],
|
||||||
"option_bold": [
|
"option_bold": [
|
||||||
"event_20240725_cn",
|
"event_20230223_cn",
|
||||||
"event_20250227_cn"
|
"event_20240521_cn"
|
||||||
],
|
],
|
||||||
"cn": "event_20250227_cn",
|
"cn": "event_20230223_cn",
|
||||||
"en": "event_20250227_cn",
|
"en": "event_20230223_cn",
|
||||||
"jp": "event_20250227_cn",
|
"jp": "event_20230223_cn",
|
||||||
"tw": "event_20240725_cn"
|
"tw": "event_20240521_cn"
|
||||||
},
|
},
|
||||||
"Mode": {
|
"Mode": {
|
||||||
"type": "select",
|
"type": "select",
|
||||||
@@ -5364,13 +5364,13 @@
|
|||||||
"event_20250227_cn"
|
"event_20250227_cn"
|
||||||
],
|
],
|
||||||
"option_bold": [
|
"option_bold": [
|
||||||
"event_20240725_cn",
|
"event_20230223_cn",
|
||||||
"event_20250227_cn"
|
"event_20240521_cn"
|
||||||
],
|
],
|
||||||
"cn": "event_20250227_cn",
|
"cn": "event_20230223_cn",
|
||||||
"en": "event_20250227_cn",
|
"en": "event_20230223_cn",
|
||||||
"jp": "event_20250227_cn",
|
"jp": "event_20230223_cn",
|
||||||
"tw": "event_20240725_cn"
|
"tw": "event_20240521_cn"
|
||||||
},
|
},
|
||||||
"Mode": {
|
"Mode": {
|
||||||
"type": "select",
|
"type": "select",
|
||||||
@@ -5829,13 +5829,13 @@
|
|||||||
"event_20250227_cn"
|
"event_20250227_cn"
|
||||||
],
|
],
|
||||||
"option_bold": [
|
"option_bold": [
|
||||||
"event_20240725_cn",
|
"event_20230223_cn",
|
||||||
"event_20250227_cn"
|
"event_20240521_cn"
|
||||||
],
|
],
|
||||||
"cn": "event_20250227_cn",
|
"cn": "event_20230223_cn",
|
||||||
"en": "event_20250227_cn",
|
"en": "event_20230223_cn",
|
||||||
"jp": "event_20250227_cn",
|
"jp": "event_20230223_cn",
|
||||||
"tw": "event_20240725_cn"
|
"tw": "event_20240521_cn"
|
||||||
},
|
},
|
||||||
"Mode": {
|
"Mode": {
|
||||||
"type": "select",
|
"type": "select",
|
||||||
|
|||||||
@@ -725,7 +725,7 @@
|
|||||||
"event_20220915_cn": "Violet Tempest Blooming Lycoris Rerun",
|
"event_20220915_cn": "Violet Tempest Blooming Lycoris Rerun",
|
||||||
"event_20221124_cn": "The Alchemist and the Archipelago of Secrets",
|
"event_20221124_cn": "The Alchemist and the Archipelago of Secrets",
|
||||||
"event_20221222_cn": "Parallel Superimposition Rerun",
|
"event_20221222_cn": "Parallel Superimposition Rerun",
|
||||||
"event_20230223_cn": "Revelations of Dust",
|
"event_20230223_cn": "Revelations of Dust Rerun",
|
||||||
"event_20230525_cn": "Confluence of Nothingness",
|
"event_20230525_cn": "Confluence of Nothingness",
|
||||||
"event_20230803_cn": "Anthem of Remembrance",
|
"event_20230803_cn": "Anthem of Remembrance",
|
||||||
"event_20230817_cn": "The Fools Scales",
|
"event_20230817_cn": "The Fools Scales",
|
||||||
|
|||||||
@@ -725,7 +725,7 @@
|
|||||||
"event_20220915_cn": "赫の涙月 菫の暁風(復刻)",
|
"event_20220915_cn": "赫の涙月 菫の暁風(復刻)",
|
||||||
"event_20221124_cn": "錬金術士と謎の遺跡群島",
|
"event_20221124_cn": "錬金術士と謎の遺跡群島",
|
||||||
"event_20221222_cn": "積重なる事象の幻界(復刻)",
|
"event_20221222_cn": "積重なる事象の幻界(復刻)",
|
||||||
"event_20230223_cn": "黙示の遺構",
|
"event_20230223_cn": "黙示の遺構(復刻)",
|
||||||
"event_20230525_cn": "覆天せし万象の塵",
|
"event_20230525_cn": "覆天せし万象の塵",
|
||||||
"event_20230803_cn": "燃ゆる聖都の回想曲",
|
"event_20230803_cn": "燃ゆる聖都の回想曲",
|
||||||
"event_20230817_cn": "愚者の天秤",
|
"event_20230817_cn": "愚者の天秤",
|
||||||
|
|||||||
@@ -725,7 +725,7 @@
|
|||||||
"event_20220915_cn": "复刻紫绛槿岚",
|
"event_20220915_cn": "复刻紫绛槿岚",
|
||||||
"event_20221124_cn": "炼金术士与秘密遗迹群岛",
|
"event_20221124_cn": "炼金术士与秘密遗迹群岛",
|
||||||
"event_20221222_cn": "复刻定向折叠",
|
"event_20221222_cn": "复刻定向折叠",
|
||||||
"event_20230223_cn": "湮烬尘墟",
|
"event_20230223_cn": "复刻湮烬尘墟",
|
||||||
"event_20230525_cn": "空相交汇点",
|
"event_20230525_cn": "空相交汇点",
|
||||||
"event_20230803_cn": "奏响鸢尾之歌",
|
"event_20230803_cn": "奏响鸢尾之歌",
|
||||||
"event_20230817_cn": "愚者的天平",
|
"event_20230817_cn": "愚者的天平",
|
||||||
|
|||||||
@@ -735,7 +735,7 @@
|
|||||||
"event_20231221_cn": "星海逐光",
|
"event_20231221_cn": "星海逐光",
|
||||||
"event_20240229_cn": "雪境迷蹤",
|
"event_20240229_cn": "雪境迷蹤",
|
||||||
"event_20240425_cn": "共鳴的PASSION",
|
"event_20240425_cn": "共鳴的PASSION",
|
||||||
"event_20240521_cn": "Light of the Martyrium",
|
"event_20240521_cn": "綻放於輝光之城",
|
||||||
"event_20240725_cn": "幻夢間奏曲",
|
"event_20240725_cn": "幻夢間奏曲",
|
||||||
"event_20240815_cn": "鐵翼擎風",
|
"event_20240815_cn": "鐵翼擎風",
|
||||||
"event_20240829_cn": "埋葬於彼岸之花",
|
"event_20240829_cn": "埋葬於彼岸之花",
|
||||||
|
|||||||
@@ -325,6 +325,17 @@ class Connection(ConnectionAttr):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
@retry
|
||||||
|
def is_mumu_pro(self):
|
||||||
|
# MuMU Pro is the Mac version of MuMu
|
||||||
|
if not IS_MACINTOSH:
|
||||||
|
return False
|
||||||
|
if not self.is_mumu_family:
|
||||||
|
return False
|
||||||
|
logger.attr('is_mumu_pro', True)
|
||||||
|
return True
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
@retry
|
@retry
|
||||||
def nemud_app_keep_alive(self) -> str:
|
def nemud_app_keep_alive(self) -> str:
|
||||||
@@ -410,23 +421,26 @@ class Connection(ConnectionAttr):
|
|||||||
return host, port, host, self.config.REVERSE_SERVER_PORT
|
return host, port, host, self.config.REVERSE_SERVER_PORT
|
||||||
# For emulators, listen on current host
|
# For emulators, listen on current host
|
||||||
if self.is_emulator or self.is_over_http:
|
if self.is_emulator or self.is_over_http:
|
||||||
|
# Mac emulators
|
||||||
|
if self.is_bluestacks_air or self.is_mumu_pro:
|
||||||
|
logger.info(f'Connecting to local emulator, using host 127.0.0.1')
|
||||||
|
port = random_port(self.config.FORWARD_PORT_RANGE)
|
||||||
|
return '127.0.0.1', port, "10.0.2.2", port
|
||||||
|
# Get host IP
|
||||||
try:
|
try:
|
||||||
host = socket.gethostbyname(socket.gethostname())
|
host = socket.gethostbyname(socket.gethostname())
|
||||||
except socket.gaierror as e:
|
except socket.gaierror as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
logger.error(f'Unknown host name: {socket.gethostname()}')
|
logger.error(f'Unknown host name: {socket.gethostname()}')
|
||||||
host = '127.0.0.1'
|
host = '127.0.0.1'
|
||||||
|
# Fixup linux AVD host
|
||||||
if IS_LINUX and host == '127.0.1.1':
|
if IS_LINUX and host == '127.0.1.1':
|
||||||
host = '127.0.0.1'
|
host = '127.0.0.1'
|
||||||
if self.is_bluestacks_air:
|
|
||||||
host = '127.0.0.1'
|
|
||||||
logger.info(f'Connecting to local emulator, using host {host}')
|
logger.info(f'Connecting to local emulator, using host {host}')
|
||||||
port = random_port(self.config.FORWARD_PORT_RANGE)
|
port = random_port(self.config.FORWARD_PORT_RANGE)
|
||||||
|
|
||||||
# For AVD instance
|
# For AVD instance
|
||||||
if self.is_avd or self.is_bluestacks_air:
|
if self.is_avd:
|
||||||
return host, port, "10.0.2.2", port
|
return host, port, "10.0.2.2", port
|
||||||
|
|
||||||
return host, port, host, port
|
return host, port, host, port
|
||||||
# For local network devices, listen on the host under the same network as target device
|
# For local network devices, listen on the host under the same network as target device
|
||||||
if self.is_network_device:
|
if self.is_network_device:
|
||||||
|
|||||||
@@ -344,10 +344,14 @@ class FleetPreparation(InfoHandler):
|
|||||||
|
|
||||||
# Check if submarine is empty again.
|
# Check if submarine is empty again.
|
||||||
if submarine.allow():
|
if submarine.allow():
|
||||||
|
logger.attr('map_allow_submarine', True)
|
||||||
if self.config.Submarine_Fleet:
|
if self.config.Submarine_Fleet:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
submarine.clear()
|
submarine.clear()
|
||||||
|
else:
|
||||||
|
logger.attr('map_allow_submarine', False)
|
||||||
|
self.config.SUBMARINE = 0
|
||||||
|
|
||||||
if self.appear(FLEET_1_CLEAR, offset=(-20, -80, 20, 5)):
|
if self.appear(FLEET_1_CLEAR, offset=(-20, -80, 20, 5)):
|
||||||
AUTO_SEARCH_SET_MOB.load_offset(FLEET_1_CLEAR)
|
AUTO_SEARCH_SET_MOB.load_offset(FLEET_1_CLEAR)
|
||||||
|
|||||||
@@ -17,10 +17,8 @@ class BeaconReward(Combat, UI):
|
|||||||
in: page_meta
|
in: page_meta
|
||||||
"""
|
"""
|
||||||
if self.appear(META_REWARD_NOTICE, threshold=30):
|
if self.appear(META_REWARD_NOTICE, threshold=30):
|
||||||
logger.info('Found meta reward red dot')
|
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
logger.info('No meta reward red dot')
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def meta_reward_receive(self, skip_first_screenshot=True):
|
def meta_reward_receive(self, skip_first_screenshot=True):
|
||||||
@@ -140,6 +138,36 @@ class BeaconReward(Combat, UI):
|
|||||||
logger.info(f'Meta sync receive finished, received={received}')
|
logger.info(f'Meta sync receive finished, received={received}')
|
||||||
return received
|
return received
|
||||||
|
|
||||||
|
def meta_wait_reward_page(self, skip_first_screenshot=True):
|
||||||
|
"""
|
||||||
|
Wait the circle loading animation
|
||||||
|
"""
|
||||||
|
timeout = Timer(2, count=6).start()
|
||||||
|
while 1:
|
||||||
|
if skip_first_screenshot:
|
||||||
|
skip_first_screenshot = False
|
||||||
|
else:
|
||||||
|
self.device.screenshot()
|
||||||
|
|
||||||
|
if timeout.reached():
|
||||||
|
logger.warning(f'meta_wait_reward_page timeout')
|
||||||
|
break
|
||||||
|
if self.appear(REWARD_ENTER, offset=(20, 20)):
|
||||||
|
logger.info(f'meta_wait_reward_page ends at {REWARD_ENTER}')
|
||||||
|
break
|
||||||
|
if self.appear(SYNC_ENTER, offset=(20, 20)):
|
||||||
|
logger.info(f'meta_wait_reward_page ends at {SYNC_ENTER}')
|
||||||
|
break
|
||||||
|
if self.appear(SYNC_TAP, offset=(20, 20)):
|
||||||
|
logger.info(f'meta_wait_reward_page ends at {SYNC_TAP}')
|
||||||
|
break
|
||||||
|
if self.meta_sync_notice_appear():
|
||||||
|
logger.info('meta_wait_reward_page ends at sync red dot')
|
||||||
|
break
|
||||||
|
if self.meta_reward_notice_appear():
|
||||||
|
logger.info('meta_wait_reward_page ends at reward red dot')
|
||||||
|
break
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
if self.config.SERVER in ['cn', 'en', 'jp']:
|
if self.config.SERVER in ['cn', 'en', 'jp']:
|
||||||
pass
|
pass
|
||||||
@@ -148,15 +176,22 @@ class BeaconReward(Combat, UI):
|
|||||||
return
|
return
|
||||||
|
|
||||||
self.ui_ensure(page_meta)
|
self.ui_ensure(page_meta)
|
||||||
|
self.meta_wait_reward_page()
|
||||||
|
|
||||||
|
# Sync rewards
|
||||||
|
# "sync" is the period that you gather meta points to 100% and get a meta ship
|
||||||
if self.meta_sync_notice_appear():
|
if self.meta_sync_notice_appear():
|
||||||
logger.info('Found meta sync red dot')
|
logger.info('Found meta sync red dot')
|
||||||
self.meta_sync_receive()
|
self.meta_sync_receive()
|
||||||
else:
|
else:
|
||||||
logger.info('No meta sync red dot')
|
logger.info('No meta sync red dot')
|
||||||
|
|
||||||
|
# Meta rewards
|
||||||
if self.meta_reward_notice_appear():
|
if self.meta_reward_notice_appear():
|
||||||
|
logger.info('Found meta reward red dot')
|
||||||
self.meta_reward_receive()
|
self.meta_reward_receive()
|
||||||
|
else:
|
||||||
|
logger.info('No meta reward red dot')
|
||||||
|
|
||||||
|
|
||||||
class DossierReward(Combat, UI):
|
class DossierReward(Combat, UI):
|
||||||
|
|||||||
Reference in New Issue
Block a user