diff --git a/README.md b/README.md index 27cd6ef37..f38a47979 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # AzurLaneAutoScript #### Discord -[![](https://img.shields.io/discord/720789890354249748?logo=discord)](https://discord.gg/c3WwYWf) +[![](https://img.shields.io/discord/720789890354249748?logo=discord)](https://discord.gg/AQN6GeJ) ### QQ群 1087735381 diff --git a/alas.bat b/alas.bat index a3c601274..9a57c514f 100644 --- a/alas.bat +++ b/alas.bat @@ -1,7 +1,7 @@ @echo off +REM @setlocal EnableExtensions DisableDelayedExpansion pushd %~dp0 title ALAS run -set CMD=%SystemRoot%\system32\cmd.exe :: ----------------------------------------------------------------------------- :check_Permissions echo Administrative permissions required. Detecting permissions... @@ -35,6 +35,14 @@ set configtemp=%~dp0config\alastemp.ini set template=%~dp0config\template.ini set git_log="%GIT% log --pretty=format:%%H%%n%%aI -1" :: ----------------------------------------------------------------------------- +:first_run +if exist %~dp0config\alas.ini set first_run=1 +if defined first_run ( + call :is_using_git +) else ( + call :not_using_git +) +:: ----------------------------------------------------------------------------- set using_git= if exist ".git\" set using_git=1 if defined using_git ( @@ -52,6 +60,8 @@ for /f "delims=" %%a in (!config!) do ( ) ) +:: ----------------------------------------------------------------------------- +:bypass_first_run %CURL% -s https://api.github.com/repos/lmeszinc/AzurLaneAutoScript/git/refs/heads/master?access_token=!github_token! > %~dp0log\api_git.json endlocal FOR /f "skip=5 tokens=2 delims=:," %%I IN (%API_JSON%) DO IF NOT DEFINED sha SET "sha=%%I" @@ -119,7 +129,7 @@ if [%adb_input%]==[] ( REM write adb_input on adb_port.ini echo %adb_input% >> %ADB_P% call :FINDSTR - ) +) :: ----------------------------------------------------------------------------- :: Will search for 127.0.0.1:62001 and replace for %ADB_PORT% :FINDSTR @@ -190,6 +200,13 @@ REM MOVE %configtemp% %config% REM ) :: ----------------------------------------------------------------------------- :load +if defined first_run ( + call :load_alas +) else ( + call :load_input_serial +) +:: ----------------------------------------------------------------------------- +:load_alas set "config=%~dp0config\alas.ini" setlocal enabledelayedexpansion for /f "delims=" %%i in (!config!) do ( @@ -198,8 +215,18 @@ for /f "delims=" %%i in (!config!) do ( set serial=!line:~9! ) ) +call :load_alas_serial +:: ----------------------------------------------------------------------------- +:load_input_serial +echo connecting at %adb_input% +call %ADB% connect %adb_input% +call :init +:: ----------------------------------------------------------------------------- +:load_alas_serial echo connecting at !serial! call !ADB! connect !serial! +call :init +:: ----------------------------------------------------------------------------- endlocal :: ----------------------------------------------------------------------------- :: Deprecated diff --git a/assets/en/reward/MEOWFFICER_BUY_SKIP.png b/assets/en/reward/MEOWFFICER_BUY_SKIP.png index f503f9986..0c94ed0d0 100644 Binary files a/assets/en/reward/MEOWFFICER_BUY_SKIP.png and b/assets/en/reward/MEOWFFICER_BUY_SKIP.png differ diff --git a/campaign/campaign_main/campaign_1_1_affinity_farming.py b/campaign/campaign_main/campaign_1_1_affinity_farming.py index 4deecb024..b149774df 100644 --- a/campaign/campaign_main/campaign_1_1_affinity_farming.py +++ b/campaign/campaign_main/campaign_1_1_affinity_farming.py @@ -22,20 +22,15 @@ class Campaign(CampaignBase): affinity_battle = 0 def battle_default(self): - logger.attr('Affinity_battle', f'{self.affinity_battle}/{self.config.C11_AFFINITY_BATTLE_COUNT}') - self.goto(C1) - self.affinity_battle += 1 + while self.affinity_battle < self.config.C11_AFFINITY_BATTLE_COUNT: + logger.attr('Affinity_battle', f'{self.affinity_battle}/{self.config.C11_AFFINITY_BATTLE_COUNT}') + self.goto(C1) + self.affinity_battle += 1 + self.goto(D1 if np.random.uniform() < 0.7 else B1) # End - if self.affinity_battle >= self.config.C11_AFFINITY_BATTLE_COUNT: - try: - self.withdraw() - except CampaignEnd: - raise ScriptEnd('Reach condition: Affinity farming battle count') + try: + self.withdraw() + except CampaignEnd: + raise ScriptEnd('Reach condition: Affinity farming battle count') - # Continue - if np.random.uniform() < 0.7: - self.goto(D1) - else: - self.goto(B1) - return True diff --git a/campaign/campaign_main/campaign_8_4.py b/campaign/campaign_main/campaign_8_4.py index 5000cc7d1..052d3c653 100644 --- a/campaign/campaign_main/campaign_8_4.py +++ b/campaign/campaign_main/campaign_8_4.py @@ -23,7 +23,7 @@ MAP.weight_data = ''' 50 50 45 90 90 50 50 90 90 90 40 90 90 30 31 90 50 90 30 30 20 14 12 90 - 30 27 35 25 90 90 20 11 + 30 27 35 25 90 90 20 10 30 28 26 20 13 15 10 50 ''' MAP.spawn_data = [ diff --git a/campaign/event_20200723_cn/d1.py b/campaign/event_20200723_cn/d1.py index bc5662b99..00b90ab12 100644 --- a/campaign/event_20200723_cn/d1.py +++ b/campaign/event_20200723_cn/d1.py @@ -57,6 +57,8 @@ class Config: MAP_HAS_DYNAMIC_RED_BORDER = False MAP_HAS_MAP_STORY = True MAP_SIREN_COUNT = 2 + DETECTION_BACKEND = 'homography' + HOMO_STORAGE = ((6, 6), [(583.092, 82.574), (1247.528, 82.574), (564.74, 614.947), (1434.046, 614.947)]) HOMO_EDGE_HOUGHLINES_THRESHOLD = 350 MAP_SIREN_TEMPLATE = ['U101', 'U73', 'U552'] diff --git a/config/template.ini b/config/template.ini index 11d272b29..03e5868f9 100644 --- a/config/template.ini +++ b/config/template.ini @@ -61,7 +61,8 @@ command = setting [Reward] command = reward enable_reward = yes -reward_interval = 20 +reward_interval = 10, 40 +reward_stop_game_during_interval = no enable_daily_reward = no enable_oil_reward = yes enable_coin_reward = yes diff --git a/module/base/utils.py b/module/base/utils.py index 53c21ea33..3a987af04 100644 --- a/module/base/utils.py +++ b/module/base/utils.py @@ -3,7 +3,7 @@ import numpy as np from PIL import ImageStat -def random_normal_distribution_int(a, b, n=5): +def random_normal_distribution_int(a, b, n=3): """Generate a normal distribution int within the interval. Use the average value of several random numbers to simulate normal distribution. diff --git a/module/config/argparser.py b/module/config/argparser.py index a6b96b289..bc0e4a1d5 100644 --- a/module/config/argparser.py +++ b/module/config/argparser.py @@ -196,7 +196,8 @@ def main(ini_name=''): reward_parser = subs.add_parser('收菜设置') reward_condition = reward_parser.add_argument_group('触发条件', '需要运行一次来保存选项, 运行后会进入挂机收菜模式') reward_condition.add_argument('--启用收获', default=default('--启用收获'), choices=['是', '否']) - reward_condition.add_argument('--收菜间隔', default=default('--收菜间隔'), help='每隔多少分钟触发收菜') + reward_condition.add_argument('--收菜间隔', default=default('--收菜间隔'), help='每隔多少分钟触发收菜, 推荐使用时间区间, 比如"10, 40"') + reward_condition.add_argument('--收菜间隔关闭游戏', default=default('--收菜间隔关闭游戏'), choices=['是', '否']) reward_condition.add_argument('--启用每日收获', default=default('--启用每日收获'), choices=['是', '否'], help='将每日任务困难演习作为收获的一部分来运行') reward_oil = reward_parser.add_argument_group('石油物资', '') diff --git a/module/config/argparser_en.py b/module/config/argparser_en.py index f41a04084..2bd81f223 100644 --- a/module/config/argparser_en.py +++ b/module/config/argparser_en.py @@ -197,7 +197,8 @@ def main(ini_name=''): reward_parser = subs.add_parser('reward') reward_condition = reward_parser.add_argument_group('Triggering conditions', 'Need to Press start to save your settings, after running it will enter the on-hook vegetable collection mode') reward_condition.add_argument('--enable_reward', default=default('--enable_reward'), choices=['yes', 'no']) - reward_condition.add_argument('--reward_interval', default=default('--reward_interval'), help='How many minutes to trigger collection') + reward_condition.add_argument('--reward_interval', default=default('--reward_interval'), help='How many minutes to trigger collection. Recommend to set a time range, such as "10, 40"') + reward_condition.add_argument('--reward_stop_game_during_interval', default=default('--reward_stop_game_during_interval'), choices=['yes', 'no']) reward_condition.add_argument('--enable_daily_reward', default=default('--enable_daily_reward'), choices=['yes', 'no'], help='Run daily as a part of reward') reward_oil = reward_parser.add_argument_group('Oil supplies', '') diff --git a/module/config/argparser_jp.py b/module/config/argparser_jp.py index 1a138ce7a..72380aec1 100644 --- a/module/config/argparser_jp.py +++ b/module/config/argparser_jp.py @@ -197,7 +197,8 @@ def main(ini_name=''): reward_parser = subs.add_parser('reward') reward_condition = reward_parser.add_argument_group('Triggering conditions', 'Need to Press start to save your settings, after running it will enter the on-hook vegetable collection mode') reward_condition.add_argument('--enable_reward', default=default('--enable_reward'), choices=['yes', 'no']) - reward_condition.add_argument('--reward_interval', default=default('--reward_interval'), help='How many minutes to trigger collection') + reward_condition.add_argument('--reward_interval', default=default('--reward_interval'), help='How many minutes to trigger collection. Recommend to set a time range, such as "10, 40"') + reward_condition.add_argument('--reward_stop_game_during_interval', default=default('--reward_stop_game_during_interval'), choices=['yes', 'no']) reward_condition.add_argument('--enable_daily_reward', default=default('--enable_daily_reward'), choices=['yes', 'no'], help='Run daily as a part of reward') reward_oil = reward_parser.add_argument_group('Oil supplies', '') diff --git a/module/config/config.py b/module/config/config.py index bedb02b07..0022f6314 100644 --- a/module/config/config.py +++ b/module/config/config.py @@ -362,7 +362,8 @@ class AzurLaneConfig: module.reward """ ENABLE_REWARD = True - REWARD_INTERVAL = 20 + REWARD_INTERVAL = '10, 40' # str, such as '20', '10, 40'. + REWARD_STOP_GAME_DURING_INTERVAL = False REWARD_LAST_TIME = datetime.now() ENABLE_DAILY_REWARD = False ENABLE_OIL_REWARD = True @@ -560,7 +561,8 @@ class AzurLaneConfig: # Reward option = config['Reward'] - self.REWARD_INTERVAL = int(option['reward_interval']) + self.REWARD_INTERVAL = option['reward_interval'] + self.REWARD_STOP_GAME_DURING_INTERVAL = to_bool(option['reward_stop_game_during_interval']) for attr in ['enable_reward', 'enable_oil_reward', 'enable_coin_reward', 'enable_mission_reward', 'enable_commission_reward', 'enable_tactical_reward', 'enable_daily_reward', 'enable_research_reward']: diff --git a/module/config/dictionary.py b/module/config/dictionary.py index 452c1013e..6a11e095f 100644 --- a/module/config/dictionary.py +++ b/module/config/dictionary.py @@ -104,6 +104,7 @@ dic_true_eng_to_eng = { # 'map_star_clear_all': 'map_star_clear_all', 'enable_reward': 'enable_reward', 'reward_interval': 'reward_interval', + 'reward_stop_game_during_interval': 'reward_stop_game_during_interval', 'enable_daily_reward': 'enable_daily_reward', 'enable_oil_reward': 'enable_oil_reward', 'enable_coin_reward': 'enable_coin_reward', @@ -359,6 +360,7 @@ dic_chi_to_eng = { # '地图全清星星': 'map_star_clear_all', '启用收获': 'enable_reward', '收菜间隔': 'reward_interval', + '收菜间隔关闭游戏': 'reward_stop_game_during_interval', '启用每日收获': 'enable_daily_reward', '启用石油收获': 'enable_oil_reward', '启用物资收获': 'enable_coin_reward', diff --git a/module/reward/assets.py b/module/reward/assets.py index c066875d5..8e0e1324d 100644 --- a/module/reward/assets.py +++ b/module/reward/assets.py @@ -21,7 +21,7 @@ MEOWFFICER_BUY_CONFIRM = Button(area={'cn': (741, 434, 827, 468), 'en': (747, 43 MEOWFFICER_BUY_ENTER = Button(area={'cn': (998, 621, 1051, 661), 'en': (998, 621, 1051, 661), 'jp': (998, 621, 1051, 661)}, color={'cn': (196, 157, 131), 'en': (196, 157, 131), 'jp': (196, 157, 131)}, button={'cn': (998, 621, 1051, 661), 'en': (998, 621, 1051, 661), 'jp': (998, 621, 1051, 661)}, file={'cn': './assets/cn/reward/MEOWFFICER_BUY_ENTER.png', 'en': './assets/en/reward/MEOWFFICER_BUY_ENTER.png', 'jp': './assets/cn/reward/MEOWFFICER_BUY_ENTER.png'}) MEOWFFICER_BUY_NEXT = Button(area={'cn': (937, 281, 961, 302), 'en': (937, 281, 961, 302), 'jp': (937, 281, 961, 302)}, color={'cn': (246, 220, 140), 'en': (246, 220, 140), 'jp': (246, 220, 140)}, button={'cn': (937, 281, 961, 302), 'en': (937, 281, 961, 302), 'jp': (937, 281, 961, 302)}, file={'cn': './assets/cn/reward/MEOWFFICER_BUY_NEXT.png', 'en': './assets/en/reward/MEOWFFICER_BUY_NEXT.png', 'jp': './assets/cn/reward/MEOWFFICER_BUY_NEXT.png'}) MEOWFFICER_BUY_PREV = Button(area={'cn': (816, 279, 837, 305), 'en': (816, 279, 837, 305), 'jp': (816, 279, 837, 305)}, color={'cn': (254, 224, 123), 'en': (254, 224, 123), 'jp': (254, 224, 123)}, button={'cn': (816, 279, 837, 305), 'en': (816, 279, 837, 305), 'jp': (816, 279, 837, 305)}, file={'cn': './assets/cn/reward/MEOWFFICER_BUY_PREV.png', 'en': './assets/en/reward/MEOWFFICER_BUY_PREV.png', 'jp': './assets/cn/reward/MEOWFFICER_BUY_PREV.png'}) -MEOWFFICER_BUY_SKIP = Button(area={'cn': (594, 462, 687, 494), 'en': (594, 462, 687, 494), 'jp': (594, 462, 687, 494)}, color={'cn': (238, 216, 104), 'en': (238, 216, 104), 'jp': (238, 216, 104)}, button={'cn': (594, 462, 687, 494), 'en': (594, 462, 687, 494), 'jp': (594, 462, 687, 494)}, file={'cn': './assets/cn/reward/MEOWFFICER_BUY_SKIP.png', 'en': './assets/en/reward/MEOWFFICER_BUY_SKIP.png', 'jp': './assets/cn/reward/MEOWFFICER_BUY_SKIP.png'}) +MEOWFFICER_BUY_SKIP = Button(area={'cn': (594, 462, 687, 494), 'en': (594, 462, 687, 494), 'jp': (594, 462, 687, 494)}, color={'cn': (238, 216, 104), 'en': (216, 197, 99), 'jp': (238, 216, 104)}, button={'cn': (594, 462, 687, 494), 'en': (594, 462, 687, 494), 'jp': (594, 462, 687, 494)}, file={'cn': './assets/cn/reward/MEOWFFICER_BUY_SKIP.png', 'en': './assets/en/reward/MEOWFFICER_BUY_SKIP.png', 'jp': './assets/cn/reward/MEOWFFICER_BUY_SKIP.png'}) MISSION_MULTI = Button(area={'cn': (1041, 8, 1101, 39), 'en': (1041, 8, 1101, 39), 'jp': (1042, 7, 1100, 34)}, color={'cn': (226, 192, 142), 'en': (221, 179, 96), 'jp': (222, 182, 117)}, button={'cn': (1041, 8, 1101, 39), 'en': (1041, 8, 1101, 39), 'jp': (1042, 7, 1100, 34)}, file={'cn': './assets/cn/reward/MISSION_MULTI.png', 'en': './assets/en/reward/MISSION_MULTI.png', 'jp': './assets/jp/reward/MISSION_MULTI.png'}) MISSION_NOTICE = Button(area={'cn': (940, 670, 945, 681), 'en': (940, 670, 945, 681), 'jp': (940, 670, 945, 681)}, color={'cn': (183, 83, 66), 'en': (183, 83, 66), 'jp': (183, 83, 66)}, button={'cn': (940, 670, 945, 681), 'en': (940, 670, 945, 681), 'jp': (940, 670, 945, 681)}, file={'cn': './assets/cn/reward/MISSION_NOTICE.png', 'en': './assets/en/reward/MISSION_NOTICE.png', 'jp': './assets/jp/reward/MISSION_NOTICE.png'}) MISSION_SINGLE = Button(area={'cn': (1093, 118, 1179, 177), 'en': (1093, 118, 1179, 177), 'jp': (1102, 130, 1167, 158)}, color={'cn': (115, 155, 218), 'en': (106, 147, 215), 'jp': (136, 176, 229)}, button={'cn': (1093, 118, 1179, 177), 'en': (1093, 118, 1179, 177), 'jp': (1102, 130, 1167, 158)}, file={'cn': './assets/cn/reward/MISSION_SINGLE.png', 'en': './assets/en/reward/MISSION_SINGLE.png', 'jp': './assets/jp/reward/MISSION_SINGLE.png'}) diff --git a/module/reward/reward.py b/module/reward/reward.py index 341a2ecba..05452788d 100644 --- a/module/reward/reward.py +++ b/module/reward/reward.py @@ -1,6 +1,8 @@ from datetime import datetime, timedelta +from module.base.decorator import cached_property from module.base.timer import Timer +from module.base.utils import ensure_time from module.combat.assets import * from module.handler.login import LoginHandler from module.logger import logger @@ -14,6 +16,28 @@ from module.update import Update class Reward(RewardCommission, RewardTacticalClass, RewardResearch, RewardMeowfficer, LoginHandler, Update): + @cached_property + def reward_interval(self): + """ + REWARD_INTERVAL should be string in minutes, such as '20', '10, 40'. + If it's a time range, should separated with ',' + + Returns: + int: Reward interval in seconds. + """ + interval = self.config.REWARD_INTERVAL + if ',' in interval: + lower, upper = interval.replace(' ', '').split(',') + lower = int(lower) * 60 + upper = int(upper) * 60 + return int(ensure_time((lower, upper), precision=0)) + else: + return int(interval) * 60 + + def reward_interval_reset(self): + """ Call this method after script sleep ends """ + del self.__dict__['reward_interval'] + def reward(self): if not self.config.ENABLE_REWARD: return False @@ -44,7 +68,7 @@ class Reward(RewardCommission, RewardTacticalClass, RewardResearch, RewardMeowff return True def handle_reward(self): - if datetime.now() - self.config.REWARD_LAST_TIME < timedelta(minutes=self.config.REWARD_INTERVAL): + if datetime.now() - self.config.REWARD_LAST_TIME < timedelta(minutes=self.reward_interval): return False flag = self.reward() @@ -166,8 +190,19 @@ class Reward(RewardCommission, RewardTacticalClass, RewardResearch, RewardMeowff self.reward() logger.info('Reward loop wait') - logger.attr('Reward_loop_wait', f'{self.config.REWARD_INTERVAL} min') - self.device.sleep(self.config.REWARD_INTERVAL * 60) + logger.attr('Reward_loop_wait', f'{self.reward_interval // 60} min {self.reward_interval % 60} sec') + if self.config.REWARD_STOP_GAME_DURING_INTERVAL: + interval = ensure_time((10, 30)) + logger.info(f'{self.config.PACKAGE_NAME} will stop in {interval} seconds') + logger.info('If you are playing by hand, please stop Alas') + self.device.sleep(interval) + self.device.app_stop() + + self.device.sleep(self.reward_interval) + self.reward_interval_reset() + + if self.config.REWARD_STOP_GAME_DURING_INTERVAL: + self.app_ensure_start() def daily_wrapper_run(self): count = 0