From 567c4a790a359c2b1700eee1a483673e08679806 Mon Sep 17 00:00:00 2001 From: LmeSzinc Date: Fri, 17 Jul 2020 09:28:11 +0800 Subject: [PATCH] Add: Research to GUI - Opt: Faster page switch in reward --- config/template.ini | 6 ++++++ doc/filter_string_en_cn.md | 16 ++++++++++++++++ module/config/argparser.py | 13 ++++++++++++- module/config/argparser_en.py | 13 ++++++++++++- module/config/argparser_jp.py | 13 ++++++++++++- module/config/config.py | 7 ++++++- module/config/dictionary.py | 26 ++++++++++++++++++++++++++ module/research/research.py | 14 +++++++------- module/reward/commission.py | 4 ++-- module/reward/reward.py | 7 +++---- 10 files changed, 102 insertions(+), 17 deletions(-) diff --git a/config/template.ini b/config/template.ini index cdd199f97..ad2f54eab 100644 --- a/config/template.ini +++ b/config/template.ini @@ -91,6 +91,12 @@ tactical_book_tier = 2 tactical_exp_first = yes tactical_book_tier_night = 3 tactical_exp_first_night = no +enable_research_reward = no +research_use_cube = no +research_use_coin = yes +research_use_part = yes +research_filter_preset = series_3_than_2 +research_filter_string = [Emulator] command = emulator diff --git a/doc/filter_string_en_cn.md b/doc/filter_string_en_cn.md index a9b389c03..b32725e8b 100644 --- a/doc/filter_string_en_cn.md +++ b/doc/filter_string_en_cn.md @@ -115,6 +115,22 @@ Q1 > Q2 > T3 > T4 > Q4 > C6 > T6 > C8 > C12 > G1.5 > D2.5 > G2.5 > D5 > Q0.5 > G - `reset`, 举例 `x-xx > reset > x-xx`. 当查找到此处时, Alas 会刷新科研列表. 如果今天的刷新已经用过了, 什么都不做. +## Use your filter string in Alas 在Alas中使用过滤字符串 + +Open config/alas.ini , search `research_filter_string`, and paste filter string there, like this: + +Choose "research_filter_prefix" to be "customized" in Alas GUI, and press "run" to save settings. + +打开 config/alas.ini , 找到 `research_filter_string`, 并在那粘贴过滤字符串, 像这样: + +在 Alas GUI 中把 "科研项目选择预设" 设置为 "自定义", 并点击 "运行" 保存设置. + +``` +research_filter_string = S3-DR-0.5 > S3-0.5 > Q0.5 > cheapest +``` + + + ## Some pre-written filter string 一些预制的过滤字符串 - `series_3_fastest` Do series 3 ASAP, whatever it costs. 快速完成三期科研, 不惜一切代价. diff --git a/module/config/argparser.py b/module/config/argparser.py index 5aada0d22..a7a9ca0e3 100644 --- a/module/config/argparser.py +++ b/module/config/argparser.py @@ -9,6 +9,7 @@ from alas import AzurLaneAutoScript from module.config.dictionary import dic_chi_to_eng, dic_eng_to_chi from module.config.update import get_config from module.logger import pyw_name +from module.research.preset import DICT_FILTER_PRESET try: if sys.stdout.encoding != 'UTF-8': @@ -46,6 +47,7 @@ def main(ini_name=''): event_latest = sorted([f for f in event_folder], reverse=True)[0] event_folder = [dic_eng_to_chi.get(f, f) for f in event_folder][::-1] event_latest = dic_eng_to_chi.get(event_latest, event_latest) + research_preset = [dic_eng_to_chi.get(f, f) for f in ['customized'] + list(DICT_FILTER_PRESET.keys())] raid_latest = '复刻特别演习埃塞克斯级' @@ -185,7 +187,7 @@ 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('--收菜间隔'), choices=['20', '30', '60'], help='每隔多少分钟触发收菜') + reward_condition.add_argument('--收菜间隔', default=default('--收菜间隔'), help='每隔多少分钟触发收菜') reward_condition.add_argument('--启用每日收获', default=default('--启用每日收获'), choices=['是', '否'], help='将每日任务困难演习作为收获的一部分来运行') reward_oil = reward_parser.add_argument_group('石油物资', '') @@ -233,6 +235,15 @@ def main(ini_name=''): reward_tactical.add_argument('--技能书夜间稀有度', default=default('--技能书夜间稀有度'), choices=['3', '2', '1']) reward_tactical.add_argument('--技能书夜间优先使用同类型', default=default('--技能书夜间优先使用同类型'), choices=['是', '否']) + reward_research = reward_parser.add_argument_group('科研项目', '科研预设选择为自定义时, 须先阅读 doc/filter_string_en_cn.md') + reward_research.add_argument('--启用科研项目收获', default=default('--启用科研项目收获'), choices=['是', '否']) + research_input = reward_research.add_argument_group('科研投入', '') + research_input.add_argument('--科研项目使用魔方', default=default('--科研项目使用魔方'), choices=['是', '否']) + research_input.add_argument('--科研项目使用金币', default=default('--科研项目使用金币'), choices=['是', '否']) + research_input.add_argument('--科研项目使用部件', default=default('--科研项目使用部件'), choices=['是', '否']) + research_output = reward_research.add_argument_group('科研产出', '') + research_output.add_argument('--科研项目选择预设', default=default('--科研项目选择预设'), choices=research_preset) + # ==========设备设置========== emulator_parser = subs.add_parser('设备设置') emulator = emulator_parser.add_argument_group('模拟器', '需要运行一次来保存选项, 会检查游戏是否启动\n若启动了游戏, 触发一次收菜') diff --git a/module/config/argparser_en.py b/module/config/argparser_en.py index 9a5c759fa..5d90a5c06 100644 --- a/module/config/argparser_en.py +++ b/module/config/argparser_en.py @@ -9,6 +9,7 @@ from alas import AzurLaneAutoScript from module.config.dictionary import dic_true_eng_to_eng, dic_eng_to_true_eng from module.config.update import get_config from module.logger import pyw_name +from module.research.preset import DICT_FILTER_PRESET try: if sys.stdout.encoding != 'UTF-8': @@ -46,6 +47,7 @@ def main(ini_name=''): event_latest = sorted([f for f in event_folder], reverse=True)[0] event_folder = [dic_eng_to_true_eng.get(f, f) for f in event_folder][::-1] event_latest = dic_eng_to_true_eng.get(event_latest, event_latest) + research_preset = [dic_eng_to_true_eng.get(f, f) for f in ['customized'] + list(DICT_FILTER_PRESET.keys())] raid_latest = 'Air_Raid_Drills_with_Essex' @@ -186,7 +188,7 @@ 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'), choices=['20', '30', '60'], help='How many minutes to trigger collection') + reward_condition.add_argument('--reward_interval', default=default('--reward_interval'), help='How many minutes to trigger collection') 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', '') @@ -234,6 +236,15 @@ def main(ini_name=''): reward_tactical.add_argument('--tactical_book_tier_night', default=default('--tactical_book_tier_night'), choices=['3', '2', '1']) reward_tactical.add_argument('--tactical_exp_first_night', default=default('--tactical_exp_first_night'), choices=['yes', 'no']) + reward_research = reward_parser.add_argument_group('Research', 'If set research_filter_preset=customized, read doc/filter_string_en_cn.md first') + reward_research.add_argument('--enable_research_reward', default=default('--enable_research_reward'), choices=['yes', 'no']) + research_input = reward_research.add_argument_group('Research input', '') + research_input.add_argument('--research_use_cube', default=default('--research_use_cube'), choices=['yes', 'no']) + research_input.add_argument('--research_use_coin', default=default('--research_use_coin'), choices=['yes', 'no']) + research_input.add_argument('--research_use_part', default=default('--research_use_part'), choices=['yes', 'no']) + research_output = reward_research.add_argument_group('Research output', '') + research_output.add_argument('--research_filter_preset', default=default('--research_filter_preset'), choices=research_preset) + # ==========emulator========== emulator_parser = subs.add_parser('emulator') emulator = emulator_parser.add_argument_group('Emulator', 'Need to Press start to save your settings, it will check whether the game is started \nIf the game has not started, it will be started') diff --git a/module/config/argparser_jp.py b/module/config/argparser_jp.py index ca646ce4d..bcfdc8aa2 100644 --- a/module/config/argparser_jp.py +++ b/module/config/argparser_jp.py @@ -9,6 +9,7 @@ from alas import AzurLaneAutoScript from module.config.dictionary import dic_true_eng_to_eng, dic_eng_to_true_eng from module.config.update import get_config from module.logger import pyw_name +from module.research.preset import DICT_FILTER_PRESET try: if sys.stdout.encoding != 'UTF-8': @@ -46,6 +47,7 @@ def main(ini_name=''): event_latest = sorted([f for f in event_folder], reverse=True)[0] event_folder = [dic_eng_to_true_eng.get(f, f) for f in event_folder][::-1] event_latest = dic_eng_to_true_eng.get(event_latest, event_latest) + research_preset = [dic_eng_to_true_eng.get(f, f) for f in ['customized'] + list(DICT_FILTER_PRESET.keys())] raid_latest = 'Air_Raid_Drills_with_Essex' @@ -186,7 +188,7 @@ 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'), choices=['20', '30', '60'], help='How many minutes to trigger collection') + reward_condition.add_argument('--reward_interval', default=default('--reward_interval'), help='How many minutes to trigger collection') 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', '') @@ -234,6 +236,15 @@ def main(ini_name=''): reward_tactical.add_argument('--tactical_book_tier_night', default=default('--tactical_book_tier_night'), choices=['3', '2', '1']) reward_tactical.add_argument('--tactical_exp_first_night', default=default('--tactical_exp_first_night'), choices=['yes', 'no']) + reward_research = reward_parser.add_argument_group('Research', 'If set research_filter_preset=customized, read doc/filter_string_en_cn.md first') + reward_research.add_argument('--enable_research_reward', default=default('--enable_research_reward'), choices=['yes', 'no']) + research_input = reward_research.add_argument_group('Research input', '') + research_input.add_argument('--research_use_cube', default=default('--research_use_cube'), choices=['yes', 'no']) + research_input.add_argument('--research_use_coin', default=default('--research_use_coin'), choices=['yes', 'no']) + research_input.add_argument('--research_use_part', default=default('--research_use_part'), choices=['yes', 'no']) + research_output = reward_research.add_argument_group('Research output', '') + research_output.add_argument('--research_filter_preset', default=default('--research_filter_preset'), choices=research_preset) + # ==========emulator========== emulator_parser = subs.add_parser('emulator') emulator = emulator_parser.add_argument_group('Emulator', 'Need to Press start to save your settings, it will check whether the game is started \nIf the game has not started, it will be started') diff --git a/module/config/config.py b/module/config/config.py index e7c93b9b2..1473e16c5 100644 --- a/module/config/config.py +++ b/module/config/config.py @@ -538,7 +538,8 @@ class AzurLaneConfig: option = config['Reward'] self.REWARD_INTERVAL = int(option['reward_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_commission_reward', 'enable_tactical_reward', 'enable_daily_reward', + 'enable_research_reward']: self.__setattr__(attr.upper(), to_bool(option[attr])) if not option['commission_time_limit'].isdigit(): self.COMMISSION_TIME_LIMIT = future_time(option['commission_time_limit']) @@ -551,6 +552,10 @@ class AzurLaneConfig: self.TACTICAL_EXP_FIRST = to_bool(option['tactical_exp_first']) self.TACTICAL_BOOK_TIER_NIGHT = int(option['tactical_book_tier_night']) self.TACTICAL_EXP_FIRST_NIGHT = to_bool(option['tactical_exp_first_night']) + for item in ['coin', 'cube', 'part']: + self.__setattr__(f'RESEARCH_USE_{item}'.upper(), to_bool(option[f'RESEARCH_USE_{item}'.lower()])) + self.RESEARCH_FILTER_PRESET = option['research_filter_preset'] + self.RESEARCH_FILTER_STRING = option['research_filter_string'] option = config['Main'] self.CAMPAIGN_MODE = option['campaign_mode'] diff --git a/module/config/dictionary.py b/module/config/dictionary.py index 60546b008..1bb8b129e 100644 --- a/module/config/dictionary.py +++ b/module/config/dictionary.py @@ -123,6 +123,11 @@ dic_true_eng_to_eng = { 'tactical_exp_first': 'tactical_exp_first', 'tactical_book_tier_night': 'tactical_book_tier_night', 'tactical_exp_first_night': 'tactical_exp_first_night', + 'enable_research_reward': 'enable_research_reward', + 'research_filter_preset': 'research_filter_preset', + 'research_use_cube': 'research_use_cube', + 'research_use_coin': 'research_use_coin', + 'research_use_part': 'research_use_part', 'serial': 'serial', 'package_name': 'package_name', 'enable_error_log_and_screenshot_save': 'enable_error_log_and_screenshot_save', @@ -221,6 +226,14 @@ dic_true_eng_to_eng = { 'hard': 'hard', 'easy': 'easy', + # Research filter preset + 'customized': 'customized', + 'series_3': 'series_3', + 'series_3_than_2': 'series_3_than_2', + 'series_3_fastest': 'series_3_fastest', + 'free_research_only': 'free_research_only', + 'cubes_to_chips': 'cubes_to_chips', + # Event 'Iris_of_Light_and_Dark': 'event_20200521_en', 'Skybound_Oratorio': 'event_20200611_en', @@ -332,6 +345,11 @@ dic_chi_to_eng = { '技能书优先使用同类型': 'tactical_exp_first', '技能书夜间稀有度': 'tactical_book_tier_night', '技能书夜间优先使用同类型': 'tactical_exp_first_night', + '启用科研项目收获': 'enable_research_reward', + '科研项目选择预设': 'research_filter_preset', + '科研项目使用魔方': 'research_use_cube', + '科研项目使用金币': 'research_use_coin', + '科研项目使用部件': 'research_use_part', '设备': 'serial', '包名': 'package_name', '出错时保存log和截图': 'enable_error_log_and_screenshot_save', @@ -430,6 +448,14 @@ dic_chi_to_eng = { '困难': 'hard', '简单': 'easy', + # Research filter preset + '自定义': 'customized', + '三期': 'series_3', + '三期兼顾二期': 'series_3_than_2', + '三期最快': 'series_3_fastest', + '仅白嫖': 'free_research_only', + '切魔方换心智': 'cubes_to_chips', + # Event '北境序曲': 'event_20200227_cn', '复刻斯图尔特的硝烟': 'event_20200312_cn', diff --git a/module/research/research.py b/module/research/research.py index 6a77d8004..30972ac57 100644 --- a/module/research/research.py +++ b/module/research/research.py @@ -1,6 +1,5 @@ import numpy as np -from module.base.timer import Timer from module.base.utils import get_color from module.combat.assets import GET_ITEMS_1, GET_ITEMS_2, GET_ITEMS_3 from module.logger import logger @@ -11,9 +10,9 @@ from module.ui.ui import page_research, page_main, RESEARCH_CHECK RESEARCH_ENTRANCE = [ENTRANCE_1, ENTRANCE_2, ENTRANCE_3, ENTRANCE_4, ENTRANCE_5] -class ResearchReward(ResearchSelector): +class RewardResearch(ResearchSelector): def ensure_research_stable(self): - self.wait_until_stable(STABLE_CHECKER, timer=Timer(1, count=3)) + self.wait_until_stable(STABLE_CHECKER) def _in_research(self): return self.appear(RESEARCH_CHECK, offset=(20, 20)) @@ -63,7 +62,7 @@ class ResearchReward(ResearchSelector): # End if executed and self._in_research(): - self.ensure_no_info_bar() + self.ensure_no_info_bar() # Refresh success self.ensure_research_stable() break @@ -125,6 +124,7 @@ class ResearchReward(ResearchSelector): # End if self.appear(RESEARCH_STOP): + self.ensure_no_info_bar() # Research started break def research_receive(self, skip_first_screenshot=True, save_get_items=False): @@ -182,7 +182,7 @@ class ResearchReward(ResearchSelector): self.config.SCREEN_SHOT_SAVE_FOLDER_FOLDER = backup - def research_start(self): + def research_reward(self): """ Receive research reward and start new research. Unable to detect research is running. @@ -198,7 +198,7 @@ class ResearchReward(ResearchSelector): index = self.research_select() self.research_project_start(index) - def handle_research_start(self): + def handle_research_reward(self): """ Pages: in: page_reward @@ -215,7 +215,7 @@ class ResearchReward(ResearchSelector): self.ui_goto(page_research, skip_first_screenshot=True) self.ensure_research_stable() - self.research_start() + self.research_reward() self.ui_goto(page_main, skip_first_screenshot=True) return True diff --git a/module/reward/commission.py b/module/reward/commission.py index 3855877ce..f8995797c 100644 --- a/module/reward/commission.py +++ b/module/reward/commission.py @@ -652,12 +652,12 @@ class RewardCommission(UI, InfoHandler): """ if not self.config.ENABLE_COMMISSION_REWARD: return False - self.device.screenshot() + if not self.appear(COMMISSION_HAS_PENDING): logger.info('No commission pending') return False - self.ui_goto(page_commission) + self.ui_goto(page_commission, skip_first_screenshot=True) self.commission_start() diff --git a/module/reward/reward.py b/module/reward/reward.py index 4fcdaae13..85f3f08ea 100644 --- a/module/reward/reward.py +++ b/module/reward/reward.py @@ -9,9 +9,10 @@ from module.reward.commission import RewardCommission from module.reward.tactical_class import RewardTacticalClass from module.ui.page import * from module.update import Update +from module.research.research import RewardResearch -class Reward(RewardCommission, RewardTacticalClass, LoginHandler, Update): +class Reward(RewardCommission, RewardTacticalClass, RewardResearch, LoginHandler, Update): def reward(self): if not self.config.ENABLE_REWARD: return False @@ -26,7 +27,7 @@ class Reward(RewardCommission, RewardTacticalClass, LoginHandler, Update): self.handle_commission_start() self.handle_tactical_class() - self.ui_goto_main() + self.handle_research_reward() self._reward_mission() self.config.REWARD_LAST_TIME = datetime.now() @@ -59,8 +60,6 @@ class Reward(RewardCommission, RewardTacticalClass, LoginHandler, Update): exit_timer = Timer(1, count=3).start() click_timer = Timer(1) btn = [] - if self.config.ENABLE_REWARD: - btn.append(REWARD_3) if self.config.ENABLE_COMMISSION_REWARD: btn.append(REWARD_1) if self.config.ENABLE_OIL_REWARD: