From 175e1dc529a7b251ddaf2a7ff3b550a04e7c3c05 Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Tue, 4 Aug 2026 22:19:37 +0800 Subject: [PATCH 1/8] fix(SwitchAccount): Fix attribute name typo O_SA_CHECK_SELCET_SVR causing AttributeError --- tasks/Component/SwitchAccount/login_account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/Component/SwitchAccount/login_account.py b/tasks/Component/SwitchAccount/login_account.py index 827ebd54b..8bd0366d3 100644 --- a/tasks/Component/SwitchAccount/login_account.py +++ b/tasks/Component/SwitchAccount/login_account.py @@ -90,7 +90,7 @@ def switch_character(self, characterName: str): """ logger.info("start switch_character") # 改成对比是否出现 已有角色 - self.ui_click(self.C_SA_LOGIN_FORM_SWITCH_SVR_BTN, self.O_SA_CHECK_SELCET_SVR) + self.ui_click(self.C_SA_LOGIN_FORM_SWITCH_SVR_BTN, self.O_SA_CHECK_SELECT_SVR) # 展开底部角色列表,显示角色所属服务器 self.screenshot() while (not self.appear(self.I_SA_CHECK_SELECT_SVR_2)) and self.appear(self.I_SA_CHECK_SELECT_SVR_1): From fe7f8e1cc9405aa2d12540e9d6d7d4a67d6be497 Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Tue, 4 Aug 2026 23:50:55 +0800 Subject: [PATCH 2/8] fix(BondlingFairyland): Switch mitama separately before search and capture #1715 --- tasks/BondlingFairyland/script_task.py | 36 +++++++++++++- tasks/Component/SwitchSoul/assets.py | 2 + tasks/Component/SwitchSoul/ss/image.json | 9 ++++ .../ss/ss_goto_shikigami_common.png | Bin 0 -> 3192 bytes tasks/Component/SwitchSoul/switch_soul.py | 44 ++++++++++++------ 5 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 tasks/Component/SwitchSoul/ss/ss_goto_shikigami_common.png diff --git a/tasks/BondlingFairyland/script_task.py b/tasks/BondlingFairyland/script_task.py index 5bab62154..186eb670e 100644 --- a/tasks/BondlingFairyland/script_task.py +++ b/tasks/BondlingFairyland/script_task.py @@ -290,6 +290,8 @@ def switch_ball(self): elif bondling_config.bondling_search_enable and bondling_config.user_status == UserStatus.ALONE: if self.run_search(bondling_config, limit_cnt=random.randint(5, 20)): logger.info('Bondling search finish, try to run catch') + # 切御魂 + self._switch_soul_capture() continue else: break # 时间到了或次数到了直接退出 @@ -368,6 +370,7 @@ def run_search(self, bondling_config: BondlingConfig, limit_cnt: int = None): (4) 打满对应limit_cnt次, (探查界面)返回True """ self.lock_team() + self._switch_soul_search() while 1: # 检查是不是在探查界面, if not self.in_search_ui(screenshot=True): @@ -816,6 +819,37 @@ def do_switch_soul(ts: str, g: str | int, te: str | int): type_str, (group, team) = bondling_switch_soul.get_switch_by_name('search_switch') do_switch_soul(type_str, group, team) + def _switch_soul_to(self, ts, g, te): + def _do_switch_soul(ts: str, g: str | int, te: str | int): + if ts is None: + raise ValueError(f'Invalid switch soul config on {self.config.bondling_fairyland.bondling_config.bondling_stone_class.value}') + if ts == 'int': + self.run_switch_soul((g, te)) + if ts == 'str': + self.run_switch_soul_by_name(g, te) + + if ts is None: + logger.warning('Switch soul preset not configured, skip') + return + + self.goto_shikigami_records(self.I_GOTO_SHIKIGAMI_COMMON) + _do_switch_soul(ts, g, te) + self.exit_shikigami_records() + + + def _switch_soul_search(self): + logger.info("切换御魂-探查") + if not self.config.bondling_fairyland.bondling_switch_soul.enable: return + ts, (g, te) = self.config.bondling_fairyland.bondling_switch_soul.get_switch_by_name('search_switch') + self._switch_soul_to(ts, g, te) + + def _switch_soul_capture(self): + logger.info("切换御魂-捕获") + cong = self.config.bondling_fairyland + if not cong.bondling_switch_soul.enable: return + ts, (g, te) = cong.bondling_switch_soul.get_switch_by_enum(cong.bondling_config.bondling_stone_class) + self._switch_soul_to(ts, g, te) + if __name__ == '__main__': from module.config.config import Config @@ -824,7 +858,7 @@ def do_switch_soul(ts: str, g: str | int, te: str | int): config = Config('oas1') device = Device(config) t = ScriptTask(config, device) - # t.run() + t.run() t.ui_get_current_page() t.ui_goto(page_bondling_fairyland) # image = task.screenshot() diff --git a/tasks/Component/SwitchSoul/assets.py b/tasks/Component/SwitchSoul/assets.py index c6a4dc63e..309852f28 100644 --- a/tasks/Component/SwitchSoul/assets.py +++ b/tasks/Component/SwitchSoul/assets.py @@ -66,6 +66,8 @@ class SwitchSoulAssets: I_SOU_CLICK_PRESENT = RuleImage(roi_front=(978,304,25,26), roi_back=(965,142,48,480), threshold=0.9, method="Template matching", file="./tasks/Component/SwitchSoul/ss/ss_sou_click_present.png") # 误触点到式神检查 I_CHECK_BLOCK = RuleImage(roi_front=(572,408,137,49), roi_back=(572,408,137,49), threshold=0.8, method="Template matching", file="./tasks/Component/SwitchSoul/ss/ss_check_block.png") + # 通用进入式神录 + I_GOTO_SHIKIGAMI_COMMON = RuleImage(roi_front=(1037,567,36,36), roi_back=(617,503,487,134), threshold=0.8, method="Template matching", file="./tasks/Component/SwitchSoul/ss/ss_goto_shikigami_common.png") # Ocr Rule Assets diff --git a/tasks/Component/SwitchSoul/ss/image.json b/tasks/Component/SwitchSoul/ss/image.json index 08933021c..e2034f4a2 100644 --- a/tasks/Component/SwitchSoul/ss/image.json +++ b/tasks/Component/SwitchSoul/ss/image.json @@ -160,5 +160,14 @@ "method": "Template matching", "threshold": 0.8, "description": "误触点到式神检查" + }, + { + "itemName": "goto_shikigami_common", + "imageName": "ss_goto_shikigami_common.png", + "roiFront": "1037,567,36,36", + "roiBack": "617,503,487,134", + "method": "Template matching", + "threshold": 0.8, + "description": "通用进入式神录" } ] \ No newline at end of file diff --git a/tasks/Component/SwitchSoul/ss/ss_goto_shikigami_common.png b/tasks/Component/SwitchSoul/ss/ss_goto_shikigami_common.png new file mode 100644 index 0000000000000000000000000000000000000000..91be2dd3572d09d2ea03c6e5af5c3a3ee1852e16 GIT binary patch literal 3192 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 tuple: @@ -24,6 +27,32 @@ def switch_parser(switch_str: str) -> tuple: class SwitchSoul(BaseTask, SwitchSoulAssets): + def goto_shikigami_records(self, button): + """ + 进入式神录 + """ + while 1: + self.screenshot() + if self.appear(GameUiAssets.I_CHECK_RECORDS): + break + if self.appear_then_click(button, interval=1.5): + continue + logger.info('Entry shikigami records') + + def exit_shikigami_records(self) -> None: + """ + 退出式神录的界面 + :return: + """ + while 1: + self.screenshot() + if not self.appear(self.I_SOU_CHECK_IN): + break + if self.appear_then_click(self.I_RECORD_SOUL_BACK, interval=3.5): + continue + logger.info('Exit shikigami records') + + def run_switch_soul(self, target: tuple | list[tuple] | str): """ 保证在式神录的界面 @@ -153,19 +182,6 @@ def switch_souls(self, target: tuple or list[tuple]) -> None: team = int(team) self.switch_soul_one(group, team) - def exit_shikigami_records(self) -> None: - """ - 退出式神录的界面 - :return: - """ - while 1: - self.screenshot() - if not self.appear(self.I_SOU_CHECK_IN): - break - if self.appear_then_click(self.I_RECORD_SOUL_BACK, interval=3.5): - continue - logger.info('Exit shikigami records') - def run_switch_soul_by_name(self, groupName, teamName): """ 保证在式神录的界面 From 741ec8f30f2a80aaf7d0a63f82ca306f5f2114eb Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Wed, 5 Aug 2026 01:32:09 +0800 Subject: [PATCH 3/8] fix(HeroTest): Add 10s timeout to hero2_skill_wait to prevent infinite loop #1633 --- tasks/HeroTest/script_task.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tasks/HeroTest/script_task.py b/tasks/HeroTest/script_task.py index 5e59db8fd..e4392eac0 100644 --- a/tasks/HeroTest/script_task.py +++ b/tasks/HeroTest/script_task.py @@ -170,8 +170,15 @@ def hero2_skill_wait(self): SkillMode.PVP: pvp_skill, } target_skills = target_skill_dict[self.conf.herotest.skill_mode] + timer = Timer(10).start() while True: self.screenshot() + if timer.reached_and_reset(): + if self.appear(self.I_BCMJ_SKILL_ADD_CONFIRM): + logger.warning('No skill selected for 10s, panel still open, retrying') + continue + logger.warning('Skill selection panel closed unexpectedly, exit') + break if any(self.appear_then_click(ts, interval=1) for ts in target_skills): break self.ui_click_until_disappear(self.I_BCMJ_SKILL_ADD_CONFIRM, interval=1.5) From ab3c8842bc784ed2de2bec8040f94a423782863f Mon Sep 17 00:00:00 2001 From: yuyuyuyuyu <190754820@qq.com> Date: Mon, 3 Aug 2026 20:07:29 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat(Orochi):=20=E5=BE=A1=E9=AD=82=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E5=90=8E=E6=A3=80=E6=B5=8B=E7=9C=9F=E8=9B=87=E5=B9=B6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=8B=89=E8=B5=B7=E7=9C=9F=E8=9B=87=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 check_true_orochi_enable 配置项控制是否启用检测 - 御魂挑战结束后检测真蛇, 发现则立即触发 TrueOrochi 任务 --- assets/i18n/zh-CN.json | 4 +++- tasks/Orochi/config.py | 2 ++ tasks/Orochi/script_task.py | 13 ++++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/assets/i18n/zh-CN.json b/assets/i18n/zh-CN.json index a679ecceb..27fdac888 100644 --- a/assets/i18n/zh-CN.json +++ b/assets/i18n/zh-CN.json @@ -41,5 +41,7 @@ "emulator_startup_lead_time": "模拟器预热时间", "emulator_startup_lead_time_help": "在开始运行任务之前提前启动模拟器的时间", "exit_four_help": "支持打九退四,保证稳定57级,要求设置好战斗主题,即 脚本->全局配置->游戏装饰自定义->战斗主题", - "costume_main_15": "茨心乐园" + "costume_main_15": "茨心乐园", + "check_true_orochi_enable": "是否在结束后检测真蛇", + "check_true_orochi_enable_help": "开启后会在任务结束后检测是否出现真蛇, 若出现则自动拉起真蛇" } diff --git a/tasks/Orochi/config.py b/tasks/Orochi/config.py index c1acbb484..65bc74d2a 100644 --- a/tasks/Orochi/config.py +++ b/tasks/Orochi/config.py @@ -45,6 +45,8 @@ class OrochiConfig(ConfigBase): limit_count: int = Field(default=30, description='limit_count_help') # 是否开启御魂加成 soul_buff_enable: bool = Field(default=False, description='soul_buff_enable_help') + # 是否御魂结束检测是否出现真蛇 + check_true_orochi_enable: bool = Field(default=False, description='check_true_orochi_enable_help') class SwitchSoulConfig(BaseSwitchSoulConfig): enable: bool = Field(default=False) diff --git a/tasks/Orochi/script_task.py b/tasks/Orochi/script_task.py index 020fe1483..18d0adad5 100644 --- a/tasks/Orochi/script_task.py +++ b/tasks/Orochi/script_task.py @@ -14,11 +14,12 @@ from tasks.GameUi.page import page_main, page_soul_zones, page_shikigami_records from tasks.Orochi.assets import OrochiAssets from tasks.Orochi.config import Orochi, UserStatus, Layer +from tasks.TrueOrochi.assets import TrueOrochiAssets from module.logger import logger from module.exception import TaskEnd -class ScriptTask(GeneralBattle, GeneralInvite, GeneralBuff, GeneralRoom, GameUi, SwitchSoul, OrochiAssets): +class ScriptTask(GeneralBattle, GeneralInvite, GeneralBuff, GeneralRoom, GameUi, SwitchSoul, OrochiAssets, TrueOrochiAssets): def run(self) -> bool: # 御魂切换方式一 @@ -59,6 +60,16 @@ def run(self) -> bool: case UserStatus.WILD: success = self.run_wild() case _: logger.error('Unknown user status') + # 御魂结束后检测是否出现真蛇 + if config.orochi_config.check_true_orochi_enable: + self.ui_get_current_page() + self.ui_goto(page_soul_zones) + self.orochi_enter() + self.screenshot() + if self.appear(self.I_FIND_TS): + logger.info('Find true orochi after orochi battle, set TrueOrochi task to run now') + self.set_next_run(task='TrueOrochi', success=False, finish=False, server=False, target=datetime.now()) + self.ui_goto(page_main) # 记得关掉 if config.orochi_config.soul_buff_enable: self.open_buff() From 684890908d8ef403f836b8084a89b26ffbb23be8 Mon Sep 17 00:00:00 2001 From: yuyuyuyuyu <190754820@qq.com> Date: Mon, 3 Aug 2026 23:31:44 +0800 Subject: [PATCH 5/8] =?UTF-8?q?feat(RichMan):=20=E7=A7=98=E5=8D=B7?= =?UTF-8?q?=E5=B1=8B=E6=B5=B7=E6=B1=90=E5=BE=A1=E9=AD=82=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E9=80=89=E6=8B=A9=E5=BE=A1=E9=AD=82=E8=B4=AD?= =?UTF-8?q?=E4=B9=B0=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 enable_book_auto 配置项, 控制永生之海是否使用自动选择 - _scales_sea 根据配置分支: 开启时使用 _scales_buy_more(自动选择), 关闭时使用原 _scales_buy_sea_more(手动选魂) - 补充 zh-CN 国际化文案 --- assets/i18n/zh-CN.json | 4 +++- tasks/Component/Buy/assets.py | 4 ++-- tasks/Component/Buy/buy/click.json | 4 ++-- tasks/Component/Buy/buy/ocr.json | 4 ++-- tasks/RichMan/assets.py | 6 +++--- tasks/RichMan/config.py | 1 + tasks/RichMan/mall/scales.py | 10 ++++++++-- tasks/RichMan/mall/scales/image.json | 2 +- tasks/RichMan/mall/scales/ocr.json | 8 ++++---- .../mall/scales/scales_sca_picture_book.png | Bin 15804 -> 13934 bytes 10 files changed, 26 insertions(+), 17 deletions(-) diff --git a/assets/i18n/zh-CN.json b/assets/i18n/zh-CN.json index 27fdac888..5b8bb8a93 100644 --- a/assets/i18n/zh-CN.json +++ b/assets/i18n/zh-CN.json @@ -43,5 +43,7 @@ "exit_four_help": "支持打九退四,保证稳定57级,要求设置好战斗主题,即 脚本->全局配置->游戏装饰自定义->战斗主题", "costume_main_15": "茨心乐园", "check_true_orochi_enable": "是否在结束后检测真蛇", - "check_true_orochi_enable_help": "开启后会在任务结束后检测是否出现真蛇, 若出现则自动拉起真蛇" + "check_true_orochi_enable_help": "开启后会在任务结束后检测是否出现真蛇, 若出现则自动拉起真蛇", + "enable_book_auto": "自动选择", + "enable_book_auto_help": "游戏内是否开启自动选择御魂" } diff --git a/tasks/Component/Buy/assets.py b/tasks/Component/Buy/assets.py index a20e6d929..281c4ed2b 100644 --- a/tasks/Component/Buy/assets.py +++ b/tasks/Component/Buy/assets.py @@ -14,7 +14,7 @@ class BuyAssets: # description C_BUY_ONE = RuleClick(roi_front=(551,506,174,36), roi_back=(551,506,174,36), name="buy_one") # description - C_BUY_MORE = RuleClick(roi_front=(551,540,174,40), roi_back=(551,540,174,40), name="buy_more") + C_BUY_MORE = RuleClick(roi_front=(551,563,174,17), roi_back=(551,563,174,17), name="buy_more") # 取消购买 C_BUY_CANCEL = RuleClick(roi_front=(121,2,100,22), roi_back=(121,2,100,22), name="buy_cancel") @@ -34,6 +34,6 @@ class BuyAssets: # Ocr Rule Assets # Ocr-description - O_BUY_NUMBER = RuleOcr(roi=(578,416,52,46), area=(578,416,52,46), mode="Digit", method="Default", keyword="", name="buy_number") + O_BUY_NUMBER = RuleOcr(roi=(578,416,52,71), area=(578,416,52,71), mode="Digit", method="Default", keyword="", name="buy_number") diff --git a/tasks/Component/Buy/buy/click.json b/tasks/Component/Buy/buy/click.json index 0c3528ff2..bdcf37970 100644 --- a/tasks/Component/Buy/buy/click.json +++ b/tasks/Component/Buy/buy/click.json @@ -7,8 +7,8 @@ }, { "itemName": "buy_more", - "roiFront": "551,540,174,40", - "roiBack": "551,540,174,40", + "roiFront": "551,563,174,17", + "roiBack": "551,563,174,17", "description": "description" }, { diff --git a/tasks/Component/Buy/buy/ocr.json b/tasks/Component/Buy/buy/ocr.json index ddf2b0402..b7eedcaf5 100644 --- a/tasks/Component/Buy/buy/ocr.json +++ b/tasks/Component/Buy/buy/ocr.json @@ -1,8 +1,8 @@ [ { "itemName": "buy_number", - "roiFront": "578,416,52,46", - "roiBack": "578,416,52,46", + "roiFront": "578,416,52,71", + "roiBack": "578,416,52,71", "mode": "Digit", "method": "Default", "keyword": "", diff --git a/tasks/RichMan/assets.py b/tasks/RichMan/assets.py index a05f97651..5573cf83d 100644 --- a/tasks/RichMan/assets.py +++ b/tasks/RichMan/assets.py @@ -282,7 +282,7 @@ class RichManAssets: # description I_SCA_SELECT_3 = RuleImage(roi_front=(972,517,123,50), roi_back=(972,517,123,50), threshold=0.8, method="Template matching", file="./tasks/RichMan/mall/scales/scales_sca_select_3.png") # 获得的六星 - I_SCA_SIX_STAR = RuleImage(roi_front=(120,216,97,22), roi_back=(113,102,1057,157), threshold=0.8, method="Template matching", file="./tasks/RichMan/mall/scales/scales_sca_six_star.png") + I_SCA_SIX_STAR = RuleImage(roi_front=(120,216,97,22), roi_back=(113,102,1056,257), threshold=0.8, method="Template matching", file="./tasks/RichMan/mall/scales/scales_sca_six_star.png") # 点击屏幕继续 I_SCA_REWARD = RuleImage(roi_front=(584,503,100,100), roi_back=(584,503,100,100), threshold=0.8, method="Template matching", file="./tasks/RichMan/mall/scales/scales_sca_reward.png") # 点击兑换 @@ -297,7 +297,7 @@ class RichManAssets: # 首领御魂剩余可买的 O_SCA_NUMBER_DEMON = RuleOcr(roi=(627,319,30,25), area=(627,319,30,25), mode="Quantity", method="Default", keyword="", name="sca_number_demon") # 永生之海 - O_SCA_NUMBER_SEA = RuleOcr(roi=(926,321,30,23), area=(926,321,30,23), mode="Quantity", method="Default", keyword="", name="sca_number_sea") + O_SCA_NUMBER_SEA = RuleOcr(roi=(920,320,36,22), area=(920,320,36,22), mode="Quantity", method="Default", keyword="", name="sca_number_sea") # 多少号位 O_SCA_DEMON_POSTION = RuleOcr(roi=(960,244,88,41), area=(960,244,88,41), mode="Single", method="Default", keyword="", name="sca_demon_postion") # 朴素的御魂 @@ -305,7 +305,7 @@ class RichManAssets: # 首领御魂数量 O_SCA_RES_DEMON = RuleOcr(roi=(968,11,102,35), area=(968,11,102,35), mode="Digit", method="Default", keyword="", name="sca_res_demon") # 永生之海 - O_SCA_RES_SEA = RuleOcr(roi=(1136,11,88,38), area=(1136,11,88,38), mode="Digit", method="Default", keyword="", name="sca_res_sea") + O_SCA_RES_SEA = RuleOcr(roi=(1134,11,100,38), area=(1134,11,100,38), mode="Digit", method="Default", keyword="", name="sca_res_sea") # Image Rule Assets diff --git a/tasks/RichMan/config.py b/tasks/RichMan/config.py index 205c40cd4..916e1ae6d 100644 --- a/tasks/RichMan/config.py +++ b/tasks/RichMan/config.py @@ -29,6 +29,7 @@ class Scales(BaseModel): demon_class: DemonClass = Field(title='DemonClass', default=DemonClass.TSUCHIGUMO, description='demon_class_help') demon_position: int = Field(title='Demon Position', default=1, description='demon_position_help') picture_book_scrap: int = Field(title='Picture Book Scrap', default=30, description='picture_book_scrap_help') + enable_book_auto: bool = Field(title='Enable Book Auto', default=False, description='enable_book_auto_help') picture_book_rule: str = Field(title='Picture Book Rule', default='auto', description='picture_book_rule_help') diff --git a/tasks/RichMan/mall/scales.py b/tasks/RichMan/mall/scales.py index d1b581331..d48f6179f 100644 --- a/tasks/RichMan/mall/scales.py +++ b/tasks/RichMan/mall/scales.py @@ -340,10 +340,16 @@ def _scales_sea(self, buy_number: int, buy_rule: str='auto'): buy_res_number = buy_number if buy_cycles_number: for i in range(buy_cycles_number): - self._scales_buy_sea_more(self.I_SCA_PICTURE_BOOK) + if self.config.rich_man.scales.enable_book_auto: + self._scales_buy_more(self.I_SCA_PICTURE_BOOK) + else: + self._scales_buy_sea_more(self.I_SCA_PICTURE_BOOK) time.sleep(0.5) if buy_res_number and buy_res_number >= 2: - self._scales_buy_sea_more(self.I_SCA_PICTURE_BOOK, buy_res_number) + if self.config.rich_man.scales.enable_book_auto: + self._scales_buy_more(self.I_SCA_PICTURE_BOOK, buy_res_number) + else: + self._scales_buy_sea_more(self.I_SCA_PICTURE_BOOK, buy_res_number) time.sleep(0.5) diff --git a/tasks/RichMan/mall/scales/image.json b/tasks/RichMan/mall/scales/image.json index f7676b68b..a2eb52003 100644 --- a/tasks/RichMan/mall/scales/image.json +++ b/tasks/RichMan/mall/scales/image.json @@ -111,7 +111,7 @@ "itemName": "sca_six_star", "imageName": "scales_sca_six_star.png", "roiFront": "120,216,97,22", - "roiBack": "113,102,1057,157", + "roiBack": "113,102,1056,257", "method": "Template matching", "threshold": 0.8, "description": "获得的六星" diff --git a/tasks/RichMan/mall/scales/ocr.json b/tasks/RichMan/mall/scales/ocr.json index 7d711b388..dbba87c13 100644 --- a/tasks/RichMan/mall/scales/ocr.json +++ b/tasks/RichMan/mall/scales/ocr.json @@ -19,8 +19,8 @@ }, { "itemName": "sca_number_sea", - "roiFront": "926,321,30,23", - "roiBack": "926,321,30,23", + "roiFront": "920,320,36,22", + "roiBack": "920,320,36,22", "mode": "Quantity", "method": "Default", "keyword": "", @@ -55,8 +55,8 @@ }, { "itemName": "sca_res_sea", - "roiFront": "1136,11,88,38", - "roiBack": "1136,11,88,38", + "roiFront": "1134,11,100,38", + "roiBack": "1134,11,100,38", "mode": "Digit", "method": "Default", "keyword": "", diff --git a/tasks/RichMan/mall/scales/scales_sca_picture_book.png b/tasks/RichMan/mall/scales/scales_sca_picture_book.png index 18588da733743f8ca1cdd360972df93d99d062f7..79bd20ffcdaa6c36a6b5d88517a2101dcbf4ad3c 100644 GIT binary patch literal 13934 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 S`rH4=@Km9ika9({(EkN0A|kZ_ literal 15804 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 Date: Tue, 4 Aug 2026 23:05:56 +0800 Subject: [PATCH 6/8] =?UTF-8?q?feat(RichMan):=20=E5=8D=83=E7=89=A9?= =?UTF-8?q?=E5=AE=9D=E7=AE=B1=E6=96=B0=E5=A2=9E=E5=94=A4=E5=A6=96=E5=80=9F?= =?UTF-8?q?=E5=A4=84=E8=8E=B7=E5=8F=96=E6=A8=B1=E7=81=AF=E9=A5=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - config: 新增 earn_money 配置项控制是否执行借处流程 - thousand_things: 新增 tt_earn_money 方法,实现借出式神并领取500樱灯饰 - assets: 新增 borrow/configure/confirm/shikigami 等图像匹配资源 - i18n: 补充 zh-CN 国际化文案 --- assets/i18n/zh-CN.json | 4 +- tasks/RichMan/assets.py | 12 +++++ tasks/RichMan/config.py | 1 + tasks/RichMan/thousand_things.py | 27 ++++++++++ tasks/RichMan/tt/image.json | 54 +++++++++++++++++++ tasks/RichMan/tt/tt_tt_borrow.png | Bin 0 -> 14665 bytes tasks/RichMan/tt/tt_tt_borrow_confirm.png | Bin 0 -> 6333 bytes tasks/RichMan/tt/tt_tt_configure.png | Bin 0 -> 4376 bytes tasks/RichMan/tt/tt_tt_confirm.png | Bin 0 -> 4314 bytes tasks/RichMan/tt/tt_tt_shikigami.png | Bin 0 -> 712 bytes tasks/RichMan/tt/tt_tt_shikigami_replace.png | Bin 0 -> 2839 bytes 11 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 tasks/RichMan/tt/tt_tt_borrow.png create mode 100644 tasks/RichMan/tt/tt_tt_borrow_confirm.png create mode 100644 tasks/RichMan/tt/tt_tt_configure.png create mode 100644 tasks/RichMan/tt/tt_tt_confirm.png create mode 100644 tasks/RichMan/tt/tt_tt_shikigami.png create mode 100644 tasks/RichMan/tt/tt_tt_shikigami_replace.png diff --git a/assets/i18n/zh-CN.json b/assets/i18n/zh-CN.json index 5b8bb8a93..4124db762 100644 --- a/assets/i18n/zh-CN.json +++ b/assets/i18n/zh-CN.json @@ -45,5 +45,7 @@ "check_true_orochi_enable": "是否在结束后检测真蛇", "check_true_orochi_enable_help": "开启后会在任务结束后检测是否出现真蛇, 若出现则自动拉起真蛇", "enable_book_auto": "自动选择", - "enable_book_auto_help": "游戏内是否开启自动选择御魂" + "enable_book_auto_help": "游戏内是否开启自动选择御魂", + "earn_money": "获取樱灯饰", + "earn_money_help": "通过放置借处式神获取500樱灯饰\n开启前确保已放置借出式神" } diff --git a/tasks/RichMan/assets.py b/tasks/RichMan/assets.py index 5573cf83d..200306870 100644 --- a/tasks/RichMan/assets.py +++ b/tasks/RichMan/assets.py @@ -397,6 +397,18 @@ class RichManAssets: I_TT_BUY_UP = RuleImage(roi_front=(755,427,59,57), roi_back=(740,386,80,146), threshold=0.8, method="Template matching", file="./tasks/RichMan/tt/tt_tt_buy_up.png") # description I_TT_BUY_CONFIRM = RuleImage(roi_front=(584,512,53,53), roi_back=(553,487,169,115), threshold=0.8, method="Template matching", file="./tasks/RichMan/tt/tt_tt_buy_confirm.png") + # 唤妖借处 + I_TT_BORROW = RuleImage(roi_front=(1043,262,39,149), roi_back=(960,169,208,309), threshold=0.8, method="Template matching", file="./tasks/RichMan/tt/tt_tt_borrow.png") + # 配置式神 + I_TT_CONFIGURE = RuleImage(roi_front=(1129,608,42,44), roi_back=(1036,523,240,197), threshold=0.8, method="Template matching", file="./tasks/RichMan/tt/tt_tt_configure.png") + # 确认配置 + I_TT_CONFIRM = RuleImage(roi_front=(1129,608,42,44), roi_back=(1036,523,240,197), threshold=0.8, method="Template matching", file="./tasks/RichMan/tt/tt_tt_confirm.png") + # 选择式神(第四个) + I_TT_SHIKIGAMI = RuleImage(roi_front=(682,257,15,14), roi_back=(652,221,151,148), threshold=0.7, method="Template matching", file="./tasks/RichMan/tt/tt_tt_shikigami.png") + # 替换式神 + I_TT_SHIKIGAMI_REPLACE = RuleImage(roi_front=(755,641,57,19), roi_back=(703,580,148,134), threshold=0.7, method="Template matching", file="./tasks/RichMan/tt/tt_tt_shikigami_replace.png") + # 借出确认 + I_TT_BORROW_CONFIRM = RuleImage(roi_front=(960,508,50,53), roi_back=(886,444,222,194), threshold=0.8, method="Template matching", file="./tasks/RichMan/tt/tt_tt_borrow_confirm.png") # Ocr Rule Assets diff --git a/tasks/RichMan/config.py b/tasks/RichMan/config.py index 916e1ae6d..e6bceb75a 100644 --- a/tasks/RichMan/config.py +++ b/tasks/RichMan/config.py @@ -12,6 +12,7 @@ class ThousandThings(BaseModel): # 千物宝箱 enable: bool = Field(title='Enable', default=False) + earn_money: bool = Field(title='Earn Money', default=False, description='earn_money_help') mystery_amulet: bool = Field(title='Mystery Amulet', default=False) black_daruma_fragment: bool = Field(title='Black Daruma Fragment', default=False) ap: bool = Field(title='AP', default=False, description='ap_help') diff --git a/tasks/RichMan/thousand_things.py b/tasks/RichMan/thousand_things.py index 47c138a3e..03eda4e05 100644 --- a/tasks/RichMan/thousand_things.py +++ b/tasks/RichMan/thousand_things.py @@ -25,6 +25,10 @@ def execute_tt(self, con: ConfigThousandThings) -> None: self.ui_get_current_page() self.ui_goto(page_travel) + if con.earn_money: + logger.info('Start Earn Money') + self.tt_earn_money() + while 1: self.screenshot() if self.appear(self.I_TT_CHECK): @@ -167,6 +171,29 @@ def tt_get_reward(self, image_button): continue return True + def tt_earn_money(self): + + # 进入界面 + self.ui_click(self.I_TT_BORROW, self.I_TT_CONFIGURE) + self.ui_click(self.I_TT_CONFIGURE, self.I_TT_CONFIRM) + #替换式神 + self.ui_click(self.I_TT_SHIKIGAMI, self.I_TT_SHIKIGAMI_REPLACE) + while 1: + self.screenshot() + if not self.appear(self.I_TT_SHIKIGAMI_REPLACE): + break + if self.appear_then_click(self.I_UI_CONFIRM): + continue + if self.appear_then_click(self.I_TT_SHIKIGAMI_REPLACE): + continue + self.ui_click(self.I_TT_CONFIRM, self.I_TT_BORROW_CONFIRM) + + # 获取奖励 + self.ui_get_reward(self.I_TT_BORROW_CONFIRM) + + # 退出界面 + self.ui_click(self.I_UI_BACK_RED, self.I_TT_ENTER) + if __name__ == '__main__': from module.config.config import Config diff --git a/tasks/RichMan/tt/image.json b/tasks/RichMan/tt/image.json index d46438687..3493b47d4 100644 --- a/tasks/RichMan/tt/image.json +++ b/tasks/RichMan/tt/image.json @@ -61,5 +61,59 @@ "method": "Template matching", "threshold": 0.8, "description": "description" + }, + { + "itemName": "tt_borrow", + "imageName": "tt_tt_borrow.png", + "roiFront": "1043,262,39,149", + "roiBack": "960,169,208,309", + "method": "Template matching", + "threshold": 0.8, + "description": "唤妖借处" + }, + { + "itemName": "tt_configure", + "imageName": "tt_tt_configure.png", + "roiFront": "1129,608,42,44", + "roiBack": "1036,523,240,197", + "method": "Template matching", + "threshold": 0.8, + "description": "配置式神" + }, + { + "itemName": "tt_confirm", + "imageName": "tt_tt_confirm.png", + "roiFront": "1129,608,42,44", + "roiBack": "1036,523,240,197", + "method": "Template matching", + "threshold": 0.8, + "description": "确认配置" + }, + { + "itemName": "tt_shikigami", + "imageName": "tt_tt_shikigami.png", + "roiFront": "682,257,15,14", + "roiBack": "652,221,151,148", + "method": "Template matching", + "threshold": 0.7, + "description": "选择式神(第四个)" + }, + { + "itemName": "tt_shikigami_replace", + "imageName": "tt_tt_shikigami_replace.png", + "roiFront": "755,641,57,19", + "roiBack": "703,580,148,134", + "method": "Template matching", + "threshold": 0.7, + "description": "替换式神" + }, + { + "itemName": "tt_borrow_confirm", + "imageName": "tt_tt_borrow_confirm.png", + "roiFront": "960,508,50,53", + "roiBack": "886,444,222,194", + "method": "Template matching", + "threshold": 0.8, + "description": "借出确认" } ] \ No newline at end of file diff --git a/tasks/RichMan/tt/tt_tt_borrow.png b/tasks/RichMan/tt/tt_tt_borrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e63bbd8f93e4f9cc7a24f94a8369c0aae7f08fd2 GIT binary patch literal 14665 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 G3;cg7=Y)&^ literal 0 HcmV?d00001 diff --git a/tasks/RichMan/tt/tt_tt_borrow_confirm.png b/tasks/RichMan/tt/tt_tt_borrow_confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b6cbf0945db1ef51db5b67a660f0a4242e5f2f GIT binary patch literal 6333 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 literal 0 HcmV?d00001 diff --git a/tasks/RichMan/tt/tt_tt_configure.png b/tasks/RichMan/tt/tt_tt_configure.png new file mode 100644 index 0000000000000000000000000000000000000000..00553918af6f3fa3a98050eb5fa8421095bdb6b5 GIT binary patch literal 4376 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 literal 0 HcmV?d00001 diff --git a/tasks/RichMan/tt/tt_tt_shikigami.png b/tasks/RichMan/tt/tt_tt_shikigami.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1f892de1b3a5699825e9f8af26c6aa0f4bab2c GIT binary patch literal 712 zcmWmCNlX(_90u_BX68-XX{S@VP+E2aLaMS=P&5*YgNTWsh@LcJ^rnf+#e<0&H8CEH zcbB+?geZ$E0U~Z}G2%i&L>3`HfEJ1{Egh!qyw>6H|GvvF`7Zz42P?~2#?Al$*ou98 zwbGn&dNrZsRgb$30OD>1@2bhRz?;Nn3{Se$S!vYt0{%G>_AKLCm-c+6uHjRt;bTan z$7hc)b~9Pm5gZ)HLLdfDximGq)!C`2^_$exEoNEKF_#v?*uWT0P9~fVdO^VR%Q(qE zPRz?NKS78&9c=9p;n00s-w=M<5@s2Yl}6+`sI8k&qJ^BC3CWmDPEfnYLzD9n z_o(C^3BhZ}En*P<`YV$Jpb^YSr*;;qoDR*4cmBXCu5xj+p2*Z(WO5$=_$|Tm9Ie%? zO0h8@21rT?dE*AMI8Qq|5t5{6UX~`X8fCSF#j1YXv;q$mv3pAlR+C2XX&nI!Z zD8mrF{Xx4Cr6i#G7D1WXQKVnjXDZEy%guu$QaBttz;gqCR^yE@$wq(a7wuMLHd3A6 z#Vr{sXAXPkffqL2%1(+`)xBIyw4xK$MnRNC2?xcfiK93Z8k-Jl8Ny_w;!WtnjVZYN zp}6y_|6aXkSD{YPbBp1we*Zr~=C^T(CY##)6axFpxPr~hx*mS+eD>DY-YHb^oTA@+ zUVij?(PBhS2jlg|R@Xq19q}b>QJ!{PKfILL+~E@fnBT6i=HnXQ`(AadfLIhjC`Ca* jK70D8Ju{6l$I<7mj8!$pD-hKx9||hUD*5Kp+Ux%T&uJ%e literal 0 HcmV?d00001 diff --git a/tasks/RichMan/tt/tt_tt_shikigami_replace.png b/tasks/RichMan/tt/tt_tt_shikigami_replace.png new file mode 100644 index 0000000000000000000000000000000000000000..da6aa25c3af5534637a2a82f2ca67466994528bf GIT binary patch literal 2839 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 pazl@6X8M%up0mX002ovPDHLkV1kUIZ%6 Date: Thu, 6 Aug 2026 23:18:36 +0800 Subject: [PATCH 7/8] fix(BondlingFairyland): Add loop limit guard in stone purchase to prevent infinite loop #1723 --- tasks/BondlingFairyland/script_task.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tasks/BondlingFairyland/script_task.py b/tasks/BondlingFairyland/script_task.py index 186eb670e..f9c6e58ab 100644 --- a/tasks/BondlingFairyland/script_task.py +++ b/tasks/BondlingFairyland/script_task.py @@ -347,19 +347,24 @@ def run_stone(self, bondling_stone_enable: bool): self.ui_click_until_disappear(self.I_STONE_CLOSE, interval=1.2) logger.warning(f'已经没有鸣契石召唤契灵了') return False + cnt = 0 while 1: self.screenshot() if not self.appear(self.I_STONE_SURE): sleep(random.uniform(1.5, 2)) # 等待购买后的动画, 否则已经买了但是下次再点击还会出现该界面 return True + if cnt >= 6: + logger.warning("") + return False for i in range(3): if self.appear_then_click(self.I_BUY_PLUS, interval=1): sleep(0.5) if self.appear_then_click(self.I_GI_SURE, interval=1): continue - if self.appear_then_click(self.I_STONE_SURE, interval=1): + if self.appear_then_click(self.I_STONE_SURE, interval=2): continue + def run_search(self, bondling_config: BondlingConfig, limit_cnt: int = None): """ 运行探查 From 02fe012f1037bb1118852a5add4551c536e05809 Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Fri, 7 Aug 2026 21:32:46 +0800 Subject: [PATCH 8/8] fix(FallenSun): Rewrite battle_wait with v2 and add yellow back button for exiting team --- .../Component/GeneralBattle/general_battle.py | 57 ++++ tasks/FallenSun/script_task.py | 310 +++++++++--------- 2 files changed, 214 insertions(+), 153 deletions(-) diff --git a/tasks/Component/GeneralBattle/general_battle.py b/tasks/Component/GeneralBattle/general_battle.py index 442857e38..1b6af406d 100644 --- a/tasks/Component/GeneralBattle/general_battle.py +++ b/tasks/Component/GeneralBattle/general_battle.py @@ -253,6 +253,63 @@ def battle_wait(self, random_click_swipt_enable: bool) -> bool: return win + def battle_wait_v2(self, random_click_swipt_enable: bool) -> bool: + """ + 第二版战斗等待,参考 Orochi 和 Secret 的优化版本。 + :return: 胜利返回 True,失败返回 False + """ + # 统一点击名称,防止 GameTooManyClickError 误报 + self.C_REWARD_1.name, self.C_REWARD_2.name, self.C_REWARD_3.name = 'C_REWARD', 'C_REWARD', 'C_REWARD' + self.device.stuck_record_add('BATTLE_STATUS_S') + self.device.click_record_clear() + + logger.info("Start battle process") + while 1: + self.screenshot() + # 出现赢的鼓,点击直到消失 + if self.appear_then_click(self.I_WIN, interval=0.8): + continue + # 逢魔胜利图 + if self.appear(self.I_DE_WIN): + self.ui_click_until_disappear(self.I_DE_WIN) + continue + if self.appear(self.I_FALSE, threshold=0.8): + logger.warning('False battle') + self.ui_click_until_disappear(self.I_FALSE) + return False + appear_ghost, appear_reward, appear_gold = ( + self.appear(self.I_GREED_GHOST), + self.appear(self.I_REWARD), + self.appear(self.I_REWARD_GOLD) + ) + if appear_ghost or appear_reward or appear_gold: + logger.info('Win battle') + timer = Timer(20).start() + while 1: + self.screenshot() + + _appear_ghost, _appear_reward, _appear_gold = ( + self.appear(self.I_GREED_GHOST, threshold=0.6), + self.appear(self.I_REWARD), + self.appear(self.I_REWARD_GOLD) + ) + # logger.info(f'_appear_ghost: {_appear_ghost} _appear_reward: {_appear_reward} _appear_gold: {_appear_gold}') + if any([_appear_ghost, _appear_reward, _appear_gold]): + action_click = random.choice([self.C_REWARD_1, self.C_REWARD_2, self.C_REWARD_3]) + self.click(action_click, interval=1.5) + else: + logger.info('Battle done') + return True + if self._hook_special_reward(): + continue + if timer.reached_and_reset(): + logger.warning('battle ') + break + # 随机滑动 + if random_click_swipt_enable: + self.random_click_swipt() + return False + def _hook_special_reward(self) -> bool: """ For overwrite https://github.com/runhey/OnmyojiAutoScript/issues/1580 diff --git a/tasks/FallenSun/script_task.py b/tasks/FallenSun/script_task.py index e689abf65..ab78e4920 100644 --- a/tasks/FallenSun/script_task.py +++ b/tasks/FallenSun/script_task.py @@ -292,7 +292,9 @@ def is_in_fallen_sun(screenshot=False) -> bool: self.screenshot() if not self.appear(self.I_FORM_TEAM): break - if self.appear_then_click(self.I_BACK_BL, interval=1): + if self.appear_then_click(self.I_BACK_BL, interval=2): + continue + if self.appear_then_click(self.I_UI_BACK_YELLOW, interval=2): continue self.ui_current = page_soul_zones @@ -302,159 +304,161 @@ def run_wild(self): logger.error('Wild mode is not implemented') pass + # def battle_wait(self, random_click_swipt_enable: bool) -> bool: + # """ + # 重写战斗等待 + # # https://github.com/runhey/OnmyojiAutoScript/issues/95 + # :param random_click_swipt_enable: + # :return: + # """ + # """ + # # 重写 + # self.device.stuck_record_add('BATTLE_STATUS_S') + # self.device.click_record_clear() + # self.C_REWARD_1.name = 'C_REWARD' + # self.C_REWARD_2.name = 'C_REWARD' + # self.C_REWARD_3.name = 'C_REWARD' + # # 战斗过程 随机点击和滑动 防封 + # logger.info("Start battle process") + # while 1: + # self.screenshot() + # action_click = random.choice([self.C_WIN_1, self.C_WIN_2, self.C_WIN_3]) + # if self.appear_then_click(self.I_WIN, action=action_click ,interval=0.8): + # # 赢的那个鼓 + # continue + # if self.appear(self.I_GREED_GHOST): + # # 贪吃鬼 + # logger.info('Win battle') + # self.wait_until_appear(self.I_REWARD, wait_time=1.5) + # self.screenshot() + # if not self.appear(self.I_GREED_GHOST): + # logger.warning('Greedy ghost disappear. Maybe it is a false battle') + # continue + # while 1: + # self.screenshot() + # action_click = random.choice([self.C_REWARD_1, self.C_REWARD_2, self.C_REWARD_3]) + # if not self.appear(self.I_GREED_GHOST): + # break + # if self.click(action_click, interval=1.5): + # continue + # return True + # if self.appear(self.I_REWARD): + # # 魂 + # logger.info('Win battle') + # while 1: + # self.screenshot() + # action_click = random.choice([self.C_REWARD_1, self.C_REWARD_2, self.C_REWARD_3]) + # if self.appear_then_click(self.I_REWARD, action=action_click, interval=1.5): + # continue + # if not self.appear(self.I_REWARD): + # break + # return True + # + # if self.appear(self.I_FALSE): + # logger.warning('False battle') + # self.ui_click_until_disappear(self.I_FALSE) + # return False + # + # # 如果开启战斗过程随机滑动 + # if random_click_swipt_enable: + # self.random_click_swipt() + # """ + # """ + # 等待战斗结束 !!! + # 很重要 这个函数是原先写的, 优化版本在tasks/Secret/script_task下。本着不改动原先的代码的原则,所以就不改了 + # :param random_click_swipt_enable: + # :return: + # """ + # # 有的时候是长战斗,需要在设置stuck检测为长战斗 + # # 但是无需取消设置,因为如果有点击或者滑动的话 handle_control_check会自行取消掉 + # self.device.stuck_record_add('BATTLE_STATUS_S') + # self.device.click_record_clear() + # # 战斗过程 随机点击和滑动 防封 + # logger.info("Start battle process") + # win: bool = False + # while 1: + # self.screenshot() + # # 如果出现赢 就点击, 第二个是针对封魔的图片 + # if self.appear(self.I_WIN, threshold=0.8) or self.appear(self.I_DE_WIN): + # logger.info("Battle result is win") + # if self.appear(self.I_DE_WIN): + # self.ui_click_until_disappear(self.I_DE_WIN) + # win = True + # break + # + # # 如果出现失败 就点击,返回False + # if self.appear(self.I_FALSE, threshold=0.8): + # logger.info("Battle result is false") + # win = False + # break + # + # # 如果领奖励 + # if self.appear(self.I_REWARD, threshold=0.6): + # win = True + # break + # + # # 如果领奖励出现金币 + # if self.appear(self.I_REWARD_GOLD, threshold=0.8): + # win = True + # break + # if self.appear(self.I_REWARD_PURPLE_SNAKE_SKIN, threshold=0.8): + # win = True + # break + # # 如果开启战斗过程随机滑动 + # if random_click_swipt_enable: + # self.random_click_swipt() + # + # # 再次确认战斗结果 + # logger.info("Reconfirm the results of the battle") + # while 1: + # self.screenshot() + # if win: + # # 点击赢了 + # action_click = random.choice([self.C_WIN_1, self.C_WIN_2, self.C_WIN_3]) + # if self.appear_then_click(self.I_WIN, action=action_click, interval=0.5): + # continue + # if not self.appear(self.I_WIN): + # break + # else: + # # 如果失败且 点击失败后 + # if self.appear_then_click(self.I_FALSE, threshold=0.6): + # continue + # if not self.appear(self.I_FALSE, threshold=0.6): + # return False + # # 最后保证能点击 获得奖励 + # if not self.wait_until_appear(self.I_REWARD): + # # 有些的战斗没有下面的奖励,所以直接返回 + # logger.info("There is no reward, Exit battle") + # return win + # logger.info("Get reward") + # while 1: + # self.screenshot() + # # 如果出现领奖励 + # action_click = random.choice([self.C_REWARD_1, self.C_REWARD_2, self.C_REWARD_3]) + # if (self.appear_then_click(self.I_REWARD, action=action_click, interval=1.5) or + # self.appear_then_click(self.I_REWARD_GOLD, action=action_click, interval=1.5) or + # # self.appear_then_click(self.I_REWARD_STATISTICS, action=action_click, interval=1.5) or + # self.appear_then_click(self.I_REWARD_PURPLE_SNAKE_SKIN, action=action_click, interval=1.5) #or + # # self.appear_then_click(self.I_REWARD_GOLD_SNAKE_SKIN, action=action_click, interval=1.5) or + # # self.appear_then_click(self.I_REWARD_EXP_SOUL_4, action=action_click, interval=1.5) or + # # self.appear_then_click(self.I_REWARD_SOUL_5, action=action_click, interval=1.5) or + # # self.appear_then_click(self.I_REWARD_SOUL_6, action=action_click, interval=1.5) + # ): + # continue + # if (not self.appear(self.I_REWARD) and + # not self.appear(self.I_REWARD_GOLD) and + # # not self.appear(self.I_REWARD_STATISTICS) and + # not self.appear(self.I_REWARD_PURPLE_SNAKE_SKIN) #and + # # not self.appear(self.I_REWARD_GOLD_SNAKE_SKIN) and + # # not self.appear(self.I_REWARD_EXP_SOUL_4) and + # # not self.appear(self.I_REWARD_SOUL_5) and + # # not self.appear(self.I_REWARD_SOUL_6) + # ): + # break + # + # return win def battle_wait(self, random_click_swipt_enable: bool) -> bool: - """ - 重写战斗等待 - # https://github.com/runhey/OnmyojiAutoScript/issues/95 - :param random_click_swipt_enable: - :return: - """ - """ - # 重写 - self.device.stuck_record_add('BATTLE_STATUS_S') - self.device.click_record_clear() - self.C_REWARD_1.name = 'C_REWARD' - self.C_REWARD_2.name = 'C_REWARD' - self.C_REWARD_3.name = 'C_REWARD' - # 战斗过程 随机点击和滑动 防封 - logger.info("Start battle process") - while 1: - self.screenshot() - action_click = random.choice([self.C_WIN_1, self.C_WIN_2, self.C_WIN_3]) - if self.appear_then_click(self.I_WIN, action=action_click ,interval=0.8): - # 赢的那个鼓 - continue - if self.appear(self.I_GREED_GHOST): - # 贪吃鬼 - logger.info('Win battle') - self.wait_until_appear(self.I_REWARD, wait_time=1.5) - self.screenshot() - if not self.appear(self.I_GREED_GHOST): - logger.warning('Greedy ghost disappear. Maybe it is a false battle') - continue - while 1: - self.screenshot() - action_click = random.choice([self.C_REWARD_1, self.C_REWARD_2, self.C_REWARD_3]) - if not self.appear(self.I_GREED_GHOST): - break - if self.click(action_click, interval=1.5): - continue - return True - if self.appear(self.I_REWARD): - # 魂 - logger.info('Win battle') - while 1: - self.screenshot() - action_click = random.choice([self.C_REWARD_1, self.C_REWARD_2, self.C_REWARD_3]) - if self.appear_then_click(self.I_REWARD, action=action_click, interval=1.5): - continue - if not self.appear(self.I_REWARD): - break - return True - - if self.appear(self.I_FALSE): - logger.warning('False battle') - self.ui_click_until_disappear(self.I_FALSE) - return False - - # 如果开启战斗过程随机滑动 - if random_click_swipt_enable: - self.random_click_swipt() - """ - """ - 等待战斗结束 !!! - 很重要 这个函数是原先写的, 优化版本在tasks/Secret/script_task下。本着不改动原先的代码的原则,所以就不改了 - :param random_click_swipt_enable: - :return: - """ - # 有的时候是长战斗,需要在设置stuck检测为长战斗 - # 但是无需取消设置,因为如果有点击或者滑动的话 handle_control_check会自行取消掉 - self.device.stuck_record_add('BATTLE_STATUS_S') - self.device.click_record_clear() - # 战斗过程 随机点击和滑动 防封 - logger.info("Start battle process") - win: bool = False - while 1: - self.screenshot() - # 如果出现赢 就点击, 第二个是针对封魔的图片 - if self.appear(self.I_WIN, threshold=0.8) or self.appear(self.I_DE_WIN): - logger.info("Battle result is win") - if self.appear(self.I_DE_WIN): - self.ui_click_until_disappear(self.I_DE_WIN) - win = True - break - - # 如果出现失败 就点击,返回False - if self.appear(self.I_FALSE, threshold=0.8): - logger.info("Battle result is false") - win = False - break - - # 如果领奖励 - if self.appear(self.I_REWARD, threshold=0.6): - win = True - break - - # 如果领奖励出现金币 - if self.appear(self.I_REWARD_GOLD, threshold=0.8): - win = True - break - if self.appear(self.I_REWARD_PURPLE_SNAKE_SKIN, threshold=0.8): - win = True - break - # 如果开启战斗过程随机滑动 - if random_click_swipt_enable: - self.random_click_swipt() - - # 再次确认战斗结果 - logger.info("Reconfirm the results of the battle") - while 1: - self.screenshot() - if win: - # 点击赢了 - action_click = random.choice([self.C_WIN_1, self.C_WIN_2, self.C_WIN_3]) - if self.appear_then_click(self.I_WIN, action=action_click, interval=0.5): - continue - if not self.appear(self.I_WIN): - break - else: - # 如果失败且 点击失败后 - if self.appear_then_click(self.I_FALSE, threshold=0.6): - continue - if not self.appear(self.I_FALSE, threshold=0.6): - return False - # 最后保证能点击 获得奖励 - if not self.wait_until_appear(self.I_REWARD): - # 有些的战斗没有下面的奖励,所以直接返回 - logger.info("There is no reward, Exit battle") - return win - logger.info("Get reward") - while 1: - self.screenshot() - # 如果出现领奖励 - action_click = random.choice([self.C_REWARD_1, self.C_REWARD_2, self.C_REWARD_3]) - if (self.appear_then_click(self.I_REWARD, action=action_click, interval=1.5) or - self.appear_then_click(self.I_REWARD_GOLD, action=action_click, interval=1.5) or - # self.appear_then_click(self.I_REWARD_STATISTICS, action=action_click, interval=1.5) or - self.appear_then_click(self.I_REWARD_PURPLE_SNAKE_SKIN, action=action_click, interval=1.5) #or - # self.appear_then_click(self.I_REWARD_GOLD_SNAKE_SKIN, action=action_click, interval=1.5) or - # self.appear_then_click(self.I_REWARD_EXP_SOUL_4, action=action_click, interval=1.5) or - # self.appear_then_click(self.I_REWARD_SOUL_5, action=action_click, interval=1.5) or - # self.appear_then_click(self.I_REWARD_SOUL_6, action=action_click, interval=1.5) - ): - continue - if (not self.appear(self.I_REWARD) and - not self.appear(self.I_REWARD_GOLD) and - # not self.appear(self.I_REWARD_STATISTICS) and - not self.appear(self.I_REWARD_PURPLE_SNAKE_SKIN) #and - # not self.appear(self.I_REWARD_GOLD_SNAKE_SKIN) and - # not self.appear(self.I_REWARD_EXP_SOUL_4) and - # not self.appear(self.I_REWARD_SOUL_5) and - # not self.appear(self.I_REWARD_SOUL_6) - ): - break - - return win + return self.battle_wait_v2(random_click_swipt_enable=random_click_swipt_enable) if __name__ == '__main__':