From 419f2ed6d583c459e76ceebf06dad51103e5c228 Mon Sep 17 00:00:00 2001 From: hephooey Date: Mon, 27 Jan 2025 04:56:45 -0500 Subject: [PATCH 01/56] [TW] Event: Spring Fashion Festa (#4539) --- assets/tw/raid/CHIENWU_RAID_EASY.png | Bin 0 -> 4862 bytes assets/tw/raid/CHIENWU_RAID_HARD.png | Bin 0 -> 4980 bytes assets/tw/raid/CHIENWU_RAID_NORMAL.png | Bin 0 -> 4845 bytes campaign/Readme.md | 1 + module/config/argument/args.json | 6 ++---- module/config/i18n/zh-TW.json | 2 +- module/raid/assets.py | 6 +++--- 7 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 assets/tw/raid/CHIENWU_RAID_EASY.png create mode 100644 assets/tw/raid/CHIENWU_RAID_HARD.png create mode 100644 assets/tw/raid/CHIENWU_RAID_NORMAL.png diff --git a/assets/tw/raid/CHIENWU_RAID_EASY.png b/assets/tw/raid/CHIENWU_RAID_EASY.png new file mode 100644 index 0000000000000000000000000000000000000000..e66eda64342b784a0aa32dabd5d6874f8f1125f2 GIT binary patch literal 4862 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 z Date: Mon, 27 Jan 2025 17:57:07 +0800 Subject: [PATCH 02/56] upd: [JP] OCR_REMAIN in daily (#4533) --- module/daily/daily.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/daily/daily.py b/module/daily/daily.py index 241558f6c..6d8f3c03d 100644 --- a/module/daily/daily.py +++ b/module/daily/daily.py @@ -1,5 +1,6 @@ import numpy as np +import module.config.server as server from module.base.utils import get_color from module.combat.assets import BATTLE_PREPARATION from module.combat.combat import Combat @@ -11,7 +12,10 @@ from module.ui.assets import BACK_ARROW, DAILY_CHECK from module.ui.page import page_campaign_menu, page_daily DAILY_MISSION_LIST = [DAILY_MISSION_1, DAILY_MISSION_2, DAILY_MISSION_3] -OCR_REMAIN = Digit(OCR_REMAIN, threshold=128, alphabet='01234') +if server.server != 'jp': + OCR_REMAIN = Digit(OCR_REMAIN, threshold=128, alphabet='01234') +else: + OCR_REMAIN = Digit(OCR_REMAIN, letter=(222, 223, 222), threshold=128, alphabet='01234') OCR_DAILY_FLEET_INDEX = Digit(OCR_DAILY_FLEET_INDEX, letter=(90, 154, 255), threshold=128, alphabet='123456') From 3dc3e7682b836a2170fcc3258004326ed204fdb2 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 31 Jan 2025 03:18:56 +0800 Subject: [PATCH 03/56] Fix: [ALAS] netcat loopback address on BlueStacks Air --- module/device/connection.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/module/device/connection.py b/module/device/connection.py index cbe709598..74a79ddaf 100644 --- a/module/device/connection.py +++ b/module/device/connection.py @@ -308,6 +308,23 @@ class Connection(ConnectionAttr): logger.attr('ro.product.brand', res) return 'waydroid' in res.lower() + @cached_property + @retry + def is_bluestacks_air(self): + # BlueStacks Air is the Mac version of BlueStacks + if not IS_MACINTOSH: + return False + if not self.is_ldplayer_bluestacks_family: + return False + # [bst.installed_images]: [Tiramisu64] + # [bst.instance]: [Tiramisu64] + # Tiramisu64 is Android 13 and BlueStacks Air is the only BlueStacks version that uses Android 13 + res = self.adb_getprop('bst.installed_images') + logger.attr('bst.installed_images', res) + if 'Tiramisu64' in res: + return True + return False + @cached_property @retry def nemud_app_keep_alive(self) -> str: @@ -401,11 +418,13 @@ class Connection(ConnectionAttr): host = '127.0.0.1' if IS_LINUX and host == '127.0.1.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}') port = random_port(self.config.FORWARD_PORT_RANGE) # For AVD instance - if self.is_avd: + if self.is_avd or self.is_bluestacks_air: return host, port, "10.0.2.2", port return host, port, host, port From 710994f751404cde7c67a112d1bd170306c4f54b Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Mon, 3 Feb 2025 22:52:57 +0800 Subject: [PATCH 04/56] Fix: guild operations should start based on server time instead of local time (#4548) --- module/config/utils.py | 11 +++++++++++ module/guild/operations.py | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/module/config/utils.py b/module/config/utils.py index 60e07c4cc..07bcd3234 100644 --- a/module/config/utils.py +++ b/module/config/utils.py @@ -603,6 +603,17 @@ def get_server_weekday(): return result +def get_server_monthday(): + """ + Returns: + int: The server's current day of the month + """ + diff = server_time_offset() + server_now = datetime.now() - diff + result = server_now.day + return result + + def random_id(length=32): """ Args: diff --git a/module/guild/operations.py b/module/guild/operations.py index 3ec99c92a..b5ab5043e 100644 --- a/module/guild/operations.py +++ b/module/guild/operations.py @@ -3,6 +3,7 @@ from datetime import datetime from module.base.button import ButtonGrid from module.base.timer import Timer from module.base.utils import * +from module.config.utils import get_server_monthday from module.exception import GameBugError from module.guild.assets import * from module.guild.base import GuildBase @@ -89,7 +90,7 @@ class GuildOperations(GuildBase): if not self.config.GuildOperation_SelectNewOperation: return False - today = datetime.now().day + today = get_server_monthday() limit = self.config.GuildOperation_NewOperationMaxDate if today >= limit: logger.info(f'No new guild operations because, today\'s date {today} >= limit {limit}') From 09b6bc179b94d8a0f9ef226c4fd060ea8db21cc4 Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Mon, 3 Feb 2025 22:53:24 +0800 Subject: [PATCH 05/56] Upd: [JP] ash_collect_status (#4554) --- assets/jp/os_ash/ASH_DAILY_STATUS.png | Bin 8124 -> 9865 bytes module/os_ash/ash.py | 16 ++++------------ module/os_ash/assets.py | 2 +- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/assets/jp/os_ash/ASH_DAILY_STATUS.png b/assets/jp/os_ash/ASH_DAILY_STATUS.png index 5772d9e18f4e0b2c8b58602d8ebc45803bcf6f0a..c19ff32400db1facd3e33cbfe2995cadfe9be17d 100644 GIT binary patch literal 9865 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 Date: Mon, 3 Feb 2025 23:19:04 +0800 Subject: [PATCH 06/56] Fix: Empty project duration in research_jp_detect (fixed #4528) --- module/research/project.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/module/research/project.py b/module/research/project.py index 7b11291ed..d6144d9d8 100644 --- a/module/research/project.py +++ b/module/research/project.py @@ -4,6 +4,7 @@ from scipy import signal from module.base.decorator import cached_property from module.base.utils import * +from module.device.method.utils import remove_suffix from module.logger import logger from module.ocr.ocr import Duration, Ocr from module.research.assets import * @@ -363,7 +364,9 @@ def research_jp_detect(image): """ project = ResearchProjectJp() project.series = get_research_series_jp(image) - project.duration = str(get_research_duration_jp(image) / 3600).rstrip('.0') + project.duration = remove_suffix(str(get_research_duration_jp(image) / 3600), '.0') + if project.duration == '': + project.duration = '0' project.genre = get_research_genre_jp(image) costs = get_research_cost_jp(image) for cost in costs: From 4cd0261fcdfceab3db8c820a4bb8b7ef6dc687b4 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 3 Feb 2025 23:39:21 +0800 Subject: [PATCH 07/56] Fix: Subpress EXP_INFO_B in Abyssal Refrain (event_20220224_cn) (#4537) --- campaign/event_20220224_cn/campaign_base.py | 7 +++++++ campaign/war_archives_20220224_cn/campaign_base.py | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/campaign/event_20220224_cn/campaign_base.py b/campaign/event_20220224_cn/campaign_base.py index f96d2f7bf..c874590eb 100644 --- a/campaign/event_20220224_cn/campaign_base.py +++ b/campaign/event_20220224_cn/campaign_base.py @@ -1,4 +1,5 @@ from module.campaign.campaign_base import CampaignBase as CampaignBase_ +from module.ui.page import page_event class CampaignBase(CampaignBase_): @@ -6,3 +7,9 @@ class CampaignBase(CampaignBase_): if super().handle_clear_mode_config_cover(): self.config.MAP_SIREN_TEMPLATE = ['SS'] self.config.MAP_HAS_SIREN = True + + def handle_exp_info(self): + # Random background hits EXP_INFO_B + if self.ui_page_appear(page_event): + return False + return super().handle_exp_info() diff --git a/campaign/war_archives_20220224_cn/campaign_base.py b/campaign/war_archives_20220224_cn/campaign_base.py index 2eff6aa49..b8b32ebb9 100644 --- a/campaign/war_archives_20220224_cn/campaign_base.py +++ b/campaign/war_archives_20220224_cn/campaign_base.py @@ -1,3 +1,4 @@ +from module.ui.page import page_event from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_ @@ -6,3 +7,9 @@ class CampaignBase(CampaignBase_): if super().handle_clear_mode_config_cover(): self.config.MAP_SIREN_TEMPLATE = ['SS'] self.config.MAP_HAS_SIREN = True + + def handle_exp_info(self): + # Random background hits EXP_INFO_B + if self.ui_page_appear(page_event): + return False + return super().handle_exp_info() From 463e5ff187d74c448abc83f915a935dbfdc8b38a Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 3 Feb 2025 23:42:34 +0800 Subject: [PATCH 08/56] Chore: [ALAS] Prefer MaaTouch if both minitouch and MaaTouch are fastest --- module/daemon/benchmark.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/module/daemon/benchmark.py b/module/daemon/benchmark.py index cce5e37a2..9283381d8 100644 --- a/module/daemon/benchmark.py +++ b/module/daemon/benchmark.py @@ -165,6 +165,9 @@ class Benchmark(DaemonBase, CampaignUI): if click_result: self.show(test='Control', data=click_result, evaluate_func=self.evaluate_click) fastest = sorted(click_result, key=lambda item: compare(item))[0] + # Prefer MaaTouch if both minitouch and MaaTouch are fastest + if 'MaaTouch' in click and fastest[0] == 'minitouch': + fastest[0] = 'MaaTouch' logger.info(f'Recommend control method: {fastest[0]} ({float2str(fastest[1])})') fastest_click = fastest[0] @@ -174,7 +177,7 @@ class Benchmark(DaemonBase, CampaignUI): device = self.config.Benchmark_DeviceType # device == 'emulator' screenshot = ['ADB', 'ADB_nc', 'uiautomator2', 'aScreenCap', 'aScreenCap_nc', 'DroidCast', 'DroidCast_raw'] - click = ['ADB', 'uiautomator2', 'minitouch'] + click = ['ADB', 'uiautomator2', 'minitouch', 'MaaTouch'] def remove(*args): return [l for l in screenshot if l not in args] From e5ff2dddbd855413917f53ccd7801fe4981db9a2 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 4 Feb 2025 01:14:52 +0800 Subject: [PATCH 09/56] Fix: [ALAS] Remove DroidCast testing on BlueStacks Air --- module/daemon/benchmark.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/daemon/benchmark.py b/module/daemon/benchmark.py index 9283381d8..9bc3d6c0b 100644 --- a/module/daemon/benchmark.py +++ b/module/daemon/benchmark.py @@ -198,6 +198,8 @@ class Benchmark(DaemonBase, CampaignUI): screenshot.append('nemu_ipc') if self.device.ldopengl_available(): screenshot.append('ldopengl') + if self.device.is_bluestacks_air: + screenshot = [l for l in screenshot if 'DroidCast' not in l] scene = self.config.Benchmark_TestScene if 'screenshot' not in scene: From c3464e52b1ae67aae5616a1f724de4a5047dad75 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 4 Feb 2025 01:26:14 +0800 Subject: [PATCH 10/56] Make some random changes to fix error: unable to read sha1 file of module/os_ash/ash.py (aeee4e621dd77abc9ccb9024a053101b23d68dea) --- module/os_ash/ash.py | 1 - 1 file changed, 1 deletion(-) diff --git a/module/os_ash/ash.py b/module/os_ash/ash.py index aeee4e621..52ebdfe5d 100644 --- a/module/os_ash/ash.py +++ b/module/os_ash/ash.py @@ -76,7 +76,6 @@ class AshCombat(Combat): class OSAsh(UI, MapEventHandler): - _ash_fully_collected = False def ash_collect_status(self): From b8dbed59f6ccac1b5d41f64f048cf173befe1a59 Mon Sep 17 00:00:00 2001 From: zhenghan123 <61129862+zhenghan123@users.noreply.github.com> Date: Thu, 6 Feb 2025 22:25:17 +0800 Subject: [PATCH 11/56] Add: event entrance for rerun event 20250206 (#4564) * Update Readme.md * Update args.json * Update zh-CN.json * Update args.json * Update ja-JP.json * Update en-US.json * Update Readme.md * Update Readme.md * Update en-US.json --- campaign/Readme.md | 2 +- module/config/argument/args.json | 66 ++++++++++++++++---------------- module/config/i18n/en-US.json | 4 +- module/config/i18n/ja-JP.json | 4 +- module/config/i18n/zh-CN.json | 4 +- 5 files changed, 40 insertions(+), 40 deletions(-) diff --git a/campaign/Readme.md b/campaign/Readme.md index 84f76acb7..e8a0415a4 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -229,4 +229,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250102 | raid 20240130 | Spring Festive Fiasco | - | - | - | 寰昌宇定家事忙 | | 20250109 | event 20221222 cn | Parallel Superimposition Rerun | 复刻定向折叠 | Parallel Superimposition Rerun | 積重なる事象の幻界(復刻) | - | | 20250116 | raid 20250116 | Spring Fashion Festa | 华裳巧展喜事长 | Spring Fashion Festa | 新春華裳協奏曲 | - | -| 20250123 | raid 20250116 | Spring Fashion Festa | - | - | - | 華裳巧展喜事長 | +| 20250206 | event 20220818 cn | Operation Convergence Rerun | 复刻远汇点作战 | Operation Convergence Return | 結像点作戦(復刻) | - diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 3d97fe8ca..6fcbc194c 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1715,12 +1715,12 @@ ], "display": "hide", "option_bold": [ - "event_20221222_cn", + "event_20220818_cn", "event_20231221_cn" ], - "cn": "event_20221222_cn", - "en": "event_20221222_cn", - "jp": "event_20221222_cn", + "cn": "event_20220818_cn", + "en": "event_20220818_cn", + "jp": "event_20220818_cn", "tw": "event_20231221_cn" }, "Mode": { @@ -2057,12 +2057,12 @@ "event_20241219_cn" ], "option_bold": [ - "event_20221222_cn", + "event_20220818_cn", "event_20231221_cn" ], - "cn": "event_20221222_cn", - "en": "event_20221222_cn", - "jp": "event_20221222_cn", + "cn": "event_20220818_cn", + "en": "event_20220818_cn", + "jp": "event_20220818_cn", "tw": "event_20231221_cn" }, "Mode": { @@ -2514,12 +2514,12 @@ "event_20241219_cn" ], "option_bold": [ - "event_20221222_cn", + "event_20220818_cn", "event_20231221_cn" ], - "cn": "event_20221222_cn", - "en": "event_20221222_cn", - "jp": "event_20221222_cn", + "cn": "event_20220818_cn", + "en": "event_20220818_cn", + "jp": "event_20220818_cn", "tw": "event_20231221_cn" }, "Mode": { @@ -3935,12 +3935,12 @@ "event_20241219_cn" ], "option_bold": [ - "event_20221222_cn", + "event_20220818_cn", "event_20231221_cn" ], - "cn": "event_20221222_cn", - "en": "event_20221222_cn", - "jp": "event_20221222_cn", + "cn": "event_20220818_cn", + "en": "event_20220818_cn", + "jp": "event_20220818_cn", "tw": "event_20231221_cn" }, "Mode": { @@ -4409,12 +4409,12 @@ "event_20241219_cn" ], "option_bold": [ - "event_20221222_cn", + "event_20220818_cn", "event_20231221_cn" ], - "cn": "event_20221222_cn", - "en": "event_20221222_cn", - "jp": "event_20221222_cn", + "cn": "event_20220818_cn", + "en": "event_20220818_cn", + "jp": "event_20220818_cn", "tw": "event_20231221_cn" }, "Mode": { @@ -4883,12 +4883,12 @@ "event_20241219_cn" ], "option_bold": [ - "event_20221222_cn", + "event_20220818_cn", "event_20231221_cn" ], - "cn": "event_20221222_cn", - "en": "event_20221222_cn", - "jp": "event_20221222_cn", + "cn": "event_20220818_cn", + "en": "event_20220818_cn", + "jp": "event_20220818_cn", "tw": "event_20231221_cn" }, "Mode": { @@ -5357,12 +5357,12 @@ "event_20241219_cn" ], "option_bold": [ - "event_20221222_cn", + "event_20220818_cn", "event_20231221_cn" ], - "cn": "event_20221222_cn", - "en": "event_20221222_cn", - "jp": "event_20221222_cn", + "cn": "event_20220818_cn", + "en": "event_20220818_cn", + "jp": "event_20220818_cn", "tw": "event_20231221_cn" }, "Mode": { @@ -5821,12 +5821,12 @@ "event_20241219_cn" ], "option_bold": [ - "event_20221222_cn", + "event_20220818_cn", "event_20231221_cn" ], - "cn": "event_20221222_cn", - "en": "event_20221222_cn", - "jp": "event_20221222_cn", + "cn": "event_20220818_cn", + "en": "event_20220818_cn", + "jp": "event_20220818_cn", "tw": "event_20231221_cn" }, "Mode": { @@ -9335,4 +9335,4 @@ } } } -} \ No newline at end of file +} diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 02da10147..7b5e7d4aa 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -717,7 +717,7 @@ "event_20220428_cn": "Rondo at Rainbows End Rerun", "event_20220526_cn": "Pledge of the Radiant Court Rerun", "event_20220728_cn": "Aquilifers Ballade Rerun", - "event_20220818_cn": "Operation Convergence", + "event_20220818_cn": "Operation Convergence Return", "event_20220915_cn": "Violet Tempest Blooming Lycoris Rerun", "event_20221124_cn": "The Alchemist and the Archipelago of Secrets", "event_20221222_cn": "Parallel Superimposition Rerun", @@ -2657,4 +2657,4 @@ "ChooseFile": "Choose file" } } -} \ No newline at end of file +} diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index d5dc3f2f9..4ca44b515 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -717,7 +717,7 @@ "event_20220428_cn": "吟ずる瑠璃の楽章(復刻)", "event_20220526_cn": "復刻诚閃の剣 搖光の城", "event_20220728_cn": "鋼鷲の冒険譚(復刻)", - "event_20220818_cn": "結像点作戦", + "event_20220818_cn": "結像点作戦(復刻)", "event_20220915_cn": "赫の涙月 菫の暁風(復刻)", "event_20221124_cn": "錬金術士と謎の遺跡群島", "event_20221222_cn": "積重なる事象の幻界(復刻)", @@ -2657,4 +2657,4 @@ "ChooseFile": "ファイルを選択してください" } } -} \ No newline at end of file +} diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 7991b0ad3..b1383bc70 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -717,7 +717,7 @@ "event_20220428_cn": "复刻虹彩的终幕曲", "event_20220526_cn": "复刻泠誓光庭", "event_20220728_cn": "复刻雄鹰的叙事歌", - "event_20220818_cn": "远汇点作战", + "event_20220818_cn": "复刻远汇点作战", "event_20220915_cn": "复刻紫绛槿岚", "event_20221124_cn": "炼金术士与秘密遗迹群岛", "event_20221222_cn": "复刻定向折叠", @@ -2657,4 +2657,4 @@ "ChooseFile": "选择文件" } } -} \ No newline at end of file +} From 7627b91549f55f1b17c0c591e568e51701624dae Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 6 Feb 2025 22:34:38 +0800 Subject: [PATCH 12/56] Upd: Config update --- campaign/Readme.md | 3 ++- module/config/argument/args.json | 2 +- module/config/i18n/en-US.json | 2 +- module/config/i18n/ja-JP.json | 2 +- module/config/i18n/zh-CN.json | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/campaign/Readme.md b/campaign/Readme.md index e8a0415a4..6e5243e66 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -229,4 +229,5 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250102 | raid 20240130 | Spring Festive Fiasco | - | - | - | 寰昌宇定家事忙 | | 20250109 | event 20221222 cn | Parallel Superimposition Rerun | 复刻定向折叠 | Parallel Superimposition Rerun | 積重なる事象の幻界(復刻) | - | | 20250116 | raid 20250116 | Spring Fashion Festa | 华裳巧展喜事长 | Spring Fashion Festa | 新春華裳協奏曲 | - | -| 20250206 | event 20220818 cn | Operation Convergence Rerun | 复刻远汇点作战 | Operation Convergence Return | 結像点作戦(復刻) | - +| 20250123 | raid 20250116 | Spring Fashion Festa | - | - | - | 華裳巧展喜事長 | +| 20250206 | event 20220818 cn | Operation Convergence Rerun | 复刻远汇点作战 | Operation Convergence Return | 結像点作戦(復刻) | - | diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 6fcbc194c..4adaf2c98 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -9335,4 +9335,4 @@ } } } -} +} \ No newline at end of file diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 7b5e7d4aa..069031aa7 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -2657,4 +2657,4 @@ "ChooseFile": "Choose file" } } -} +} \ No newline at end of file diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 4ca44b515..387753184 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -2657,4 +2657,4 @@ "ChooseFile": "ファイルを選択してください" } } -} +} \ No newline at end of file diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index b1383bc70..375ff8337 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -2657,4 +2657,4 @@ "ChooseFile": "选择文件" } } -} +} \ No newline at end of file From 655b2fb36172efb64ea782f7295cee61c6607d46 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 6 Feb 2025 23:01:04 +0800 Subject: [PATCH 13/56] Upd: Assets for battle UI Holy Light --- assets/cn/combat_ui/Pause_HolyLight.png | Bin 0 -> 5929 bytes module/combat/combat.py | 3 +++ module/combat_ui/assets.py | 1 + 3 files changed, 4 insertions(+) create mode 100644 assets/cn/combat_ui/Pause_HolyLight.png diff --git a/assets/cn/combat_ui/Pause_HolyLight.png b/assets/cn/combat_ui/Pause_HolyLight.png new file mode 100644 index 0000000000000000000000000000000000000000..d286ebd1e00039146ab356d2a615ac8b31cf6d59 GIT binary patch literal 5929 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 Gbnib(S3=+b literal 0 HcmV?d00001 diff --git a/module/combat/combat.py b/module/combat/combat.py index 5306fb5ac..f82a9012b 100644 --- a/module/combat/combat.py +++ b/module/combat/combat.py @@ -101,6 +101,8 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan return PAUSE_Neon if PAUSE_Cyber.match_template_color(self.device.image, offset=(10, 10)): return PAUSE_Cyber + if PAUSE_HolyLight.match_template_color(self.device.image, offset=(10, 10)): + return PAUSE_HolyLight return False def handle_combat_quit(self, offset=(20, 20), interval=3): @@ -125,6 +127,7 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan self.device.click(QUIT_Christmas) timer.reset() return True + # Battle UI PAUSE_HolyLight uses QUIT_New return False def ensure_combat_oil_loaded(self): diff --git a/module/combat_ui/assets.py b/module/combat_ui/assets.py index 4228cbe43..bb3050f88 100644 --- a/module/combat_ui/assets.py +++ b/module/combat_ui/assets.py @@ -11,6 +11,7 @@ PAUSE_DOUBLE_CHECK = Button(area={'cn': (1226, 35, 1231, 60), 'en': (1226, 35, 1 PAUSE_Iridescent_Fantasy = Button(area={'cn': (1232, 33, 1252, 57), 'en': (1232, 33, 1252, 57), 'jp': (1232, 33, 1252, 57), 'tw': (1232, 33, 1252, 57)}, color={'cn': (124, 139, 190), 'en': (124, 139, 190), 'jp': (124, 139, 190), 'tw': (124, 139, 190)}, button={'cn': (1232, 33, 1252, 57), 'en': (1232, 33, 1252, 57), 'jp': (1232, 33, 1252, 57), 'tw': (1232, 33, 1252, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_Iridescent_Fantasy.png', 'en': './assets/en/combat_ui/PAUSE_Iridescent_Fantasy.png', 'jp': './assets/jp/combat_ui/PAUSE_Iridescent_Fantasy.png', 'tw': './assets/tw/combat_ui/PAUSE_Iridescent_Fantasy.png'}) PAUSE_Neon = Button(area={'cn': (1228, 32, 1250, 59), 'en': (1228, 32, 1250, 59), 'jp': (1228, 32, 1250, 59), 'tw': (1228, 32, 1250, 59)}, color={'cn': (106, 137, 80), 'en': (106, 137, 80), 'jp': (106, 137, 80), 'tw': (106, 137, 80)}, button={'cn': (1228, 32, 1250, 59), 'en': (1228, 32, 1250, 59), 'jp': (1228, 32, 1250, 59), 'tw': (1228, 32, 1250, 59)}, file={'cn': './assets/cn/combat_ui/PAUSE_Neon.png', 'en': './assets/cn/combat_ui/PAUSE_Neon.png', 'jp': './assets/cn/combat_ui/PAUSE_Neon.png', 'tw': './assets/cn/combat_ui/PAUSE_Neon.png'}) PAUSE_New = Button(area={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), 'jp': (1231, 29, 1253, 56), 'tw': (1231, 29, 1253, 56)}, color={'cn': (156, 158, 166), 'en': (156, 158, 166), 'jp': (156, 158, 166), 'tw': (156, 158, 166)}, button={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), 'jp': (1231, 29, 1253, 56), 'tw': (1231, 29, 1253, 56)}, file={'cn': './assets/cn/combat_ui/PAUSE_New.png', 'en': './assets/en/combat_ui/PAUSE_New.png', 'jp': './assets/jp/combat_ui/PAUSE_New.png', 'tw': './assets/tw/combat_ui/PAUSE_New.png'}) +Pause_HolyLight = Button(area={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, color={'cn': (54, 40, 27), 'en': (54, 40, 27), 'jp': (54, 40, 27), 'tw': (54, 40, 27)}, button={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, file={'cn': './assets/cn/combat_ui/Pause_HolyLight.png', 'en': './assets/cn/combat_ui/Pause_HolyLight.png', 'jp': './assets/cn/combat_ui/Pause_HolyLight.png', 'tw': './assets/cn/combat_ui/Pause_HolyLight.png'}) QUIT = Button(area={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, color={'cn': (199, 122, 114), 'en': (216, 168, 164), 'jp': (196, 120, 113), 'tw': (200, 126, 118)}, button={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, file={'cn': './assets/cn/combat_ui/QUIT.png', 'en': './assets/en/combat_ui/QUIT.png', 'jp': './assets/jp/combat_ui/QUIT.png', 'tw': './assets/tw/combat_ui/QUIT.png'}) QUIT_Christmas = Button(area={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, color={'cn': (195, 139, 166), 'en': (207, 166, 185), 'jp': (195, 139, 166), 'tw': (195, 139, 166)}, button={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Christmas.png', 'en': './assets/en/combat_ui/QUIT_Christmas.png', 'jp': './assets/cn/combat_ui/QUIT_Christmas.png', 'tw': './assets/cn/combat_ui/QUIT_Christmas.png'}) QUIT_Iridescent_Fantasy = Button(area={'cn': (391, 522, 464, 540), 'en': (402, 507, 460, 523), 'jp': (391, 522, 464, 540), 'tw': (391, 522, 464, 540)}, color={'cn': (121, 73, 79), 'en': (255, 174, 164), 'jp': (108, 60, 70), 'tw': (121, 73, 79)}, button={'cn': (391, 522, 464, 540), 'en': (402, 507, 460, 523), 'jp': (391, 522, 464, 540), 'tw': (391, 522, 464, 540)}, file={'cn': './assets/cn/combat_ui/QUIT_Iridescent_Fantasy.png', 'en': './assets/en/combat_ui/QUIT_Iridescent_Fantasy.png', 'jp': './assets/jp/combat_ui/QUIT_Iridescent_Fantasy.png', 'tw': './assets/cn/combat_ui/QUIT_Iridescent_Fantasy.png'}) From 7ee0d4533f8092cae4decc14d8b7be8f0f447d55 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 6 Feb 2025 23:09:34 +0800 Subject: [PATCH 14/56] Fix: Missing "/" in OcrDataKey (#4563) --- module/war_archives/war_archives.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/module/war_archives/war_archives.py b/module/war_archives/war_archives.py index d4943c1db..24d7b3262 100644 --- a/module/war_archives/war_archives.py +++ b/module/war_archives/war_archives.py @@ -1,3 +1,5 @@ +import re + from campaign.campaign_war_archives.campaign_base import CampaignBase from module.campaign.run import CampaignRun from module.logger import logger @@ -5,7 +7,15 @@ from module.ocr.ocr import DigitCounter from module.war_archives.assets import (OCR_DATA_KEY_CAMPAIGN, WAR_ARCHIVES_CAMPAIGN_CHECK) -DATA_KEY_CAMPAIGN = DigitCounter(OCR_DATA_KEY_CAMPAIGN, letter=(255, 247, 247), threshold=64) + +class OcrDataKey(DigitCounter): + def after_process(self, result): + result = super().after_process(result) + result = re.sub(r'(\d{1,2})60$', r'\1/60', result) + return result + + +DATA_KEY_CAMPAIGN = OcrDataKey(OCR_DATA_KEY_CAMPAIGN, letter=(255, 247, 247), threshold=64) class CampaignWarArchives(CampaignRun, CampaignBase): From 136100c7fd35f2ef427f6b7b203995a41ddb2750 Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Thu, 6 Feb 2025 23:38:18 +0800 Subject: [PATCH 15/56] Fix: asset name of PAUSE_HolyLight --- .../{Pause_HolyLight.png => PAUSE_HolyLight.png} | Bin module/combat_ui/assets.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename assets/cn/combat_ui/{Pause_HolyLight.png => PAUSE_HolyLight.png} (100%) diff --git a/assets/cn/combat_ui/Pause_HolyLight.png b/assets/cn/combat_ui/PAUSE_HolyLight.png similarity index 100% rename from assets/cn/combat_ui/Pause_HolyLight.png rename to assets/cn/combat_ui/PAUSE_HolyLight.png diff --git a/module/combat_ui/assets.py b/module/combat_ui/assets.py index bb3050f88..8901a617a 100644 --- a/module/combat_ui/assets.py +++ b/module/combat_ui/assets.py @@ -8,10 +8,10 @@ PAUSE = Button(area={'cn': (1158, 40, 1199, 58), 'en': (1155, 38, 1216, 51), 'jp PAUSE_Christmas = Button(area={'cn': (1234, 35, 1250, 56), 'en': (1234, 35, 1250, 56), 'jp': (1234, 35, 1250, 56), 'tw': (1234, 35, 1250, 56)}, color={'cn': (158, 181, 210), 'en': (158, 181, 210), 'jp': (158, 181, 210), 'tw': (158, 181, 210)}, button={'cn': (1234, 35, 1250, 56), 'en': (1234, 35, 1250, 56), 'jp': (1234, 35, 1250, 56), 'tw': (1234, 35, 1250, 56)}, file={'cn': './assets/cn/combat_ui/PAUSE_Christmas.png', 'en': './assets/cn/combat_ui/PAUSE_Christmas.png', 'jp': './assets/cn/combat_ui/PAUSE_Christmas.png', 'tw': './assets/cn/combat_ui/PAUSE_Christmas.png'}) PAUSE_Cyber = Button(area={'cn': (1231, 32, 1253, 59), 'en': (1231, 32, 1253, 59), 'jp': (1231, 32, 1253, 59), 'tw': (1231, 32, 1253, 59)}, color={'cn': (40, 140, 157), 'en': (40, 140, 157), 'jp': (40, 140, 157), 'tw': (40, 140, 157)}, button={'cn': (1231, 32, 1253, 59), 'en': (1231, 32, 1253, 59), 'jp': (1231, 32, 1253, 59), 'tw': (1231, 32, 1253, 59)}, file={'cn': './assets/cn/combat_ui/PAUSE_Cyber.png', 'en': './assets/cn/combat_ui/PAUSE_Cyber.png', 'jp': './assets/cn/combat_ui/PAUSE_Cyber.png', 'tw': './assets/cn/combat_ui/PAUSE_Cyber.png'}) PAUSE_DOUBLE_CHECK = Button(area={'cn': (1226, 35, 1231, 60), 'en': (1226, 35, 1231, 61), 'jp': (1226, 35, 1230, 60), 'tw': (1226, 35, 1231, 60)}, color={'cn': (96, 104, 136), 'en': (83, 98, 118), 'jp': (97, 102, 120), 'tw': (96, 104, 136)}, button={'cn': (1226, 35, 1231, 60), 'en': (1226, 35, 1231, 61), 'jp': (1226, 35, 1230, 60), 'tw': (1226, 35, 1231, 60)}, file={'cn': './assets/cn/combat_ui/PAUSE_DOUBLE_CHECK.png', 'en': './assets/en/combat_ui/PAUSE_DOUBLE_CHECK.png', 'jp': './assets/jp/combat_ui/PAUSE_DOUBLE_CHECK.png', 'tw': './assets/tw/combat_ui/PAUSE_DOUBLE_CHECK.png'}) +PAUSE_HolyLight = Button(area={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, color={'cn': (54, 40, 27), 'en': (54, 40, 27), 'jp': (54, 40, 27), 'tw': (54, 40, 27)}, button={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_HolyLight.png', 'en': './assets/cn/combat_ui/PAUSE_HolyLight.png', 'jp': './assets/cn/combat_ui/PAUSE_HolyLight.png', 'tw': './assets/cn/combat_ui/PAUSE_HolyLight.png'}) PAUSE_Iridescent_Fantasy = Button(area={'cn': (1232, 33, 1252, 57), 'en': (1232, 33, 1252, 57), 'jp': (1232, 33, 1252, 57), 'tw': (1232, 33, 1252, 57)}, color={'cn': (124, 139, 190), 'en': (124, 139, 190), 'jp': (124, 139, 190), 'tw': (124, 139, 190)}, button={'cn': (1232, 33, 1252, 57), 'en': (1232, 33, 1252, 57), 'jp': (1232, 33, 1252, 57), 'tw': (1232, 33, 1252, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_Iridescent_Fantasy.png', 'en': './assets/en/combat_ui/PAUSE_Iridescent_Fantasy.png', 'jp': './assets/jp/combat_ui/PAUSE_Iridescent_Fantasy.png', 'tw': './assets/tw/combat_ui/PAUSE_Iridescent_Fantasy.png'}) PAUSE_Neon = Button(area={'cn': (1228, 32, 1250, 59), 'en': (1228, 32, 1250, 59), 'jp': (1228, 32, 1250, 59), 'tw': (1228, 32, 1250, 59)}, color={'cn': (106, 137, 80), 'en': (106, 137, 80), 'jp': (106, 137, 80), 'tw': (106, 137, 80)}, button={'cn': (1228, 32, 1250, 59), 'en': (1228, 32, 1250, 59), 'jp': (1228, 32, 1250, 59), 'tw': (1228, 32, 1250, 59)}, file={'cn': './assets/cn/combat_ui/PAUSE_Neon.png', 'en': './assets/cn/combat_ui/PAUSE_Neon.png', 'jp': './assets/cn/combat_ui/PAUSE_Neon.png', 'tw': './assets/cn/combat_ui/PAUSE_Neon.png'}) PAUSE_New = Button(area={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), 'jp': (1231, 29, 1253, 56), 'tw': (1231, 29, 1253, 56)}, color={'cn': (156, 158, 166), 'en': (156, 158, 166), 'jp': (156, 158, 166), 'tw': (156, 158, 166)}, button={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), 'jp': (1231, 29, 1253, 56), 'tw': (1231, 29, 1253, 56)}, file={'cn': './assets/cn/combat_ui/PAUSE_New.png', 'en': './assets/en/combat_ui/PAUSE_New.png', 'jp': './assets/jp/combat_ui/PAUSE_New.png', 'tw': './assets/tw/combat_ui/PAUSE_New.png'}) -Pause_HolyLight = Button(area={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, color={'cn': (54, 40, 27), 'en': (54, 40, 27), 'jp': (54, 40, 27), 'tw': (54, 40, 27)}, button={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, file={'cn': './assets/cn/combat_ui/Pause_HolyLight.png', 'en': './assets/cn/combat_ui/Pause_HolyLight.png', 'jp': './assets/cn/combat_ui/Pause_HolyLight.png', 'tw': './assets/cn/combat_ui/Pause_HolyLight.png'}) QUIT = Button(area={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, color={'cn': (199, 122, 114), 'en': (216, 168, 164), 'jp': (196, 120, 113), 'tw': (200, 126, 118)}, button={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, file={'cn': './assets/cn/combat_ui/QUIT.png', 'en': './assets/en/combat_ui/QUIT.png', 'jp': './assets/jp/combat_ui/QUIT.png', 'tw': './assets/tw/combat_ui/QUIT.png'}) QUIT_Christmas = Button(area={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, color={'cn': (195, 139, 166), 'en': (207, 166, 185), 'jp': (195, 139, 166), 'tw': (195, 139, 166)}, button={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Christmas.png', 'en': './assets/en/combat_ui/QUIT_Christmas.png', 'jp': './assets/cn/combat_ui/QUIT_Christmas.png', 'tw': './assets/cn/combat_ui/QUIT_Christmas.png'}) QUIT_Iridescent_Fantasy = Button(area={'cn': (391, 522, 464, 540), 'en': (402, 507, 460, 523), 'jp': (391, 522, 464, 540), 'tw': (391, 522, 464, 540)}, color={'cn': (121, 73, 79), 'en': (255, 174, 164), 'jp': (108, 60, 70), 'tw': (121, 73, 79)}, button={'cn': (391, 522, 464, 540), 'en': (402, 507, 460, 523), 'jp': (391, 522, 464, 540), 'tw': (391, 522, 464, 540)}, file={'cn': './assets/cn/combat_ui/QUIT_Iridescent_Fantasy.png', 'en': './assets/en/combat_ui/QUIT_Iridescent_Fantasy.png', 'jp': './assets/jp/combat_ui/QUIT_Iridescent_Fantasy.png', 'tw': './assets/cn/combat_ui/QUIT_Iridescent_Fantasy.png'}) From 6e4601dd2b5304fdcb4ea5d41bc06b90d2f0f99e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=9E=E9=A3=9B?= Date: Fri, 7 Feb 2025 01:09:24 +0800 Subject: [PATCH 16/56] Fix bugs (#4569) * fix: add PAUSE_HolyLight at `_at_low_hp` * fix: handle map file name --- module/exercise/hp_daemon.py | 3 ++- module/hard/hard.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/module/exercise/hp_daemon.py b/module/exercise/hp_daemon.py index 39bf9bbfb..68516b96d 100644 --- a/module/exercise/hp_daemon.py +++ b/module/exercise/hp_daemon.py @@ -1,7 +1,7 @@ from module.base.base import ModuleBase from module.base.timer import Timer from module.base.utils import color_bar_percentage -from module.combat_ui.assets import PAUSE, PAUSE_Christmas, PAUSE_Cyber, PAUSE_Iridescent_Fantasy, PAUSE_Neon, PAUSE_New +from module.combat_ui.assets import PAUSE, PAUSE_Christmas, PAUSE_Cyber, PAUSE_HolyLight, PAUSE_Iridescent_Fantasy, PAUSE_Neon, PAUSE_New from module.exercise.assets import * from module.logger import logger @@ -67,6 +67,7 @@ class HpDaemon(ModuleBase): PAUSE_Neon, PAUSE_Christmas, PAUSE_Cyber, + PAUSE_HolyLight ]: self.attacker_hp = self._calculate_hp(image, area=ATTACKER_HP_AREA_New.area, reverse=True) self.defender_hp = self._calculate_hp(image, area=DEFENDER_HP_AREA_New.area, reverse=True) diff --git a/module/hard/hard.py b/module/hard/hard.py index 3b2da4240..672fa7f5a 100644 --- a/module/hard/hard.py +++ b/module/hard/hard.py @@ -2,6 +2,7 @@ import importlib from campaign.campaign_hard.campaign_hard import Campaign from module.campaign.run import CampaignRun +from module.handler.fast_forward import to_map_file_name from module.hard.assets import * from module.logger import logger from module.ocr.ocr import Digit @@ -15,8 +16,7 @@ class CampaignHard(CampaignRun): def run(self): logger.hr('Campaign hard', level=1) - chapter, stage = self.config.Hard_HardStage.split('-') - name = f'campaign_{chapter}_{stage}' + name = to_map_file_name(self.config.Hard_HardStage) self.config.override( Campaign_Mode='hard', Campaign_UseFleetLock=True, From 3b23cc920ba74ed47e1dd4ea95c159def2a6aeb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=9E=E9=A3=9B?= Date: Sat, 8 Feb 2025 00:50:11 +0800 Subject: [PATCH 17/56] fix: Incorrect truncation (#4570) --- module/os_shop/port_shop.py | 2 +- module/os_shop/ui.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/module/os_shop/port_shop.py b/module/os_shop/port_shop.py index 96d108f4d..0f765bfef 100644 --- a/module/os_shop/port_shop.py +++ b/module/os_shop/port_shop.py @@ -151,7 +151,7 @@ class PortShop(OSStatus, OSShopUI, Selector, MapEventHandler): logger.info('OS shop reach bottom, stop') break else: - OS_SHOP_SCROLL.next_page(main=self, page=0.5) + OS_SHOP_SCROLL.next_page(main=self, page=0.5, skip_first_screenshot=False) cur_pos = OS_SHOP_SCROLL.cal_position(main=self) continue self.device.click_record.clear() diff --git a/module/os_shop/ui.py b/module/os_shop/ui.py index 9716177b8..cbbc5ec4c 100644 --- a/module/os_shop/ui.py +++ b/module/os_shop/ui.py @@ -13,7 +13,8 @@ from module.ui.ui import UI OS_SHOP_SCROLL = AdaptiveScroll( OS_SHOP_SCROLL_AREA.button, parameters={ - 'height': 255 - 99 + 'height': 255 - 99, + 'prominence': 40, }, name="OS_SHOP_SCROLL" ) @@ -149,7 +150,7 @@ class OSShopUI(UI): retry.start() while True: logger.warning('Scroll does not drag success, retrying scroll') - OS_SHOP_SCROLL.next_page(main=self, page=0.5) + OS_SHOP_SCROLL.next_page(main=self, page=0.5, skip_first_screenshot=False) cur_pos = OS_SHOP_SCROLL.cal_position(main=self) if pre_pos != cur_pos: logger.info(f'Scroll success drag page to {cur_pos}') From e265eb57f08aea9c025d220f31971c9b82fac199 Mon Sep 17 00:00:00 2001 From: "Shane (Treasure) Xue" Date: Sat, 8 Feb 2025 00:53:03 +0800 Subject: [PATCH 18/56] Bugfix: clicking exercise button after stage 3-4 (#4572) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix bugs (#4569) * fix: add PAUSE_HolyLight at `_at_low_hp` * fix: handle map file name * Bugfix Resolved misrecognition of EXP_INFO_B in campaign_main_2 and campaign_main_3. Refer to issue #4553. Reason was the background map was similar to the exp info page. Recognition also appears in-stage since the chapter name flashes past but this will have no adverse affects. * Remove mistakenly ctrl-c-ed override --------- Co-authored-by: 霞飛 --- campaign/campaign_main/campaign_2_1.py | 2 +- campaign/campaign_main/campaign_2_2.py | 2 +- campaign/campaign_main/campaign_2_3.py | 2 +- campaign/campaign_main/campaign_2_4.py | 2 +- campaign/campaign_main/campaign_2_base.py | 10 ++++++++++ campaign/campaign_main/campaign_3_1.py | 2 +- campaign/campaign_main/campaign_3_2.py | 2 +- campaign/campaign_main/campaign_3_3.py | 2 +- campaign/campaign_main/campaign_3_4.py | 2 +- campaign/campaign_main/campaign_3_base.py | 11 +++++++++++ 10 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 campaign/campaign_main/campaign_2_base.py create mode 100644 campaign/campaign_main/campaign_3_base.py diff --git a/campaign/campaign_main/campaign_2_1.py b/campaign/campaign_main/campaign_2_1.py index f4faeb805..4b0c542a0 100644 --- a/campaign/campaign_main/campaign_2_1.py +++ b/campaign/campaign_main/campaign_2_1.py @@ -1,4 +1,4 @@ -from module.campaign.campaign_base import CampaignBase +from .campaign_2_base import CampaignBase from module.logger import logger from module.map.map_base import CampaignMap from module.map.map_grids import RoadGrids, SelectedGrids diff --git a/campaign/campaign_main/campaign_2_2.py b/campaign/campaign_main/campaign_2_2.py index 9139e68b9..543d685ff 100644 --- a/campaign/campaign_main/campaign_2_2.py +++ b/campaign/campaign_main/campaign_2_2.py @@ -1,5 +1,5 @@ from campaign.campaign_main.campaign_2_1 import Config -from module.campaign.campaign_base import CampaignBase +from .campaign_2_base import CampaignBase from module.logger import logger from module.map.map_base import CampaignMap from module.map.map_grids import RoadGrids, SelectedGrids diff --git a/campaign/campaign_main/campaign_2_3.py b/campaign/campaign_main/campaign_2_3.py index 02654c313..7c045bd57 100644 --- a/campaign/campaign_main/campaign_2_3.py +++ b/campaign/campaign_main/campaign_2_3.py @@ -1,5 +1,5 @@ from campaign.campaign_main.campaign_2_1 import Config -from module.campaign.campaign_base import CampaignBase +from .campaign_2_base import CampaignBase from module.logger import logger from module.map.map_base import CampaignMap from module.map.map_grids import RoadGrids, SelectedGrids diff --git a/campaign/campaign_main/campaign_2_4.py b/campaign/campaign_main/campaign_2_4.py index 7e1f69690..37ff34de5 100644 --- a/campaign/campaign_main/campaign_2_4.py +++ b/campaign/campaign_main/campaign_2_4.py @@ -1,5 +1,5 @@ from campaign.campaign_main.campaign_2_1 import Config as ConfigBase -from module.campaign.campaign_base import CampaignBase +from .campaign_2_base import CampaignBase from module.logger import logger from module.map.map_base import CampaignMap from module.map.map_grids import RoadGrids, SelectedGrids diff --git a/campaign/campaign_main/campaign_2_base.py b/campaign/campaign_main/campaign_2_base.py new file mode 100644 index 000000000..5f1565154 --- /dev/null +++ b/campaign/campaign_main/campaign_2_base.py @@ -0,0 +1,10 @@ +from module.campaign.campaign_base import CampaignBase as CampaignBase_ +from module.ui.page import page_campaign + + +class CampaignBase(CampaignBase_): + def handle_exp_info(self): + # Random background of Main Chapter 2 hits EXP_INFO_B + if self.ui_page_appear(page_campaign): + return False + return super().handle_exp_info() diff --git a/campaign/campaign_main/campaign_3_1.py b/campaign/campaign_main/campaign_3_1.py index f1c512afe..07fe2fa66 100644 --- a/campaign/campaign_main/campaign_3_1.py +++ b/campaign/campaign_main/campaign_3_1.py @@ -1,4 +1,4 @@ -from module.campaign.campaign_base import CampaignBase +from .campaign_3_base import CampaignBase from module.logger import logger from module.map.map_base import CampaignMap from module.map.map_grids import RoadGrids, SelectedGrids diff --git a/campaign/campaign_main/campaign_3_2.py b/campaign/campaign_main/campaign_3_2.py index aca94c849..0d5d0f59b 100644 --- a/campaign/campaign_main/campaign_3_2.py +++ b/campaign/campaign_main/campaign_3_2.py @@ -1,5 +1,5 @@ from campaign.campaign_main.campaign_3_1 import Config -from module.campaign.campaign_base import CampaignBase +from .campaign_3_base import CampaignBase from module.logger import logger from module.map.map_base import CampaignMap from module.map.map_grids import RoadGrids, SelectedGrids diff --git a/campaign/campaign_main/campaign_3_3.py b/campaign/campaign_main/campaign_3_3.py index 2c34f8817..76526cd6f 100644 --- a/campaign/campaign_main/campaign_3_3.py +++ b/campaign/campaign_main/campaign_3_3.py @@ -1,5 +1,5 @@ from campaign.campaign_main.campaign_3_1 import Config as ConfigBase -from module.campaign.campaign_base import CampaignBase +from .campaign_3_base import CampaignBase from module.logger import logger from module.map.map_base import CampaignMap from module.map.map_grids import RoadGrids, SelectedGrids diff --git a/campaign/campaign_main/campaign_3_4.py b/campaign/campaign_main/campaign_3_4.py index 07cde0468..262aba833 100644 --- a/campaign/campaign_main/campaign_3_4.py +++ b/campaign/campaign_main/campaign_3_4.py @@ -1,5 +1,5 @@ from campaign.campaign_main.campaign_3_1 import Config as Config31 -from module.campaign.campaign_base import CampaignBase +from .campaign_3_base import CampaignBase from module.logger import logger from module.map.map_base import CampaignMap from module.map.map_grids import RoadGrids, SelectedGrids diff --git a/campaign/campaign_main/campaign_3_base.py b/campaign/campaign_main/campaign_3_base.py new file mode 100644 index 000000000..1567e3c6b --- /dev/null +++ b/campaign/campaign_main/campaign_3_base.py @@ -0,0 +1,11 @@ +from module.campaign.campaign_base import CampaignBase as CampaignBase_ +from module.logger import logger +from module.ui.page import page_campaign + + +class CampaignBase(CampaignBase_): + def handle_exp_info(self): + # Random background of Main Chapter 3 hits EXP_INFO_B + if self.ui_page_appear(page_campaign): + return False + return super().handle_exp_info() From 1435bb7252c7da434f4eecbc8a35f30d9042aed0 Mon Sep 17 00:00:00 2001 From: "Shane (Treasure) Xue" Date: Wed, 12 Feb 2025 01:40:25 +0800 Subject: [PATCH 19/56] Update shop_voucher.py (#4576) Corrected scroll action: should scroll to next page, not the bottom. --- module/shop/shop_voucher.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/shop/shop_voucher.py b/module/shop/shop_voucher.py index 3b0045cc8..1cdb2b27f 100644 --- a/module/shop/shop_voucher.py +++ b/module/shop/shop_voucher.py @@ -204,8 +204,7 @@ class VoucherShop(ShopClerk, ShopStatus): logger.info('Voucher Shop reach bottom, stop') break else: - # Only 4 rows of items at max, goto bottom directly - VOUCHER_SHOP_SCROLL.set_bottom(main=self) + VOUCHER_SHOP_SCROLL.next_page(main=self) del_cached_property(self, 'shop_grid') del_cached_property(self, 'shop_voucher_items') continue From 2d9556d21bfdcd82462e147b1676e22efcb2869a Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 12 Feb 2025 01:20:18 +0800 Subject: [PATCH 20/56] Fix: [ALAS] Emulator tree-killed when Alas gets killed --- module/device/platform/platform_windows.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/module/device/platform/platform_windows.py b/module/device/platform/platform_windows.py index 0936d93fe..ef1db201a 100644 --- a/module/device/platform/platform_windows.py +++ b/module/device/platform/platform_windows.py @@ -54,7 +54,9 @@ class PlatformWindows(PlatformBase, EmulatorManager): """ command = command.replace(r"\\", "/").replace("\\", "/").replace('"', '"') logger.info(f'Execute: {command}') - return subprocess.Popen(command, close_fds=True) # only work on Windows + # `close_fds` only work on Windows + # `start_new_session` to avoid emulator getting tree-killed when Alas gets killed + return subprocess.Popen(command, close_fds=True, start_new_session=True) @classmethod def kill_process_by_regex(cls, regex: str) -> int: From ca0f483487546836a239fea8fa5e99b305526b8a Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 12 Feb 2025 01:53:08 +0800 Subject: [PATCH 21/56] Upd: OCR_GUILD_OPERATIONS_PROGRESS (fixed #4549) - TODO: [EN][JP][TW] Update OCR_GUILD_OPERATIONS_PROGRESS --- .../guild/OCR_GUILD_OPERATIONS_PROGRESS.png | Bin 3952 -> 6632 bytes .../guild/OCR_GUILD_OPERATIONS_PROGRESS.png | Bin 3952 -> 0 bytes .../guild/OCR_GUILD_OPERATIONS_PROGRESS.png | Bin 3952 -> 0 bytes .../guild/OCR_GUILD_OPERATIONS_PROGRESS.png | Bin 3952 -> 0 bytes module/guild/assets.py | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 assets/en/guild/OCR_GUILD_OPERATIONS_PROGRESS.png delete mode 100644 assets/jp/guild/OCR_GUILD_OPERATIONS_PROGRESS.png delete mode 100644 assets/tw/guild/OCR_GUILD_OPERATIONS_PROGRESS.png diff --git a/assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png b/assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png index 9876394b4384be1ed243437cf783734eeba8e748..b5175cfe148ea4c22bd36ea10bdf570d43868685 100644 GIT binary patch delta 4041 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 diff --git a/assets/en/guild/OCR_GUILD_OPERATIONS_PROGRESS.png b/assets/en/guild/OCR_GUILD_OPERATIONS_PROGRESS.png deleted file mode 100644 index 9876394b4384be1ed243437cf783734eeba8e748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3952 zcmeH``#02i7{@1EsF2 zrwRa2N1t@@0$`i`s`Oe#N$!3$!fcT{SgPw6c=+5wl&qhgkq@&k(*Gkd=XKo{(i8JUO1a&9K54 zo>!geFx&w*OgeDFz@+oRiG;Irjqaz)YG-b_-=7$vxYh2Mu%#% zA54D(X7r&929?7cNf{dU4(Pcz7ynsvDn%#AnENKHTm#-op#WuhLJCt5P!LcMP!LcM zP!RZ!1lCLA(c1xt%cJM42$nA{IP0$B#;+~vW90v(f*tbnFezgf0Fl*n9nRCK%QdV7 zQ)*b3ogFy_s zqrM#k{<@+hNtL0LXN0`O}BNFQtx! zMaYJ^#T2~fp35wrkFO6_Lg!RSF4!WvW!0>yq!q0G$ek2fO#lV0W@_z)KOoLI)H@I% zE^Cb;A`$ke3v`_4AiKWN&R(m-iI7ZKlrQ0Ja^X!Yq3wzwmlX$k!adS2lVyD8O|R zb`AcZf7QkqQAB>@G!SNpJ141`2t1~%(Z@)n@#acWq_q_$2*iW<)j+zG$7f?L+Z=9@ zL?TVGchqqJ1F3e~nOeQr9NXV@D*en7Iqq8ZvT6n~@feL|bnVI61@aoly@5QK&-xN; z6n-_i`J7on4a>*>+9gN5JUngj9QQ?@YT9OZ@dr>pYZN3ITO;&(Lz5mxH9@@<%u$Y= zuVzhuCGvVq5wbKHSAy=uG$l?n3B8J}x8|B}%=8S(E26@6LF$R!sd(BPd!ESTIZGA` zt7@4?yMmud!>Ure$G+JilX?>!_a)iC%*DG90%j=CN4La!@1UKjTR@=st+|i2_tKzt zh-9Lj{q8b7~*M8bTFkxIqqABUNuyO-cPBM4c!#42Hj`*sWESaef~u9ua{w%Cy^LEqd~&RZYv(JZ12-+K@rpyC;0JbbWwFnk{7D@p zxCjfEJ#fR2Lv1vMl0RGV#D3{td)IP?H#M;^ab@t+Y%Fh$wbn40ERmqNP#8oO$3=qy z-(CxLd|aLVUM;epbG_3D#&A&A(LlWhlOFUcUPW6j^{#IxyL&sN%(st>xTdb2do0O( zrn)(0>}C8wz@mUsGph#Q4^`pj*QdJ$sEc2sJWR6?T~;x)rSKHGH9P0{jd;ml@|j*n z;0zZWB_+}2^Mnhg)~MWWsU}KZwN6iX({8QG{_0_=1dQHF%NaW#5qT7`H$*t?gX!%L zZDTqog!e6Pq+KtCZBEH*>(*u7X^;^gxG8dlDG2=U2|Q0))%jb65go*BjNB|1?dst| I`zi3ozsLHUcK`qY diff --git a/assets/jp/guild/OCR_GUILD_OPERATIONS_PROGRESS.png b/assets/jp/guild/OCR_GUILD_OPERATIONS_PROGRESS.png deleted file mode 100644 index 9876394b4384be1ed243437cf783734eeba8e748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3952 zcmeH``#02i7{@1EsF2 zrwRa2N1t@@0$`i`s`Oe#N$!3$!fcT{SgPw6c=+5wl&qhgkq@&k(*Gkd=XKo{(i8JUO1a&9K54 zo>!geFx&w*OgeDFz@+oRiG;Irjqaz)YG-b_-=7$vxYh2Mu%#% zA54D(X7r&929?7cNf{dU4(Pcz7ynsvDn%#AnENKHTm#-op#WuhLJCt5P!LcMP!LcM zP!RZ!1lCLA(c1xt%cJM42$nA{IP0$B#;+~vW90v(f*tbnFezgf0Fl*n9nRCK%QdV7 zQ)*b3ogFy_s zqrM#k{<@+hNtL0LXN0`O}BNFQtx! zMaYJ^#T2~fp35wrkFO6_Lg!RSF4!WvW!0>yq!q0G$ek2fO#lV0W@_z)KOoLI)H@I% zE^Cb;A`$ke3v`_4AiKWN&R(m-iI7ZKlrQ0Ja^X!Yq3wzwmlX$k!adS2lVyD8O|R zb`AcZf7QkqQAB>@G!SNpJ141`2t1~%(Z@)n@#acWq_q_$2*iW<)j+zG$7f?L+Z=9@ zL?TVGchqqJ1F3e~nOeQr9NXV@D*en7Iqq8ZvT6n~@feL|bnVI61@aoly@5QK&-xN; z6n-_i`J7on4a>*>+9gN5JUngj9QQ?@YT9OZ@dr>pYZN3ITO;&(Lz5mxH9@@<%u$Y= zuVzhuCGvVq5wbKHSAy=uG$l?n3B8J}x8|B}%=8S(E26@6LF$R!sd(BPd!ESTIZGA` zt7@4?yMmud!>Ure$G+JilX?>!_a)iC%*DG90%j=CN4La!@1UKjTR@=st+|i2_tKzt zh-9Lj{q8b7~*M8bTFkxIqqABUNuyO-cPBM4c!#42Hj`*sWESaef~u9ua{w%Cy^LEqd~&RZYv(JZ12-+K@rpyC;0JbbWwFnk{7D@p zxCjfEJ#fR2Lv1vMl0RGV#D3{td)IP?H#M;^ab@t+Y%Fh$wbn40ERmqNP#8oO$3=qy z-(CxLd|aLVUM;epbG_3D#&A&A(LlWhlOFUcUPW6j^{#IxyL&sN%(st>xTdb2do0O( zrn)(0>}C8wz@mUsGph#Q4^`pj*QdJ$sEc2sJWR6?T~;x)rSKHGH9P0{jd;ml@|j*n z;0zZWB_+}2^Mnhg)~MWWsU}KZwN6iX({8QG{_0_=1dQHF%NaW#5qT7`H$*t?gX!%L zZDTqog!e6Pq+KtCZBEH*>(*u7X^;^gxG8dlDG2=U2|Q0))%jb65go*BjNB|1?dst| I`zi3ozsLHUcK`qY diff --git a/assets/tw/guild/OCR_GUILD_OPERATIONS_PROGRESS.png b/assets/tw/guild/OCR_GUILD_OPERATIONS_PROGRESS.png deleted file mode 100644 index 9876394b4384be1ed243437cf783734eeba8e748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3952 zcmeH``#02i7{@1EsF2 zrwRa2N1t@@0$`i`s`Oe#N$!3$!fcT{SgPw6c=+5wl&qhgkq@&k(*Gkd=XKo{(i8JUO1a&9K54 zo>!geFx&w*OgeDFz@+oRiG;Irjqaz)YG-b_-=7$vxYh2Mu%#% zA54D(X7r&929?7cNf{dU4(Pcz7ynsvDn%#AnENKHTm#-op#WuhLJCt5P!LcMP!LcM zP!RZ!1lCLA(c1xt%cJM42$nA{IP0$B#;+~vW90v(f*tbnFezgf0Fl*n9nRCK%QdV7 zQ)*b3ogFy_s zqrM#k{<@+hNtL0LXN0`O}BNFQtx! zMaYJ^#T2~fp35wrkFO6_Lg!RSF4!WvW!0>yq!q0G$ek2fO#lV0W@_z)KOoLI)H@I% zE^Cb;A`$ke3v`_4AiKWN&R(m-iI7ZKlrQ0Ja^X!Yq3wzwmlX$k!adS2lVyD8O|R zb`AcZf7QkqQAB>@G!SNpJ141`2t1~%(Z@)n@#acWq_q_$2*iW<)j+zG$7f?L+Z=9@ zL?TVGchqqJ1F3e~nOeQr9NXV@D*en7Iqq8ZvT6n~@feL|bnVI61@aoly@5QK&-xN; z6n-_i`J7on4a>*>+9gN5JUngj9QQ?@YT9OZ@dr>pYZN3ITO;&(Lz5mxH9@@<%u$Y= zuVzhuCGvVq5wbKHSAy=uG$l?n3B8J}x8|B}%=8S(E26@6LF$R!sd(BPd!ESTIZGA` zt7@4?yMmud!>Ure$G+JilX?>!_a)iC%*DG90%j=CN4La!@1UKjTR@=st+|i2_tKzt zh-9Lj{q8b7~*M8bTFkxIqqABUNuyO-cPBM4c!#42Hj`*sWESaef~u9ua{w%Cy^LEqd~&RZYv(JZ12-+K@rpyC;0JbbWwFnk{7D@p zxCjfEJ#fR2Lv1vMl0RGV#D3{td)IP?H#M;^ab@t+Y%Fh$wbn40ERmqNP#8oO$3=qy z-(CxLd|aLVUM;epbG_3D#&A&A(LlWhlOFUcUPW6j^{#IxyL&sN%(st>xTdb2do0O( zrn)(0>}C8wz@mUsGph#Q4^`pj*QdJ$sEc2sJWR6?T~;x)rSKHGH9P0{jd;ml@|j*n z;0zZWB_+}2^Mnhg)~MWWsU}KZwN6iX({8QG{_0_=1dQHF%NaW#5qT7`H$*t?gX!%L zZDTqog!e6Pq+KtCZBEH*>(*u7X^;^gxG8dlDG2=U2|Q0))%jb65go*BjNB|1?dst| I`zi3ozsLHUcK`qY diff --git a/module/guild/assets.py b/module/guild/assets.py index 2d0715cad..910ae66dd 100644 --- a/module/guild/assets.py +++ b/module/guild/assets.py @@ -34,4 +34,4 @@ GUILD_REPORT_CLAIMED = Button(area={'cn': (738, 595, 1078, 637), 'en': (851, 602 GUILD_REPORT_CLOSE = Button(area={'cn': (1059, 93, 1102, 136), 'en': (1059, 93, 1102, 136), 'jp': (1059, 93, 1102, 136), 'tw': (1059, 93, 1102, 136)}, color={'cn': (71, 31, 32), 'en': (71, 31, 32), 'jp': (71, 31, 32), 'tw': (71, 31, 32)}, button={'cn': (1059, 93, 1102, 136), 'en': (1059, 93, 1102, 136), 'jp': (1059, 93, 1102, 136), 'tw': (1059, 93, 1102, 136)}, file={'cn': './assets/cn/guild/GUILD_REPORT_CLOSE.png', 'en': './assets/en/guild/GUILD_REPORT_CLOSE.png', 'jp': './assets/jp/guild/GUILD_REPORT_CLOSE.png', 'tw': './assets/tw/guild/GUILD_REPORT_CLOSE.png'}) GUILD_SUPPLY = Button(area={'cn': (1077, 617, 1233, 658), 'en': (1079, 619, 1231, 656), 'jp': (1077, 614, 1233, 655), 'tw': (1079, 619, 1231, 656)}, color={'cn': (84, 104, 154), 'en': (137, 87, 91), 'jp': (98, 100, 107), 'tw': (137, 87, 91)}, button={'cn': (1077, 617, 1233, 658), 'en': (1079, 619, 1231, 656), 'jp': (1077, 614, 1233, 655), 'tw': (1079, 619, 1231, 656)}, file={'cn': './assets/cn/guild/GUILD_SUPPLY.png', 'en': './assets/en/guild/GUILD_SUPPLY.png', 'jp': './assets/jp/guild/GUILD_SUPPLY.png', 'tw': './assets/tw/guild/GUILD_SUPPLY.png'}) OCR_GUILD_EXCHANGE_LIMIT = Button(area={'cn': (960, 383, 975, 403), 'en': (999, 383, 1018, 402), 'jp': (971, 384, 985, 403), 'tw': (962, 384, 975, 403)}, color={'cn': (59, 46, 47), 'en': (91, 93, 103), 'jp': (95, 101, 107), 'tw': (72, 57, 59)}, button={'cn': (960, 383, 975, 403), 'en': (999, 383, 1018, 402), 'jp': (971, 384, 985, 403), 'tw': (962, 384, 975, 403)}, file={'cn': './assets/cn/guild/OCR_GUILD_EXCHANGE_LIMIT.png', 'en': './assets/en/guild/OCR_GUILD_EXCHANGE_LIMIT.png', 'jp': './assets/jp/guild/OCR_GUILD_EXCHANGE_LIMIT.png', 'tw': './assets/tw/guild/OCR_GUILD_EXCHANGE_LIMIT.png'}) -OCR_GUILD_OPERATIONS_PROGRESS = Button(area={'cn': (928, 501, 978, 521), 'en': (928, 501, 978, 521), 'jp': (928, 501, 978, 521), 'tw': (928, 501, 978, 521)}, color={'cn': (83, 88, 101), 'en': (83, 88, 101), 'jp': (83, 88, 101), 'tw': (83, 88, 101)}, button={'cn': (928, 501, 978, 521), 'en': (928, 501, 978, 521), 'jp': (928, 501, 978, 521), 'tw': (928, 501, 978, 521)}, file={'cn': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'en': './assets/en/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'jp': './assets/jp/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'tw': './assets/tw/guild/OCR_GUILD_OPERATIONS_PROGRESS.png'}) +OCR_GUILD_OPERATIONS_PROGRESS = Button(area={'cn': (1064, 501, 1114, 521), 'en': (1064, 501, 1114, 521), 'jp': (1064, 501, 1114, 521), 'tw': (1064, 501, 1114, 521)}, color={'cn': (89, 94, 107), 'en': (89, 94, 107), 'jp': (89, 94, 107), 'tw': (89, 94, 107)}, button={'cn': (1064, 501, 1114, 521), 'en': (1064, 501, 1114, 521), 'jp': (1064, 501, 1114, 521), 'tw': (1064, 501, 1114, 521)}, file={'cn': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'en': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'jp': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'tw': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png'}) From 4082abda8f49b16bd237618deeb061fb9b119645 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:43:01 +0800 Subject: [PATCH 22/56] Fix: Catch account kicked by server maintenance --- module/handler/info_handler.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/module/handler/info_handler.py b/module/handler/info_handler.py index f373722bd..23fdd1bd6 100644 --- a/module/handler/info_handler.py +++ b/module/handler/info_handler.py @@ -173,6 +173,12 @@ class InfoHandler(ModuleBase): if not self.device.app_is_running(): logger.error('Detected hot fixes from game server, game died') raise GameNotRunningError + if self.match_template_color(LOGIN_CHECK, offset=(30, 30)): + logger.error('Account logged out, ' + 'probably because account kicked by server maintenance or another log in') + # Kill game, because game patches after maintenance can only be downloaded at game startup + self.device.app_stop() + raise GameNotRunningError self._hot_fix_check_wait.clear() return appear From fc90b8e72b0facb32a91d8ce01e089f8301377ea Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:43:47 +0800 Subject: [PATCH 23/56] Fix: Disable raid tasks if another event is ongoing --- module/campaign/campaign_event.py | 34 ++++++++++++++++++++++++++----- module/campaign/run.py | 1 + 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/module/campaign/campaign_event.py b/module/campaign/campaign_event.py index 76f46715c..9ffbb6012 100644 --- a/module/campaign/campaign_event.py +++ b/module/campaign/campaign_event.py @@ -17,14 +17,18 @@ class CampaignEvent(CampaignStatus): tasks (list[str]): Task name """ with self.config.multi_set(): + # Disable normal events for task in tasks: - if task in ['GemsFarming']: + if task in GEMS_FARMINGS: continue keys = f'{task}.Scheduler.Enable' logger.info(f'Disable task `{task}`') self.config.cross_set(keys=keys, value=False) - for task in ['GemsFarming']: + # Reset GemsFarming + for task in tasks: + if task not in GEMS_FARMINGS: + continue name = self.config.cross_get(keys=f'{task}.Campaign.Name', default='2-4') if not self.stage_is_main(name): logger.info(f'Reset GemsFarming to 2-4') @@ -50,7 +54,7 @@ class CampaignEvent(CampaignStatus): command = self.config.Scheduler_Command if limit <= 0 or command not in tasks: return False - if command == 'GemsFarming' and self.stage_is_main(self.config.Campaign_Name): + if command in GEMS_FARMINGS and self.stage_is_main(self.config.Campaign_Name): return False pt = self.get_event_pt() @@ -75,7 +79,7 @@ class CampaignEvent(CampaignStatus): command = self.config.Scheduler_Command if command not in tasks or limit == DEFAULT_TIME: return False - if command == 'GemsFarming' and self.stage_is_main(self.config.Campaign_Name): + if command in GEMS_FARMINGS and self.stage_is_main(self.config.Campaign_Name): return False now = datetime.now().replace(microsecond=0) @@ -128,7 +132,7 @@ class CampaignEvent(CampaignStatus): """ if self.appear(CAMPAIGN_MENU_NO_EVENT, offset=(20, 20)): logger.info('Event unavailable, disable task') - tasks = EVENTS + COALITIONS + GEMS_FARMINGS + tasks = EVENTS + RAIDS + COALITIONS + GEMS_FARMINGS self._disable_tasks(tasks) self.config.task_stop() else: @@ -177,6 +181,26 @@ class CampaignEvent(CampaignStatus): self.ui_goto(page_coalition) return True + def disable_raid_on_event(self): + """ + Disable raid tasks (or coalition) when entered an event, + to be foolproof if user forgot to disable raid tasks when raid is over and another event is ongoing + """ + command = self.config.Scheduler_Command + if command not in EVENTS + GEMS_FARMINGS: + return False + if command in GEMS_FARMINGS and self.stage_is_main(self.config.Campaign_Name): + return False + + tasks = RAIDS + COALITIONS + MARITIME_ESCORTS + tasks = [t for t in tasks if self.config.is_task_enabled(t)] + if tasks: + logger.info('New event ongoing, disable old event tasks') + self._disable_tasks(tasks) + return True + else: + return False + @staticmethod def stage_is_main(name) -> bool: """ diff --git a/module/campaign/run.py b/module/campaign/run.py index 37cdc6dbd..891c88103 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -372,6 +372,7 @@ class CampaignRun(CampaignEvent): self.campaign.ensure_campaign_ui(name=self.stage, mode=mode) else: self.campaign.ensure_campaign_ui(name=self.stage, mode=mode) + self.disable_raid_on_event() self.handle_commission_notice() # if in hard mode, check remain times From 2e395ac8ea00c1b5a6344754536d923d0a48364b Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:48:32 +0800 Subject: [PATCH 24/56] Upd: [TW] Event entrance of Windborne Steel Wings (event_20240815_cn) (#4585) --- campaign/Readme.md | 1 + module/config/argument/args.json | 32 ++++++++++++++++---------------- module/config/i18n/zh-TW.json | 2 +- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/campaign/Readme.md b/campaign/Readme.md index 6e5243e66..1a394a7c1 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -231,3 +231,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250116 | raid 20250116 | Spring Fashion Festa | 华裳巧展喜事长 | Spring Fashion Festa | 新春華裳協奏曲 | - | | 20250123 | raid 20250116 | Spring Fashion Festa | - | - | - | 華裳巧展喜事長 | | 20250206 | event 20220818 cn | Operation Convergence Rerun | 复刻远汇点作战 | Operation Convergence Return | 結像点作戦(復刻) | - | +| 20250213 | event 20240815 cn | Windborne Steel Wings | - | - | - | 鐵翼擎風 | diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 4adaf2c98..82f65b836 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1716,12 +1716,12 @@ "display": "hide", "option_bold": [ "event_20220818_cn", - "event_20231221_cn" + "event_20240815_cn" ], "cn": "event_20220818_cn", "en": "event_20220818_cn", "jp": "event_20220818_cn", - "tw": "event_20231221_cn" + "tw": "event_20240815_cn" }, "Mode": { "type": "select", @@ -2058,12 +2058,12 @@ ], "option_bold": [ "event_20220818_cn", - "event_20231221_cn" + "event_20240815_cn" ], "cn": "event_20220818_cn", "en": "event_20220818_cn", "jp": "event_20220818_cn", - "tw": "event_20231221_cn" + "tw": "event_20240815_cn" }, "Mode": { "type": "select", @@ -2515,12 +2515,12 @@ ], "option_bold": [ "event_20220818_cn", - "event_20231221_cn" + "event_20240815_cn" ], "cn": "event_20220818_cn", "en": "event_20220818_cn", "jp": "event_20220818_cn", - "tw": "event_20231221_cn" + "tw": "event_20240815_cn" }, "Mode": { "type": "select", @@ -3936,12 +3936,12 @@ ], "option_bold": [ "event_20220818_cn", - "event_20231221_cn" + "event_20240815_cn" ], "cn": "event_20220818_cn", "en": "event_20220818_cn", "jp": "event_20220818_cn", - "tw": "event_20231221_cn" + "tw": "event_20240815_cn" }, "Mode": { "type": "select", @@ -4410,12 +4410,12 @@ ], "option_bold": [ "event_20220818_cn", - "event_20231221_cn" + "event_20240815_cn" ], "cn": "event_20220818_cn", "en": "event_20220818_cn", "jp": "event_20220818_cn", - "tw": "event_20231221_cn" + "tw": "event_20240815_cn" }, "Mode": { "type": "select", @@ -4884,12 +4884,12 @@ ], "option_bold": [ "event_20220818_cn", - "event_20231221_cn" + "event_20240815_cn" ], "cn": "event_20220818_cn", "en": "event_20220818_cn", "jp": "event_20220818_cn", - "tw": "event_20231221_cn" + "tw": "event_20240815_cn" }, "Mode": { "type": "select", @@ -5358,12 +5358,12 @@ ], "option_bold": [ "event_20220818_cn", - "event_20231221_cn" + "event_20240815_cn" ], "cn": "event_20220818_cn", "en": "event_20220818_cn", "jp": "event_20220818_cn", - "tw": "event_20231221_cn" + "tw": "event_20240815_cn" }, "Mode": { "type": "select", @@ -5822,12 +5822,12 @@ ], "option_bold": [ "event_20220818_cn", - "event_20231221_cn" + "event_20240815_cn" ], "cn": "event_20220818_cn", "en": "event_20220818_cn", "jp": "event_20220818_cn", - "tw": "event_20231221_cn" + "tw": "event_20240815_cn" }, "Mode": { "type": "select", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 459995498..5a937fd0e 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -733,7 +733,7 @@ "event_20240425_cn": "共鳴的PASSION", "event_20240521_cn": "Light of the Martyrium", "event_20240725_cn": "Interlude of Illusions", - "event_20240815_cn": "Windborne Steel Wings", + "event_20240815_cn": "鐵翼擎風", "event_20240829_cn": "埋葬於彼岸之花", "event_20240912_cn": "Ode of Everblooming Crimson", "event_20241024_cn": "Tempesta and the Sleeping Sea", From 7845b9b59e7b7137aaec08e9bb82118bd09a50d2 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 18 Feb 2025 23:18:03 +0800 Subject: [PATCH 25/56] Fix: Subpress EXP_INFO_B in event_20240815_cn (#4588) --- campaign/event_20240815_cn/campaign_base.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/campaign/event_20240815_cn/campaign_base.py b/campaign/event_20240815_cn/campaign_base.py index db32d830b..415e17f00 100644 --- a/campaign/event_20240815_cn/campaign_base.py +++ b/campaign/event_20240815_cn/campaign_base.py @@ -4,6 +4,7 @@ from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.combat.assets import GET_ITEMS_1 from module.exception import CampaignNameError from module.logger import logger +from module.ui.page import page_event class CampaignBase(CampaignBase_): @@ -82,3 +83,9 @@ class CampaignBase(CampaignBase_): self.ensure_no_stage_entrance() return True return super().handle_campaign_ui_additional() + + def handle_exp_info(self): + # Random background hits EXP_INFO_B + if self.ui_page_appear(page_event): + return False + return super().handle_exp_info() From 8e45d2fa468935e70f69b9a4f44b8dbcf556983d Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 18 Feb 2025 23:20:13 +0800 Subject: [PATCH 26/56] Opt: Fast retry GOTO_MAIN after clicking AUTO_SEARCH_REWARD --- module/os/map.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/os/map.py b/module/os/map.py index a329a1ec8..79c02bc91 100644 --- a/module/os/map.py +++ b/module/os/map.py @@ -4,7 +4,6 @@ from sys import maxsize import inflection from module.base.timer import Timer -from module.combat_ui.assets import PAUSE from module.config.utils import get_os_reset_remain from module.exception import CampaignEnd, GameTooManyClickError, MapWalkError, RequestHumanTakeover, ScriptError from module.exercise.assets import QUIT_RECONFIRM @@ -552,6 +551,7 @@ class OSMap(OSFleet, Map, GlobeCamera, StrategicSearchHandler): self.config.task_stop() if self.appear_then_click(AUTO_SEARCH_REWARD, offset=(50, 50), interval=3): + self.interval_clear(GOTO_MAIN) continue if pause_interval.reached(): pause = self.is_combat_executing() From e1b11c0d69477afbd62fbeca44561fa05d1d114e Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 19 Feb 2025 00:00:23 +0800 Subject: [PATCH 27/56] Fix: Subpress handle_exp_info after entering page_main (#4591) --- module/os/map.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/module/os/map.py b/module/os/map.py index 79c02bc91..6175d4754 100644 --- a/module/os/map.py +++ b/module/os/map.py @@ -539,6 +539,7 @@ class OSMap(OSFleet, Map, GlobeCamera, StrategicSearchHandler): logger.info('Interrupting auto search') is_loading = False pause_interval = Timer(0.5, count=1) + in_main_timer = Timer(3, count=6) while 1: if skip_first_screenshot: skip_first_screenshot = False @@ -552,24 +553,30 @@ class OSMap(OSFleet, Map, GlobeCamera, StrategicSearchHandler): if self.appear_then_click(AUTO_SEARCH_REWARD, offset=(50, 50), interval=3): self.interval_clear(GOTO_MAIN) + in_main_timer.reset() continue if pause_interval.reached(): pause = self.is_combat_executing() if pause: self.device.click(pause) self.interval_reset(MAINTENANCE_ANNOUNCE) + is_loading = False pause_interval.reset() + in_main_timer.reset() continue if self.handle_combat_quit(): self.interval_reset(MAINTENANCE_ANNOUNCE) pause_interval.reset() + in_main_timer.reset() continue if self.appear_then_click(QUIT_RECONFIRM, offset=True, interval=5): self.interval_reset(MAINTENANCE_ANNOUNCE) pause_interval.reset() + in_main_timer.reset() continue if self.appear_then_click(GOTO_MAIN, offset=(20, 20), interval=3): + in_main_timer.reset() continue if self.ui_additional(): continue @@ -579,13 +586,18 @@ class OSMap(OSFleet, Map, GlobeCamera, StrategicSearchHandler): if not is_loading: if self.is_combat_loading(): is_loading = True + in_main_timer.clear() continue - if self.handle_battle_status(): - continue - if self.handle_exp_info(): - continue + # Random background from page_main may trigger EXP_INFO_*, don't check them + if in_main_timer.reached(): + logger.info('handle_exp_info') + if self.handle_battle_status(): + continue + if self.handle_exp_info(): + continue elif self.is_combat_executing(): is_loading = False + in_main_timer.clear() continue def os_auto_search_run(self, drop=None, strategic=False): From 9ddbe2eadf35c33254c7b91eac073b4f1b9f5370 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 19 Feb 2025 00:16:09 +0800 Subject: [PATCH 28/56] Fix: Leave page_channel during ui switching --- assets/cn/ui/CHANNEL_CHECK.png | Bin 0 -> 7895 bytes module/ui/assets.py | 1 + module/ui/page.py | 6 ++++++ 3 files changed, 7 insertions(+) create mode 100644 assets/cn/ui/CHANNEL_CHECK.png diff --git a/assets/cn/ui/CHANNEL_CHECK.png b/assets/cn/ui/CHANNEL_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0d77d634c454b241da5de0fc60ae7335adf7a8 GIT binary patch literal 7895 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 Date: Wed, 19 Feb 2025 00:55:45 +0800 Subject: [PATCH 29/56] Fix: Installations in containers have no access to remote access (#4595) --- deploy/docker/Dockerfile | 2 +- deploy/docker/Dockerfile.cn | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/docker/Dockerfile b/deploy/docker/Dockerfile index 7d9296bb1..cc68a0bb6 100644 --- a/deploy/docker/Dockerfile +++ b/deploy/docker/Dockerfile @@ -9,7 +9,7 @@ COPY requirements.txt /tmp/requirements.txt # Initial download of UiAutomator2 is slow outside of China using appetizer mirror, switch to GitHub RUN apt update \ - && apt install -y git adb libgomp1 \ + && apt install -y git adb libgomp1 openssh-client \ && git config --global --add safe.directory '*' \ && pip install -r /tmp/requirements.txt \ && rm /tmp/requirements.txt \ diff --git a/deploy/docker/Dockerfile.cn b/deploy/docker/Dockerfile.cn index 3bf41604a..2db750c3a 100644 --- a/deploy/docker/Dockerfile.cn +++ b/deploy/docker/Dockerfile.cn @@ -19,7 +19,7 @@ deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib\ deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" \ > /etc/apt/sources.list \ && apt update \ - && apt install -y git adb libgomp1 \ + && apt install -y git adb libgomp1 openssh-client \ && git config --global --add safe.directory '*' \ && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' > /etc/timezone \ From b52e33e2b946b65a26c847a5b169ca31129224bf Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 19 Feb 2025 01:29:40 +0800 Subject: [PATCH 30/56] Add: Meta sync receive - TODO: [EN][JP][TW] Update SYNC_ENTER SYNC_TAP --- assets/cn/meta_reward/SYNC_ENTER.png | Bin 0 -> 8576 bytes assets/cn/meta_reward/SYNC_REWARD_NOTICE.png | Bin 0 -> 5556 bytes assets/cn/meta_reward/SYNC_TAP.png | Bin 0 -> 12800 bytes module/meta_reward/assets.py | 3 + module/meta_reward/meta_reward.py | 69 +++++++++++++++++++ 5 files changed, 72 insertions(+) create mode 100644 assets/cn/meta_reward/SYNC_ENTER.png create mode 100644 assets/cn/meta_reward/SYNC_REWARD_NOTICE.png create mode 100644 assets/cn/meta_reward/SYNC_TAP.png diff --git a/assets/cn/meta_reward/SYNC_ENTER.png b/assets/cn/meta_reward/SYNC_ENTER.png new file mode 100644 index 0000000000000000000000000000000000000000..c200b54af81ed35dc87b469632e1ccd974e6f752 GIT binary patch literal 8576 zcmeI1`8U*G{Kwx>p^`+%-YB9h$sVJ{o^=>Yw(vogF&JYvlur@aLSigsZN^sFmqBG8 zOGC&m+r${#U@T*NeLm;&{o(sJe7on|^SbxkU+#IlmixT-zBD$}Wx@BxD8G;Dv=ilUfC2Cx zlDc}a{~y(|fkJ$64MzI`chv zFE&Vtc2_X_y>X|i0RNe@XUW$b-{WNFV!=nZf5B&BQ9H-0^zqg>g(aM=x^ zH-{|A0jxmD3!@gpYNjf@XA5fe1Vik3%K?AjE{Y=giuY_1aKTkhHi!xU$<2EScW;~k zdeidf0HE<;xrzCIg(~o(wzw$J`U^#iOlbOTe zib^!QWBgB0A2WA){7I05j@;{reBq^NP7_dDr*A$3=DvH9t&Yg1q%Ws(oXy?+#PLpH z*%(?(qxP+or=Lw2e=s2L)_oA-jcI>}Ao$6#*+#s{^&s$83aUj^=N1tj{zm!%VKMPe z5rkXkU0#hk*u09;eEiaqSG0r6X~9z7JVD+`z*5ow5?@QU!y5BdhS&&>6=u7?FMRcU zmYAq*sc-qWh*RVO>-6%%3Algwv9064?@s zULSOQo3G(iX^WoKXUV+^$xpecC-1DjaIzpr_I~<1tVu5>`v)^NS|#U^F6^DZv9xIv zhC>dSajh54^#GqQnK$%3!_C!=`b2ukubyQxQcyGPd)k1A;UQsh>^Io21fksUgY z*Drfq4!K;!Q*&85UBB?uU|M>onaqeRU%KmCwzqJorNoXz=%u9Yi>WH9=BcPuBGwFw zfT|A#Vb7WsL)nV$%)<(`pcTe*7?vMg#X}eYXah!}tPc_ZNigm=vCnI=KYX_D#QOQg zbFFtTbn?ucYT7TyUEyk%b>6VNKkRGHNV@6q*1*yF^WKWS|EU8$f9Vi?(+3EwONmR8 zOV*-K?}_v6pJvvTM>F;MuJp0?g-9|=s!M(vb}w})MU^U!1&=k2Ig)+JTx8PN8qz!K zZr07LZ55ab70FVsP;XNIynYW_v^bIx)mh!2Qwn|h7iTA{6+S;<&AO;+A<*txa?+vykR;lC&_e8=xjsIMQg$KTVt zk(B>S?i;2R^KHq(mCyA(B8wu=UHC8&e=*HJjoTDf6jS7t6O2z?;9adBs2bePLpPu& zN=IQoCVSM{!io=MPDh2L}@#JJ1e^boS;!frfBxC z46Jj!)p`bp4|%KtR&(C(TVe#agBfyybE29Gn?TcQO(LjaR62@@mVIz%AAgvz+x#nN zlWW89)Z-IhPAr_jJ>`8`!RWy#bTa*90h9cxxKjhyYgK(*vIqT9RzI~YpM9+-dne!QDZ~UCf7AA7*xEGiD@Yw;XR`OPfp-Ru+UQGL} zz7Q#V-&mT*XraiGJD35sHDi#_&{0|ESNXq;g7TN@gB})$L8?jS-oe>orC$H*O@e&Ic{Ry7`i$ zx~cObdkD(-CC}&jguF^fnellped!N30yuH4uXx1 zP3hHilSw+He3DlQ)vCE%59fYw==+Ox)>6KWxCK6YnBJ7%`(XF&_}m={sOZ>m^JG8><$R>Tr8`q=DJzXtHv%m@aGGJ;UIVMo zCKGra`Rbb&QIoaW0Y+`v2_Xd`OgoxuBzHf!=R|pP^Jf+qL?KR4N5y*q9RVLhlQROU zydO!N|9WrXi`aBwXvm!L@ArM*CcgDfr-#>UGm~_JZVae2BTFRnVDHr4%T+h4mh)_KVci35LixY8arHO+Gkr1 zucUu+Zh_70K5lv3|ILbR?L13VHa+ENFzVNUc8~Uuh?YoPLY9yaA1g0z^RK?-Uqzpb zIQqL$=0`y!L@{ytaQ5I~za{PG`q{nM{^qhE48?b?7*np&A<`k#*cYU>QAjK88xLEn zU8|q&zzL;ar`@F+QwaM`9Yx=bs9<6!ohD8Fn{se%Am{e6+7x!uffxWl@HGI4hy;MW zqhq@S07w}CSbhuuDsKUR8~)n9O$z|HN_92vnFWrmOd3S3y9%F#-#r7m`%M3O z4Ejidken@Mj<=1*~%-?O(kKY$O@UCxTt%#KfcTU zCahR#vi-#v%#7u2yw0kCJpQw4Z8F$^!2OBZ)Nu_>|lPQDSGEU_PhM+#Z=^L3NZxkrV^iz$!m+m3+!Y znRsOWMB8(p3NJ;f`vGl+62)$!9pohY5`;|3LA{k77>vS1>xjq5LLM!u9xXd0kN*}a z7YPUoY{D{Ox`H;4e6IDQ&&k&6bhkzsyRtWM+94ldkp|PySZ?rZLLEhh!C3p_zuE&p zOAh*QBmj%pE`d$e?>vg()YPya)~pLbO507EfuTlBh6z64dEZK%dSVk#L1)3;vQuXwp5}(7Nn(_VLOI74doO+ z?X&S!NkH9(OS#lkVt^#Qx=QXDNVVd0tMY<}g&LP4D%|t*J}u$ZYP!mne7FSc#-!9I z5)?W{C0L7(a>NYq++yS+HY_Km%r_ZdfeChdr1^>oL*JFzAIwlJSQaZkGU+_>WmgZk zw*Gfpw_!($R4w9*L7^#rRKRAp5$aJ`6^|`XQFN$OK{ScjUeR2a3K>gDhMPm1cE%?2 zn2O8I6{YN_>tqZ^T+j(#{X#d@ReCzurr`~>a$Q5B6K~iFnf~qZ`>Ne_y5dBIq7+d4 z*p7Dpbui5&!-z48Hf0QbU25?Uh%ZMyUDnvy z?L>!CDpT=7pmCchplucwj~pp&5C!E3bdPU$&@ zW4Y7c2*#RC9Tbh{9k9J2W8=*1(pig_kJjV1Xi8L{13G=ajhr%o+xxO3VTAGvBW_N$ z9Wd3<$H(WOF)0lbZF$xF@u2$7Pob3(BB0z@9b&uNU@y9XF#LOe2-h5#H_@?LAGS`4 z>~%mRIG1MYeoX~tj*xfdB;Z7^gH5~nWbiz;e_T7(KqlT`OW;S1yc}~20I1Gsxsra1 z>_1UQr-@5~ruGhU$mgR*!f9HbtZb-&%A;Rj;<)__M_kxH9TMof)Q&s_B9ihEHodoS zrx>41x|Ly*;Th~@$_}TmyYMS6>31g$7BZ8KR9q2BT)n>ZHlMwD`U3qhva7&NkoMf9 z8w2wd+Mc-@7rs>u?COYwy2~%g*9;EN`R#Wc>}%ymFMm}!df#P$RzPnR`XQ7q zhq-3>YZO2(0>HTpeDl%{Q~+|ZIIRO$^Cs~W=DU=d&n z6{sP9SxZo?;nVE4<#5$wW&Jm{>Z@Uw{N&%dJC2D4 zZkle$UH+(wJel_`6Ja>iOUe87Fj*F|is&nP@OH#@uo}4va#a0bALP@p&o*LeNFeSB z7k~`8hL`iC@MN;xj`t(ZZ{ z=z1ycPgYzWW*WR28u`(mqkXeP96$9j2?@RuloaV+jZ%*TW5F3^u@z#BSc)S0YjtK8 zpIw4UqsqAF>BimP>+2PBR@2!f)u|1WQagQd*c%~eiNK~u?oTd6oB#rc3)IsE(TLQ6 z^-V*KN>bylV^Xu-;__cF7e$Htkqyr11|)dJciX6jR7wbxP0!Y6^qL!wjxOwVW*0BW zq?n#{)RchKEkRJBHPL127-*FEq>??cJ|1prmF<5oC&)KgB9A{mg|c4fvrmY-4$e6T9U zgv^P886N8L!$g*mtt!N_m*7Pz8`iz@4%n(dc{@qL_G3`Gh!#;>9Ey<^a-GaXgbr$? zB#g8#?@JLIm+Ay8hIZl8s=eLfF`Y>wLzqCCT^2--ohe*NFibYb(*Q+~;?9w7r!bN0 zJw|ND6^6W(R4t&>(+@RU^LC*PwRdvh;Z5Ja3j>V6dI|bfdmiCQMJ!xRrvt_}bR9GX z9Y+n?(L(ENh|uv@bAJ_j#dK;Kx^{2s=Yuq-3kG4R!7k-JUGk`U6(garh^k-rvc@Q1 z?2-o`JG;TLvwtHvObWOBgnXg-vISDJxbP;mrqA4Auj08eWi=uOv9fCJBB0Z5l&c5i z;LnrM`sRmo{w6p&2oX%h+X*HoJ4Hi*%liMzKGlj1t7OqX^pPR!;tRd~HSIqAkO!VyZ8r0%Q-T0{6dO_nm5z6EqY%)?n-=T3g~4 zCTwEIMT(LZ8`;n8R#kHFdw&oYB9i+mIMG+=Tg8HPn(M|_Ic>e|F4`}eLGnJ21u|c* zY@iTKj?sy94@b!amwD|=sXvN~=c>~obhM@H6e2VE7KmEt8#hPri-b+be8uurO=ufs z&d-5UGr0Z-Y&m@A?ReRQn*H)H+2_NYnfoS2x-5+Ri~s-@J)|}Y z0D9^X@&yW^I)t!34b{PXkk)wKunwf?O?YqVNU}N_t-fQZLtZAXfE!P z`ACb_=mAD#LBdqg8KR5Eg9MvIiyO)-!lUJH!b8Z*%X{DV>gV(4_j|CtY>_89Bva=~ z+`%PO>=l(E;S^(JYiC0wgc~_QC&E5QYH^`&17MXF8yw;PQhlGM${Rp{&%pW99PN`w zF?A-AmOvyGOo(yJGtuBspyRxG2N&qz1uxBB-(mzA0AR3TnquHN3s~CJQ=Xj|NUpzW0&nLNOGMIuW>RK%_O<>CT*S;T{6Xuh6H}s7EtprD z4)C+=&afG={Omk&PUJkTK@T$k{5yRg4wcn$^K&zkbI$V^@@8Afp~tGXn40L?_+kA+ z2pwQI>Lm}`&CU+e`n1!$3~2JeUkAfz;5xozdtn4tWW)F+WG4};ypIqnEH>%5B6y0C ziD_BFvA98QI#KQD!ld^^V#GG}_HZO*72L^1f9&amLL?ZyDZ@ zFwGGwG>}AAtNuWMh}e*M$j_7t*j*GAuoM8&n|4wVQZ%4DyKEYO`d_>^o@KxdK0yJ{ zE{Zz$QiFl{0~ev0HUEQPeKQ>5a6%iwe7gAxyXJ|R$Wx5PyjdE2=FKWYbZ=hL@)w=V zon){1Ag|0aKf!S$YS9ON!k)LVg||KqMyJsM<#Z5LNjT}4JS5fwh36#Gi8&w@(;~}6 z781Bj#o9W2%OH47_f%V?__~ZQ*QKNzh+W)Bhls+1{Rj2B@)=RprnKK60f=|cg!vzQ zD)Q^|S7ft|%qsEdIDBo}d>oj+%w)sX~|?9^Hu8_qawuk+(fEtg7L!ju85z=sh>GARWi|;5t;MP%`N;a)CaK7nap2Uu)Vm64u5*p;%9`=pr z#Qd$lMIS!(W7`-v|}l;@Me?KLaSL0>fO zqO`{&L&xjYJ4*(E^m_t+};vCgzEwr(V#_qW%v%{?w03f=@$Gqd63*E{I{GU^dgQABd_eV+J$ra0d<2m3WtFrC_+4Gr{|mBSG=!?NN^_4vuaLBW0~+Z8ME$yE8m;o$LB) zzWR4{bx4mAh6tTY$(IK5JqjHff7FlcC&fO|$#2t7yqMUYHJlYjqR%qSq7WXT)zDb< z7Wz9uZ}7&V^rGjWCB{U+GLJb=C6Dy>Sw&t&Yha$|IM)a?srV7!ivPG^=_24#>{qa%1b=!B zN8-p1%!ZqJmOm)>dK^N^oaJAs>woigt2FO@-e|=S&u?R0s%_yf_6*PG33S?iR3&R{ zu2QU~?sQETl;@SVY~bc)ZwB79zPZ;RWc)f`vT#t&vty+7`a}aM)LunR_4aPh05jod*IQ`9gf1q5DD1|U1K$bfI(tsx`T5_bHD>;I{3+6dgc<8SmxkoE z6#TfElBtu&I1$@5DC@(b|JQ3B5n={E)en zk)M%Yiehogs*(CGS9_+`*jY*{on;0)=lNM6J^nLgMtsL_V}u(MYtUC(gQ_%P@#X6wVzBkvgjkc#dmiybGkDN>d0SN7 ztzfs+{&12jsXFVxWXcLrQ0C|cWp`NgNhfmjXxxZ z2b;!%LN{1r1i3H&BxfwuzmW>I^k~ot-}35Ti5^SgcNC~=nu{1C>INCN6{dtf31!&U zAuqc7dt*kcnwqL%o~VmSLP!;#*}O>a;k@PCpf^4?=U7`bWSp&&Sb^ z-QziTYqy|_NUT)9N>czqrqr`YwYY)&>tShu;7vi@#@eF@vi!7DK)X_kWnodl8P&C& zndtQC@>}JF1xD(s-*QH=6odU74_i~)1{bZ~LUp+Rib1U%rE}xwe2VRAz0al?#c@QU z_F9E%rK)a(&%q?J>bm#hZ3=1G@=B%urs3k{KJwSQyY9^ce&7FmKX3aO+d%%bBv9)m zId+ODQMdIcaC;dZ#JFNGY8#RgT(#dgeDIrLm+kl6n!{JOn>{D~*f-nvezayIv%=yF z4>OLw#!vR^cIgg?UlmVEDG(MGVBv3AztxjISzcYv+50&HeS}@~doe$LFtvBB*J^)g zm1!rjx2Y0~-|!{Bz*niXi?<8c_h41mp6*xljD(Ykr z6t(%V!+lxGy^TGI{>K-n-KK~W5@iTLhy(zUF#zlwQT+k{0dfHRwg*7v5dd)SG`qH| z)FyONPg}!0cz9{_0}BEHwEIL^Gs@`cJv6R`4&7r-h_T^_)}v-UwqpXv1da*( z9}`d>$f5pD=uMTMUfM&wTFi;4+D%Dn1OaHNB@~u~9kr+e zs6BOKZ>A2-*v6{=ivO)tpW5g9kI1zX$Bh1WI4KX6{+pGb`tI0{2^I literal 0 HcmV?d00001 diff --git a/assets/cn/meta_reward/SYNC_TAP.png b/assets/cn/meta_reward/SYNC_TAP.png new file mode 100644 index 0000000000000000000000000000000000000000..448a82a03183d55b19a85c216b3fe7f54c3896c3 GIT binary patch literal 12800 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 100% + """ + logger.hr('Meta sync receive', level=1) + received = False + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # End + # Sync progress >= 100% + if self.appear(REWARD_ENTER, offset=(20, 20)): + logger.info('meta_sync_receive ends at REWARD_ENTER') + break + if self.appear(SYNC_ENTER, offset=(20, 20)): + if not self.meta_sync_notice_appear(): + logger.info('meta_sync_receive ends at SYNC_ENTER') + break + + # Click + if self.handle_popup_confirm('META_REWARD'): + # Lock new META ships + continue + if self.handle_get_items(): + received = True + continue + if self.handle_get_ship(): + received = True + continue + if self.appear_then_click(SYNC_TAP, offset=(20, 20), interval=3): + received = True + continue + + logger.info(f'Meta sync receive finished, received={received}') + return received + def run(self): if self.config.SERVER in ['cn', 'en', 'jp']: pass @@ -101,6 +166,10 @@ class BeaconReward(Combat, UI): self.ui_ensure(page_meta) + if self.config.SERVER in ['cn']: + if self.meta_sync_notice_appear(): + self.meta_sync_receive() + if self.meta_reward_notice_appear(): self.meta_reward_enter() self.meta_reward_receive() From ad8157ac6bd30e76403c91922461fe288cc7ec91 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 19 Feb 2025 01:33:48 +0800 Subject: [PATCH 31/56] Opt: Remove confirm_timer in meta_reward_receive() to satisfy current code standard --- module/meta_reward/meta_reward.py | 39 +++++++------------------------ 1 file changed, 9 insertions(+), 30 deletions(-) diff --git a/module/meta_reward/meta_reward.py b/module/meta_reward/meta_reward.py index 7cb2480b3..27eb629fa 100644 --- a/module/meta_reward/meta_reward.py +++ b/module/meta_reward/meta_reward.py @@ -23,26 +23,6 @@ class BeaconReward(Combat, UI): logger.info('No meta reward red dot') return False - def meta_reward_enter(self, skip_first_screenshot=True): - """ - Pages: - in: page_meta - out: REWARD_CHECK - """ - logger.info('Meta reward enter') - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - - if self.appear_then_click(REWARD_ENTER, offset=(20, 20), interval=3): - continue - - # End - if self.appear(REWARD_CHECK, offset=(20, 20)): - break - def meta_reward_receive(self, skip_first_screenshot=True): """ Args: @@ -52,7 +32,7 @@ class BeaconReward(Combat, UI): bool: If received. Pages: - in: REWARD_CHECK + in: page_meta or REWARD_CHECK out: REWARD_CHECK """ logger.hr('Meta reward receive', level=1) @@ -64,6 +44,14 @@ class BeaconReward(Combat, UI): else: self.device.screenshot() + # End + # REWARD_CHECK appears and REWARD_RECEIVE gets gray + if self.appear(REWARD_CHECK, offset=(20, 20)) and \ + self.image_color_count(REWARD_RECEIVE, color=(49, 52, 49), threshold=221, count=400): + break + + if self.appear_then_click(REWARD_ENTER, offset=(20, 20), interval=3): + continue if self.match_template_color(REWARD_RECEIVE, offset=(20, 20), interval=3): self.device.click(REWARD_RECEIVE) confirm_timer.reset() @@ -81,14 +69,6 @@ class BeaconReward(Combat, UI): confirm_timer.reset() continue - # End - if self.appear(REWARD_CHECK, offset=(20, 20)) and \ - self.image_color_count(REWARD_RECEIVE, color=(49, 52, 49), threshold=221, count=400): - if confirm_timer.reached(): - break - else: - confirm_timer.reset() - logger.info(f'Meta reward receive finished, received={received}') return received @@ -171,7 +151,6 @@ class BeaconReward(Combat, UI): self.meta_sync_receive() if self.meta_reward_notice_appear(): - self.meta_reward_enter() self.meta_reward_receive() From 5b4f4538abd656eb53ade0d4777fd1068fa6d56f Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 20 Feb 2025 12:09:27 +0800 Subject: [PATCH 32/56] Fix: [ALAS] get_bbox_reversed should have a reversed threshold by default --- module/base/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/base/utils.py b/module/base/utils.py index 9bce6f004..2eff5f813 100644 --- a/module/base/utils.py +++ b/module/base/utils.py @@ -714,7 +714,7 @@ def get_bbox(image, threshold=0): return x[0], y[0], x[-1] + 1, y[-1] + 1 -def get_bbox_reversed(image, threshold=0): +def get_bbox_reversed(image, threshold=255): """ Similar to `get_bbox` but for black contents on white background. From 0c3a3fa1d63b284ed63b67acdb1e3d399ef93849 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 20 Feb 2025 12:12:19 +0800 Subject: [PATCH 33/56] Fix: Use template match to check account kick --- module/handler/info_handler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/handler/info_handler.py b/module/handler/info_handler.py index 23fdd1bd6..e71cee07d 100644 --- a/module/handler/info_handler.py +++ b/module/handler/info_handler.py @@ -173,7 +173,8 @@ class InfoHandler(ModuleBase): if not self.device.app_is_running(): logger.error('Detected hot fixes from game server, game died') raise GameNotRunningError - if self.match_template_color(LOGIN_CHECK, offset=(30, 30)): + # Use template match without color match due to maintenance popup + if self.appear(LOGIN_CHECK, offset=(30, 30)): logger.error('Account logged out, ' 'probably because account kicked by server maintenance or another log in') # Kill game, because game patches after maintenance can only be downloaded at game startup From a89608ff3f02b741adc4dce934c33e723f3cda45 Mon Sep 17 00:00:00 2001 From: dragonheart107 <153553566+dragonheart107@users.noreply.github.com> Date: Sat, 22 Feb 2025 18:18:25 +0100 Subject: [PATCH 34/56] Meta sync en assets (#4598) * Upd: En asset meta sync * add en to available servers for meta sync --------- Co-authored-by: LmeSzinc --- assets/en/meta_reward/SYNC_ENTER.png | Bin 0 -> 10023 bytes assets/en/meta_reward/SYNC_TAP.png | Bin 0 -> 14381 bytes module/meta_reward/assets.py | 4 ++-- module/meta_reward/meta_reward.py | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 assets/en/meta_reward/SYNC_ENTER.png create mode 100644 assets/en/meta_reward/SYNC_TAP.png diff --git a/assets/en/meta_reward/SYNC_ENTER.png b/assets/en/meta_reward/SYNC_ENTER.png new file mode 100644 index 0000000000000000000000000000000000000000..06440dd0cf0d01ed85884f0138e12177feb7d424 GIT binary patch literal 10023 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 KZvSxX)c*iGn47Wy literal 0 HcmV?d00001 diff --git a/assets/en/meta_reward/SYNC_TAP.png b/assets/en/meta_reward/SYNC_TAP.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6226b6a6991acf0a9c1c92f216eadc58625958 GIT binary patch literal 14381 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 literal 0 HcmV?d00001 diff --git a/module/meta_reward/assets.py b/module/meta_reward/assets.py index 2633d96d8..72d2ec3fe 100644 --- a/module/meta_reward/assets.py +++ b/module/meta_reward/assets.py @@ -11,6 +11,6 @@ META_REWARD_NOTICE = Button(area={'cn': (1070, 508, 1075, 523), 'en': (1070, 508 REWARD_CHECK = Button(area={'cn': (31, 486, 64, 543), 'en': (35, 487, 62, 541), 'jp': (31, 486, 64, 543), 'tw': (31, 486, 64, 543)}, color={'cn': (199, 164, 165), 'en': (203, 169, 170), 'jp': (206, 172, 174), 'tw': (199, 164, 165)}, button={'cn': (31, 486, 64, 543), 'en': (35, 487, 62, 541), 'jp': (31, 486, 64, 543), 'tw': (31, 486, 64, 543)}, file={'cn': './assets/cn/meta_reward/REWARD_CHECK.png', 'en': './assets/en/meta_reward/REWARD_CHECK.png', 'jp': './assets/jp/meta_reward/REWARD_CHECK.png', 'tw': './assets/cn/meta_reward/REWARD_CHECK.png'}) REWARD_ENTER = Button(area={'cn': (1109, 535, 1187, 554), 'en': (1106, 532, 1199, 544), 'jp': (1108, 535, 1188, 554), 'tw': (1109, 535, 1187, 554)}, color={'cn': (199, 195, 201), 'en': (213, 212, 217), 'jp': (215, 207, 214), 'tw': (199, 195, 201)}, button={'cn': (1109, 535, 1187, 554), 'en': (1106, 532, 1199, 544), 'jp': (1108, 535, 1188, 554), 'tw': (1109, 535, 1187, 554)}, file={'cn': './assets/cn/meta_reward/REWARD_ENTER.png', 'en': './assets/en/meta_reward/REWARD_ENTER.png', 'jp': './assets/jp/meta_reward/REWARD_ENTER.png', 'tw': './assets/cn/meta_reward/REWARD_ENTER.png'}) REWARD_RECEIVE = Button(area={'cn': (1031, 601, 1215, 638), 'en': (1067, 608, 1182, 633), 'jp': (1043, 604, 1203, 635), 'tw': (1031, 601, 1215, 638)}, color={'cn': (149, 62, 62), 'en': (164, 92, 93), 'jp': (150, 64, 64), 'tw': (149, 62, 62)}, button={'cn': (1031, 601, 1215, 638), 'en': (1067, 608, 1182, 633), 'jp': (1043, 604, 1203, 635), 'tw': (1031, 601, 1215, 638)}, file={'cn': './assets/cn/meta_reward/REWARD_RECEIVE.png', 'en': './assets/en/meta_reward/REWARD_RECEIVE.png', 'jp': './assets/jp/meta_reward/REWARD_RECEIVE.png', 'tw': './assets/cn/meta_reward/REWARD_RECEIVE.png'}) -SYNC_ENTER = Button(area={'cn': (866, 351, 943, 370), 'en': (866, 351, 943, 370), 'jp': (866, 351, 943, 370), 'tw': (866, 351, 943, 370)}, color={'cn': (183, 175, 177), 'en': (183, 175, 177), 'jp': (183, 175, 177), 'tw': (183, 175, 177)}, button={'cn': (866, 351, 943, 370), 'en': (866, 351, 943, 370), 'jp': (866, 351, 943, 370), 'tw': (866, 351, 943, 370)}, file={'cn': './assets/cn/meta_reward/SYNC_ENTER.png', 'en': './assets/cn/meta_reward/SYNC_ENTER.png', 'jp': './assets/cn/meta_reward/SYNC_ENTER.png', 'tw': './assets/cn/meta_reward/SYNC_ENTER.png'}) +SYNC_ENTER = Button(area={'cn': (866, 351, 943, 370), 'en': (866, 351, 943, 370), 'jp': (866, 351, 943, 370), 'tw': (866, 351, 943, 370)}, color={'cn': (183, 175, 177), 'en': (132, 117, 119), 'jp': (183, 175, 177), 'tw': (183, 175, 177)}, button={'cn': (866, 351, 943, 370), 'en': (866, 351, 943, 370), 'jp': (866, 351, 943, 370), 'tw': (866, 351, 943, 370)}, file={'cn': './assets/cn/meta_reward/SYNC_ENTER.png', 'en': './assets/en/meta_reward/SYNC_ENTER.png', 'jp': './assets/cn/meta_reward/SYNC_ENTER.png', 'tw': './assets/cn/meta_reward/SYNC_ENTER.png'}) SYNC_REWARD_NOTICE = Button(area={'cn': (977, 337, 981, 352), 'en': (977, 337, 981, 352), 'jp': (977, 337, 981, 352), 'tw': (977, 337, 981, 352)}, color={'cn': (250, 182, 57), 'en': (250, 182, 57), 'jp': (250, 182, 57), 'tw': (250, 182, 57)}, button={'cn': (977, 337, 981, 352), 'en': (977, 337, 981, 352), 'jp': (977, 337, 981, 352), 'tw': (977, 337, 981, 352)}, file={'cn': './assets/cn/meta_reward/SYNC_REWARD_NOTICE.png', 'en': './assets/cn/meta_reward/SYNC_REWARD_NOTICE.png', 'jp': './assets/cn/meta_reward/SYNC_REWARD_NOTICE.png', 'tw': './assets/cn/meta_reward/SYNC_REWARD_NOTICE.png'}) -SYNC_TAP = Button(area={'cn': (581, 339, 707, 377), 'en': (581, 339, 707, 377), 'jp': (581, 339, 707, 377), 'tw': (581, 339, 707, 377)}, color={'cn': (168, 112, 111), 'en': (168, 112, 111), 'jp': (168, 112, 111), 'tw': (168, 112, 111)}, button={'cn': (581, 339, 707, 377), 'en': (581, 339, 707, 377), 'jp': (581, 339, 707, 377), 'tw': (581, 339, 707, 377)}, file={'cn': './assets/cn/meta_reward/SYNC_TAP.png', 'en': './assets/cn/meta_reward/SYNC_TAP.png', 'jp': './assets/cn/meta_reward/SYNC_TAP.png', 'tw': './assets/cn/meta_reward/SYNC_TAP.png'}) +SYNC_TAP = Button(area={'cn': (581, 339, 707, 377), 'en': (581, 339, 707, 377), 'jp': (581, 339, 707, 377), 'tw': (581, 339, 707, 377)}, color={'cn': (168, 112, 111), 'en': (129, 80, 80), 'jp': (168, 112, 111), 'tw': (168, 112, 111)}, button={'cn': (581, 339, 707, 377), 'en': (581, 339, 707, 377), 'jp': (581, 339, 707, 377), 'tw': (581, 339, 707, 377)}, file={'cn': './assets/cn/meta_reward/SYNC_TAP.png', 'en': './assets/en/meta_reward/SYNC_TAP.png', 'jp': './assets/cn/meta_reward/SYNC_TAP.png', 'tw': './assets/cn/meta_reward/SYNC_TAP.png'}) diff --git a/module/meta_reward/meta_reward.py b/module/meta_reward/meta_reward.py index 27eb629fa..556d5987e 100644 --- a/module/meta_reward/meta_reward.py +++ b/module/meta_reward/meta_reward.py @@ -146,7 +146,7 @@ class BeaconReward(Combat, UI): self.ui_ensure(page_meta) - if self.config.SERVER in ['cn']: + if self.config.SERVER in ['cn', 'en']: if self.meta_sync_notice_appear(): self.meta_sync_receive() From dbaecb97f23027a59fb112966d610e6777537611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=AA=E3=83=8E=E5=AE=AB=E7=BB=AB=E6=B2=AB?= <30362789+yokinanya@users.noreply.github.com> Date: Sun, 23 Feb 2025 01:20:53 +0800 Subject: [PATCH 35/56] =?UTF-8?q?=E6=9B=B4=E6=96=B0onepush=E7=89=88?= =?UTF-8?q?=E6=9C=AC=EF=BC=8C=E4=BB=A5=E4=BF=AE=E5=A4=8Dgotify=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=AD=A3=E5=B8=B8=E6=8E=A8=E9=80=81=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20(#4529)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/AidLux/0.92/requirements.txt | 2 +- deploy/docker/requirements.txt | 2 +- deploy/headless/requirements.txt | 2 +- requirements-in.txt | 2 +- requirements.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/deploy/AidLux/0.92/requirements.txt b/deploy/AidLux/0.92/requirements.txt index 313df0b7b..b2e80c1e1 100644 --- a/deploy/AidLux/0.92/requirements.txt +++ b/deploy/AidLux/0.92/requirements.txt @@ -9,7 +9,7 @@ jellyfish==0.11.2 lz4 mxnet==1.6.0 numpy -onepush==1.3.0 +onepush==1.4.0 pillow prettytable==2.2.1 psutil==5.9.3 diff --git a/deploy/docker/requirements.txt b/deploy/docker/requirements.txt index 27ad15099..06d392fc1 100644 --- a/deploy/docker/requirements.txt +++ b/deploy/docker/requirements.txt @@ -27,7 +27,7 @@ prettytable==2.2.1 anyio==1.3.1 # Pushing -onepush==1.3.0 +onepush==1.4.0 pycryptodome==3.9.9 pypresence==4.2.1 diff --git a/deploy/headless/requirements.txt b/deploy/headless/requirements.txt index b10cef4d5..f8dcc6dfd 100644 --- a/deploy/headless/requirements.txt +++ b/deploy/headless/requirements.txt @@ -27,7 +27,7 @@ prettytable==2.2.1 anyio==1.3.1 # Pushing -onepush==1.3.0 +onepush==1.4.0 pycryptodome==3.9.9 pypresence==4.2.1 diff --git a/requirements-in.txt b/requirements-in.txt index fd69eec2e..3dedf41d9 100644 --- a/requirements-in.txt +++ b/requirements-in.txt @@ -27,7 +27,7 @@ prettytable==2.2.1 anyio==1.3.1 # Pushing -onepush==1.3.0 +onepush==1.4.0 pycryptodome==3.9.9 pypresence==4.2.1 diff --git a/requirements.txt b/requirements.txt index 87d8e66de..72ed5c457 100644 --- a/requirements.txt +++ b/requirements.txt @@ -47,7 +47,7 @@ matplotlib==3.4.3 # via gluoncv msgpack==1.0.3 # via zerorpc mxnet==1.6.0 # via -r requirements-in.txt, cnocr numpy==1.16.6 # via -r requirements-in.txt, cnocr, gluoncv, imageio, matplotlib, mxnet, opencv-python, scipy -onepush==1.3.0 # via -r requirements-in.txt +onepush==1.4.0 # via -r requirements-in.txt opencv-python==4.5.3.56 # via -r requirements-in.txt packaging==20.9 # via deprecation, uiautomator2 pillow==8.3.2 # via -r requirements-in.txt, cnocr, gluoncv, imageio, matplotlib, uiautomator2 From 054a218574ceb3a908de66d476a84abc4c5ee104 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sun, 23 Feb 2025 01:29:05 +0800 Subject: [PATCH 36/56] Upd: [JP] Assets for Meta sync --- assets/jp/meta_reward/SYNC_ENTER.png | Bin 0 -> 6500 bytes assets/jp/meta_reward/SYNC_TAP.png | Bin 0 -> 16945 bytes module/meta_reward/assets.py | 4 ++-- module/meta_reward/meta_reward.py | 5 ++--- 4 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 assets/jp/meta_reward/SYNC_ENTER.png create mode 100644 assets/jp/meta_reward/SYNC_TAP.png diff --git a/assets/jp/meta_reward/SYNC_ENTER.png b/assets/jp/meta_reward/SYNC_ENTER.png new file mode 100644 index 0000000000000000000000000000000000000000..d555105e72884d015eb0352e013797d9f819e6e2 GIT binary patch literal 6500 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 G_kRJXp)gMX literal 0 HcmV?d00001 diff --git a/assets/jp/meta_reward/SYNC_TAP.png b/assets/jp/meta_reward/SYNC_TAP.png new file mode 100644 index 0000000000000000000000000000000000000000..b96f3cf2fa0e3bd8fe4f44a13761197f2ed6513c GIT binary patch literal 16945 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 z
    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 Date: Sun, 23 Feb 2025 01:30:07 +0800 Subject: [PATCH 37/56] Add: [ALAS] Util function xywh2xyxy(), xyxy2xywh() --- module/base/utils.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/module/base/utils.py b/module/base/utils.py index 2eff5f813..c3c2f9175 100644 --- a/module/base/utils.py +++ b/module/base/utils.py @@ -497,6 +497,22 @@ def location2node(location): return col2name(x) + str(y) +def xywh2xyxy(area): + """ + Convert (x, y, width, height) to (x1, y1, x2, y2) + """ + x, y, w, h = area + return x, y, x + w, y + h + + +def xyxy2xywh(area): + """ + Convert (x1, y1, x2, y2) to (x, y, width, height) + """ + x1, y1, x2, y2 = area + return min(x1, x2), min(y1, y2), abs(x2 - x1), abs(y2 - y1) + + def load_image(file, area=None): """ Load an image like pillow and drop alpha channel. From 6c081fd8550bd46ed210c29fa5c0f0869e253196 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sun, 23 Feb 2025 03:23:14 +0800 Subject: [PATCH 38/56] Fix: [ALAS] Missing import due to in-file running --- module/device/method/ldopengl.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/module/device/method/ldopengl.py b/module/device/method/ldopengl.py index 25a07a25f..a7a71bd2a 100644 --- a/module/device/method/ldopengl.py +++ b/module/device/method/ldopengl.py @@ -1,6 +1,7 @@ import ctypes import os import subprocess +import time import typing as t from dataclasses import dataclass from functools import wraps @@ -333,13 +334,3 @@ class LDOpenGL(Platform): image = cv2.flip(image, 0) cv2.cvtColor(image, cv2.COLOR_BGR2RGB, dst=image) return image - - -if __name__ == '__main__': - ld = LDOpenGLImpl('E:/ProgramFiles/LDPlayer9', instance_id=1) - for _ in range(5): - import time - - start = time.time() - ld.screenshot() - print(time.time() - start) From 887938ba60fcccd79c50f3ed1aae030a6cc029b9 Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Sun, 23 Feb 2025 22:16:08 +0800 Subject: [PATCH 39/56] Upd: OCR parameters for JP zone name recognition (#4600) --- module/os/map_operation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/os/map_operation.py b/module/os/map_operation.py index ab11e7bfb..635452168 100644 --- a/module/os/map_operation.py +++ b/module/os/map_operation.py @@ -77,7 +77,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle @Config.when(SERVER='jp') def get_zone_name(self): # For JP only - ocr = Ocr(MAP_NAME, lang='jp', letter=(185, 192, 201), threshold=127, name='OCR_OS_MAP_NAME') + ocr = Ocr(MAP_NAME, lang='jp', letter=(201, 218, 239), threshold=220, name='OCR_OS_MAP_NAME') name = ocr.ocr(self.device.image) self.is_zone_name_hidden = '安全' in name # Remove punctuations From cf24123677f61f1d48bde585f5bf0a27367e7283 Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Sun, 23 Feb 2025 22:16:17 +0800 Subject: [PATCH 40/56] Upd: [JP] PRICE_OCR in os_shop (#4601) --- module/os_shop/item.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/os_shop/item.py b/module/os_shop/item.py index ec82e7b5a..468deebfb 100644 --- a/module/os_shop/item.py +++ b/module/os_shop/item.py @@ -1,4 +1,5 @@ from typing import List +import module.config.server as server from module.logger import logger from module.ocr.ocr import DigitYuv, Ocr from module.statistics.item import Item, ItemGrid @@ -48,7 +49,10 @@ class CounterOcr(Ocr): COUNTER_OCR = CounterOcr([], threshold=96, name='Counter_ocr') -PRICE_OCR = PriceOcr([], letter=(255, 223, 57), threshold=32, name='Price_ocr') +if server.server in ['jp']: + PRICE_OCR = PriceOcr([], letter=(245, 214, 58), threshold=32, name='Price_ocr') +else: + PRICE_OCR = PriceOcr([], letter=(255, 223, 57), threshold=32, name='Price_ocr') class OSShopItem(Item): From 949005f469d47a26f59b769b3aa48f6f38c572b9 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:29:51 +0800 Subject: [PATCH 41/56] Dep: [CN] Use aliyun pypi mirrors --- config/deploy.template-AidLux-cn.yaml | 4 ++-- config/deploy.template-AidLux.yaml | 2 +- config/deploy.template-cn.yaml | 4 ++-- config/deploy.template-docker-cn.yaml | 4 ++-- config/deploy.template-docker.yaml | 2 +- config/deploy.template-linux-cn.yaml | 4 ++-- config/deploy.template-linux.yaml | 2 +- config/deploy.template.yaml | 2 +- deploy/config.py | 4 ++++ deploy/template | 2 +- 10 files changed, 17 insertions(+), 13 deletions(-) diff --git a/config/deploy.template-AidLux-cn.yaml b/config/deploy.template-AidLux-cn.yaml index dc8ed3ce7..5e400d27a 100644 --- a/config/deploy.template-AidLux-cn.yaml +++ b/config/deploy.template-AidLux-cn.yaml @@ -35,9 +35,9 @@ Deploy: # [Other] Use you own python, and its version should be 3.7.6 64bit PythonExecutable: /usr/bin/python # URL of pypi mirror - # [CN user] Use 'https://pypi.tuna.tsinghua.edu.cn/simple' for faster and more stable download + # [CN user] Use 'https://mirrors.aliyun.com/pypi/simple' for faster and more stable download # [Other] Use null - PypiMirror: https://pypi.tuna.tsinghua.edu.cn/simple + PypiMirror: https://mirrors.aliyun.com/pypi/simple # Install dependencies at startup # [In most cases] Use true InstallDependencies: true diff --git a/config/deploy.template-AidLux.yaml b/config/deploy.template-AidLux.yaml index 469a68c2e..0b515705f 100644 --- a/config/deploy.template-AidLux.yaml +++ b/config/deploy.template-AidLux.yaml @@ -35,7 +35,7 @@ Deploy: # [Other] Use you own python, and its version should be 3.7.6 64bit PythonExecutable: /usr/bin/python # URL of pypi mirror - # [CN user] Use 'https://pypi.tuna.tsinghua.edu.cn/simple' for faster and more stable download + # [CN user] Use 'https://mirrors.aliyun.com/pypi/simple' for faster and more stable download # [Other] Use null PypiMirror: null # Install dependencies at startup diff --git a/config/deploy.template-cn.yaml b/config/deploy.template-cn.yaml index e88fdf36f..9c031ecbd 100644 --- a/config/deploy.template-cn.yaml +++ b/config/deploy.template-cn.yaml @@ -35,9 +35,9 @@ Deploy: # [Other] Use you own python, and its version should be 3.7.6 64bit PythonExecutable: ./toolkit/python.exe # URL of pypi mirror - # [CN user] Use 'https://pypi.tuna.tsinghua.edu.cn/simple' for faster and more stable download + # [CN user] Use 'https://mirrors.aliyun.com/pypi/simple' for faster and more stable download # [Other] Use null - PypiMirror: https://pypi.tuna.tsinghua.edu.cn/simple + PypiMirror: https://mirrors.aliyun.com/pypi/simple # Install dependencies at startup # [In most cases] Use true InstallDependencies: true diff --git a/config/deploy.template-docker-cn.yaml b/config/deploy.template-docker-cn.yaml index 350021672..302c2a19e 100644 --- a/config/deploy.template-docker-cn.yaml +++ b/config/deploy.template-docker-cn.yaml @@ -35,9 +35,9 @@ Deploy: # [Other] Use you own python, and its version should be 3.7.6 64bit PythonExecutable: /usr/local/bin/python # URL of pypi mirror - # [CN user] Use 'https://pypi.tuna.tsinghua.edu.cn/simple' for faster and more stable download + # [CN user] Use 'https://mirrors.aliyun.com/pypi/simple' for faster and more stable download # [Other] Use null - PypiMirror: https://pypi.tuna.tsinghua.edu.cn/simple + PypiMirror: https://mirrors.aliyun.com/pypi/simple # Install dependencies at startup # [In most cases] Use true InstallDependencies: true diff --git a/config/deploy.template-docker.yaml b/config/deploy.template-docker.yaml index 9fea46f7a..7d8288ed2 100644 --- a/config/deploy.template-docker.yaml +++ b/config/deploy.template-docker.yaml @@ -35,7 +35,7 @@ Deploy: # [Other] Use you own python, and its version should be 3.7.6 64bit PythonExecutable: /usr/local/bin/python # URL of pypi mirror - # [CN user] Use 'https://pypi.tuna.tsinghua.edu.cn/simple' for faster and more stable download + # [CN user] Use 'https://mirrors.aliyun.com/pypi/simple' for faster and more stable download # [Other] Use null PypiMirror: null # Install dependencies at startup diff --git a/config/deploy.template-linux-cn.yaml b/config/deploy.template-linux-cn.yaml index 6165cb406..eb32dee35 100644 --- a/config/deploy.template-linux-cn.yaml +++ b/config/deploy.template-linux-cn.yaml @@ -35,9 +35,9 @@ Deploy: # [Other] Use you own python, and its version should be 3.7.6 64bit PythonExecutable: python # URL of pypi mirror - # [CN user] Use 'https://pypi.tuna.tsinghua.edu.cn/simple' for faster and more stable download + # [CN user] Use 'https://mirrors.aliyun.com/pypi/simple' for faster and more stable download # [Other] Use null - PypiMirror: https://pypi.tuna.tsinghua.edu.cn/simple + PypiMirror: https://mirrors.aliyun.com/pypi/simple # Install dependencies at startup # [In most cases] Use true InstallDependencies: true diff --git a/config/deploy.template-linux.yaml b/config/deploy.template-linux.yaml index a2713e7ea..c1656b478 100644 --- a/config/deploy.template-linux.yaml +++ b/config/deploy.template-linux.yaml @@ -35,7 +35,7 @@ Deploy: # [Other] Use you own python, and its version should be 3.7.6 64bit PythonExecutable: python # URL of pypi mirror - # [CN user] Use 'https://pypi.tuna.tsinghua.edu.cn/simple' for faster and more stable download + # [CN user] Use 'https://mirrors.aliyun.com/pypi/simple' for faster and more stable download # [Other] Use null PypiMirror: null # Install dependencies at startup diff --git a/config/deploy.template.yaml b/config/deploy.template.yaml index bdab4792d..22d0e938a 100644 --- a/config/deploy.template.yaml +++ b/config/deploy.template.yaml @@ -35,7 +35,7 @@ Deploy: # [Other] Use you own python, and its version should be 3.7.6 64bit PythonExecutable: ./toolkit/python.exe # URL of pypi mirror - # [CN user] Use 'https://pypi.tuna.tsinghua.edu.cn/simple' for faster and more stable download + # [CN user] Use 'https://mirrors.aliyun.com/pypi/simple' for faster and more stable download # [Other] Use null PypiMirror: null # Install dependencies at startup diff --git a/deploy/config.py b/deploy/config.py index 528a16078..934082993 100644 --- a/deploy/config.py +++ b/deploy/config.py @@ -126,6 +126,10 @@ class DeployConfig(ConfigModel): super().__setattr__('Repository', 'https://github.com/LmeSzinc/AzurLaneAutoScript') if self.Repository in ['cn']: super().__setattr__('Repository', 'git://git.lyoko.io/AzurLaneAutoScript') + if self.PypiMirror in [ + 'https://pypi.tuna.tsinghua.edu.cn/simple' + ]: + super().__setattr__('PypiMirror', 'https://mirrors.aliyun.com/pypi/simple') def filepath(self, key): """ diff --git a/deploy/template b/deploy/template index 1f6355c99..e8dd17cb0 100644 --- a/deploy/template +++ b/deploy/template @@ -35,7 +35,7 @@ Deploy: # [Other] Use you own python, and its version should be 3.7.6 64bit PythonExecutable: './toolkit/python.exe' # URL of pypi mirror - # [CN user] Use 'https://pypi.tuna.tsinghua.edu.cn/simple' for faster and more stable download + # [CN user] Use 'https://mirrors.aliyun.com/pypi/simple' for faster and more stable download # [Other] Use null PypiMirror: null # Install dependencies at startup From 4f070157a1841ab4d4b413229d242bc93d251925 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:55:02 +0800 Subject: [PATCH 42/56] Dep: Write redirected pypi mirror --- deploy/config.py | 8 ++++---- module/config/config_updater.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/deploy/config.py b/deploy/config.py index 934082993..cfa85aef8 100644 --- a/deploy/config.py +++ b/deploy/config.py @@ -115,6 +115,10 @@ class DeployConfig(ConfigModel): 'https://git.saarcenter.com/LmeSzinc/AzurLaneAutoScript.git', ]: self.Repository = 'git://git.lyoko.io/AzurLaneAutoScript' + if self.PypiMirror in [ + 'https://pypi.tuna.tsinghua.edu.cn/simple' + ]: + self.PypiMirror = 'https://mirrors.aliyun.com/pypi/simple' # Bypass webui.config.DeployConfig.__setattr__() # Don't write these into deploy.yaml @@ -126,10 +130,6 @@ class DeployConfig(ConfigModel): super().__setattr__('Repository', 'https://github.com/LmeSzinc/AzurLaneAutoScript') if self.Repository in ['cn']: super().__setattr__('Repository', 'git://git.lyoko.io/AzurLaneAutoScript') - if self.PypiMirror in [ - 'https://pypi.tuna.tsinghua.edu.cn/simple' - ]: - super().__setattr__('PypiMirror', 'https://mirrors.aliyun.com/pypi/simple') def filepath(self, key): """ diff --git a/module/config/config_updater.py b/module/config/config_updater.py index 5f98b7ce8..2d2c395a2 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -470,7 +470,7 @@ class ConfigGenerator: template = poor_yaml_read(DEPLOY_TEMPLATE) cn = { 'Repository': 'git://git.lyoko.io/AzurLaneAutoScript', - 'PypiMirror': 'https://pypi.tuna.tsinghua.edu.cn/simple', + 'PypiMirror': 'https://mirrors.aliyun.com/pypi/simple', 'Language': 'zh-CN', } aidlux = { From ec2c1959f575a3f7de978b0dcc879817d20d497a Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 25 Feb 2025 00:43:27 +0800 Subject: [PATCH 43/56] Fix: [ALAS] Reduce unnecessary file writes at startup --- deploy/Windows/config.py | 9 ++++++--- deploy/config.py | 10 ++++++++-- module/webui/config.py | 20 ++++++++++++++++---- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/deploy/Windows/config.py b/deploy/Windows/config.py index 5c10ab0a8..6083350e0 100644 --- a/deploy/Windows/config.py +++ b/deploy/Windows/config.py @@ -81,7 +81,6 @@ class DeployConfig(ConfigModel): self.config_template = {} self.read() - self.write() self.show_config() def show_config(self): @@ -89,7 +88,7 @@ class DeployConfig(ConfigModel): for k, v in self.config.items(): if k in ("Password", "SSHUser"): continue - if self.config_template[k] == v: + if self.config_template.get(k) == v: continue logger.info(f"{k}: {v}") @@ -98,7 +97,8 @@ class DeployConfig(ConfigModel): def read(self): self.config = poor_yaml_read(DEPLOY_TEMPLATE) self.config_template = copy.deepcopy(self.config) - self.config.update(poor_yaml_read(self.file)) + origin = poor_yaml_read(self.file) + self.config.update(origin) for key, value in self.config.items(): if hasattr(self, key): @@ -106,6 +106,9 @@ class DeployConfig(ConfigModel): self.config_redirect() + if self.config != origin: + self.write() + def write(self): poor_yaml_write(self.config, self.file) diff --git a/deploy/config.py b/deploy/config.py index cfa85aef8..ac64cfeb3 100644 --- a/deploy/config.py +++ b/deploy/config.py @@ -73,9 +73,9 @@ class DeployConfig(ConfigModel): """ self.file = file self.config = {} + self.config_template = {} self.read() - self.write() self.show_config() def show_config(self): @@ -92,7 +92,8 @@ class DeployConfig(ConfigModel): def read(self): self.config = poor_yaml_read(DEPLOY_TEMPLATE) self.config_template = copy.deepcopy(self.config) - self.config.update(poor_yaml_read(self.file)) + origin = poor_yaml_read(self.file) + self.config.update(origin) for key, value in self.config.items(): if hasattr(self, key): @@ -100,6 +101,9 @@ class DeployConfig(ConfigModel): self.config_redirect() + if self.config != origin: + self.write() + def write(self): poor_yaml_write(self.config, self.file) @@ -115,10 +119,12 @@ class DeployConfig(ConfigModel): 'https://git.saarcenter.com/LmeSzinc/AzurLaneAutoScript.git', ]: self.Repository = 'git://git.lyoko.io/AzurLaneAutoScript' + self.config['Repository'] = 'git://git.lyoko.io/AzurLaneAutoScript' if self.PypiMirror in [ 'https://pypi.tuna.tsinghua.edu.cn/simple' ]: self.PypiMirror = 'https://mirrors.aliyun.com/pypi/simple' + self.config['Repository'] = 'https://mirrors.aliyun.com/pypi/simple' # Bypass webui.config.DeployConfig.__setattr__() # Don't write these into deploy.yaml diff --git a/module/webui/config.py b/module/webui/config.py index 1d089124d..d7cb735a8 100644 --- a/module/webui/config.py +++ b/module/webui/config.py @@ -1,4 +1,5 @@ -from typing import Optional, Union +import copy + from filelock import FileLock from deploy.config import DeployConfig as _DeployConfig @@ -32,7 +33,9 @@ class DeployConfig(_DeployConfig): Read and update deploy config, copy `self.configs` to properties. """ self.config = poor_yaml_read_with_lock(DEPLOY_TEMPLATE) - self.config.update(poor_yaml_read_with_lock(self.file)) + self.config_template = copy.deepcopy(self.config) + origin = poor_yaml_read_with_lock(self.file) + self.config.update(origin) for key, value in self.config.items(): if hasattr(self, key): @@ -40,6 +43,9 @@ class DeployConfig(_DeployConfig): self.config_redirect() + if self.config != origin: + self.write() + def write(self): """ Write `self.config` into deploy config. @@ -52,5 +58,11 @@ class DeployConfig(_DeployConfig): """ super().__setattr__(key, value) if key[0].isupper() and key in self.config: - self.config[key] = value - self.write() + if key in self.config: + before = self.config[key] + if before != value: + self.config[key] = value + self.write() + else: + self.config[key] = value + self.write() From 443aab2cb2e40f9c5f74d7c636715bbefae0f2b9 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:20:48 +0800 Subject: [PATCH 44/56] Fix: Lower similarity of AWAKENING to handle random background --- module/awaken/awaken.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/awaken/awaken.py b/module/awaken/awaken.py index 60d78d390..463c7ef94 100644 --- a/module/awaken/awaken.py +++ b/module/awaken/awaken.py @@ -131,7 +131,8 @@ class Awaken(Dock): if LEVEL_UP.match_luma(self.device.image): logger.info(f'awaken_once ended at {LEVEL_UP}') return 'no_exp' - if interval.reached() and AWAKENING.match_luma(self.device.image): + # Lower similarity due to random background + if interval.reached() and AWAKENING.match_luma(self.device.image, similarity=0.7): self.device.click(AWAKENING) interval.reset() continue From c14c08b6be344fd20cfc916b3c3f40f461655436 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 26 Feb 2025 15:09:01 +0800 Subject: [PATCH 45/56] Fix: Override PypiMirror if it's tsinghua --- deploy/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/config.py b/deploy/config.py index ac64cfeb3..c99d72997 100644 --- a/deploy/config.py +++ b/deploy/config.py @@ -124,7 +124,7 @@ class DeployConfig(ConfigModel): 'https://pypi.tuna.tsinghua.edu.cn/simple' ]: self.PypiMirror = 'https://mirrors.aliyun.com/pypi/simple' - self.config['Repository'] = 'https://mirrors.aliyun.com/pypi/simple' + self.config['PypiMirror'] = 'https://mirrors.aliyun.com/pypi/simple' # Bypass webui.config.DeployConfig.__setattr__() # Don't write these into deploy.yaml From 8109b8c0be89937841bf88dbc4fdd2956542ccbc Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 27 Feb 2025 21:14:14 +0800 Subject: [PATCH 46/56] Add: Event entrance of Paradiso of Shackled Light (event_20250227_cn) --- campaign/Readme.md | 2 + module/config/argument/args.json | 120 ++++++++++++++++--------------- module/config/i18n/en-US.json | 1 + module/config/i18n/ja-JP.json | 1 + module/config/i18n/zh-CN.json | 1 + module/config/i18n/zh-TW.json | 3 +- 6 files changed, 71 insertions(+), 57 deletions(-) diff --git a/campaign/Readme.md b/campaign/Readme.md index 1a394a7c1..c14e233eb 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -232,3 +232,5 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250123 | raid 20250116 | Spring Fashion Festa | - | - | - | 華裳巧展喜事長 | | 20250206 | event 20220818 cn | Operation Convergence Rerun | 复刻远汇点作战 | Operation Convergence Return | 結像点作戦(復刻) | - | | 20250213 | event 20240815 cn | Windborne Steel Wings | - | - | - | 鐵翼擎風 | +| 20250227 | event 20250227 cn | Paradiso of Shackled Light | 樊笼内的神光 | Paradiso of Shackled Light | 籠檻に囚われし神光 | - | +| 20250227 | event 20240725 cn | Interlude of Illusions | - | - | - | 幻夢間奏曲 | diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 82f65b836..25a75c8cd 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1711,17 +1711,18 @@ "event_20240912_cn", "event_20241024_cn", "event_20241121_cn", - "event_20241219_cn" + "event_20241219_cn", + "event_20250227_cn" ], "display": "hide", "option_bold": [ - "event_20220818_cn", - "event_20240815_cn" + "event_20240725_cn", + "event_20250227_cn" ], - "cn": "event_20220818_cn", - "en": "event_20220818_cn", - "jp": "event_20220818_cn", - "tw": "event_20240815_cn" + "cn": "event_20250227_cn", + "en": "event_20250227_cn", + "jp": "event_20250227_cn", + "tw": "event_20240725_cn" }, "Mode": { "type": "select", @@ -2054,16 +2055,17 @@ "event_20240912_cn", "event_20241024_cn", "event_20241121_cn", - "event_20241219_cn" + "event_20241219_cn", + "event_20250227_cn" ], "option_bold": [ - "event_20220818_cn", - "event_20240815_cn" + "event_20240725_cn", + "event_20250227_cn" ], - "cn": "event_20220818_cn", - "en": "event_20220818_cn", - "jp": "event_20220818_cn", - "tw": "event_20240815_cn" + "cn": "event_20250227_cn", + "en": "event_20250227_cn", + "jp": "event_20250227_cn", + "tw": "event_20240725_cn" }, "Mode": { "type": "select", @@ -2511,16 +2513,17 @@ "event_20240912_cn", "event_20241024_cn", "event_20241121_cn", - "event_20241219_cn" + "event_20241219_cn", + "event_20250227_cn" ], "option_bold": [ - "event_20220818_cn", - "event_20240815_cn" + "event_20240725_cn", + "event_20250227_cn" ], - "cn": "event_20220818_cn", - "en": "event_20220818_cn", - "jp": "event_20220818_cn", - "tw": "event_20240815_cn" + "cn": "event_20250227_cn", + "en": "event_20250227_cn", + "jp": "event_20250227_cn", + "tw": "event_20240725_cn" }, "Mode": { "type": "select", @@ -3932,16 +3935,17 @@ "event_20240912_cn", "event_20241024_cn", "event_20241121_cn", - "event_20241219_cn" + "event_20241219_cn", + "event_20250227_cn" ], "option_bold": [ - "event_20220818_cn", - "event_20240815_cn" + "event_20240725_cn", + "event_20250227_cn" ], - "cn": "event_20220818_cn", - "en": "event_20220818_cn", - "jp": "event_20220818_cn", - "tw": "event_20240815_cn" + "cn": "event_20250227_cn", + "en": "event_20250227_cn", + "jp": "event_20250227_cn", + "tw": "event_20240725_cn" }, "Mode": { "type": "select", @@ -4406,16 +4410,17 @@ "event_20240912_cn", "event_20241024_cn", "event_20241121_cn", - "event_20241219_cn" + "event_20241219_cn", + "event_20250227_cn" ], "option_bold": [ - "event_20220818_cn", - "event_20240815_cn" + "event_20240725_cn", + "event_20250227_cn" ], - "cn": "event_20220818_cn", - "en": "event_20220818_cn", - "jp": "event_20220818_cn", - "tw": "event_20240815_cn" + "cn": "event_20250227_cn", + "en": "event_20250227_cn", + "jp": "event_20250227_cn", + "tw": "event_20240725_cn" }, "Mode": { "type": "select", @@ -4880,16 +4885,17 @@ "event_20240912_cn", "event_20241024_cn", "event_20241121_cn", - "event_20241219_cn" + "event_20241219_cn", + "event_20250227_cn" ], "option_bold": [ - "event_20220818_cn", - "event_20240815_cn" + "event_20240725_cn", + "event_20250227_cn" ], - "cn": "event_20220818_cn", - "en": "event_20220818_cn", - "jp": "event_20220818_cn", - "tw": "event_20240815_cn" + "cn": "event_20250227_cn", + "en": "event_20250227_cn", + "jp": "event_20250227_cn", + "tw": "event_20240725_cn" }, "Mode": { "type": "select", @@ -5354,16 +5360,17 @@ "event_20240912_cn", "event_20241024_cn", "event_20241121_cn", - "event_20241219_cn" + "event_20241219_cn", + "event_20250227_cn" ], "option_bold": [ - "event_20220818_cn", - "event_20240815_cn" + "event_20240725_cn", + "event_20250227_cn" ], - "cn": "event_20220818_cn", - "en": "event_20220818_cn", - "jp": "event_20220818_cn", - "tw": "event_20240815_cn" + "cn": "event_20250227_cn", + "en": "event_20250227_cn", + "jp": "event_20250227_cn", + "tw": "event_20240725_cn" }, "Mode": { "type": "select", @@ -5818,16 +5825,17 @@ "event_20240912_cn", "event_20241024_cn", "event_20241121_cn", - "event_20241219_cn" + "event_20241219_cn", + "event_20250227_cn" ], "option_bold": [ - "event_20220818_cn", - "event_20240815_cn" + "event_20240725_cn", + "event_20250227_cn" ], - "cn": "event_20220818_cn", - "en": "event_20220818_cn", - "jp": "event_20220818_cn", - "tw": "event_20240815_cn" + "cn": "event_20250227_cn", + "en": "event_20250227_cn", + "jp": "event_20250227_cn", + "tw": "event_20240725_cn" }, "Mode": { "type": "select", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 069031aa7..a98dd2a71 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -739,6 +739,7 @@ "event_20241024_cn": "Tempesta and the Sleeping Sea", "event_20241121_cn": "Dangerous Inventions Incoming", "event_20241219_cn": "Substellar Crepuscule", + "event_20250227_cn": "Paradiso of Shackled Light", "raid_20200624": "Air Raid Drills with Essex Rerun", "raid_20210708": "Cross Wave rerun", "raid_20220127": "Mystery Investigation", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 387753184..fd6f75a8d 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -739,6 +739,7 @@ "event_20241024_cn": "テンペスタと眠りし海", "event_20241121_cn": "危険発明接近中", "event_20241219_cn": "星降る夕影の残光", + "event_20250227_cn": "籠檻に囚われし神光", "raid_20200624": "特別演習超空強襲波(復刻)", "raid_20210708": "交錯する新たな波 (復刻)", "raid_20220127": "秘密事件調査", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 375ff8337..51166c9bc 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -739,6 +739,7 @@ "event_20241024_cn": "飓风与沉眠之海", "event_20241121_cn": "危险发明迫近中", "event_20241219_cn": "星光下的余晖", + "event_20250227_cn": "樊笼内的神光", "raid_20200624": "复刻特别演习埃塞克斯级", "raid_20210708": "复刻穿越彼方的水线", "raid_20220127": "演习神秘事件调查", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 5a937fd0e..6890b3279 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -732,13 +732,14 @@ "event_20240229_cn": "雪境迷蹤", "event_20240425_cn": "共鳴的PASSION", "event_20240521_cn": "Light of the Martyrium", - "event_20240725_cn": "Interlude of Illusions", + "event_20240725_cn": "幻夢間奏曲", "event_20240815_cn": "鐵翼擎風", "event_20240829_cn": "埋葬於彼岸之花", "event_20240912_cn": "Ode of Everblooming Crimson", "event_20241024_cn": "Tempesta and the Sleeping Sea", "event_20241121_cn": "危險發明逼近中", "event_20241219_cn": "Substellar Crepuscule", + "event_20250227_cn": "Paradiso of Shackled Light", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", From 48448e96b3ee14fe02af10a028008f0987f1829a Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 27 Feb 2025 21:49:54 +0800 Subject: [PATCH 47/56] Add: Chapter A --- campaign/event_20250227_cn/a1.py | 94 ++++++++++++++++++++++++++++++++ campaign/event_20250227_cn/a2.py | 79 +++++++++++++++++++++++++++ campaign/event_20250227_cn/a3.py | 79 +++++++++++++++++++++++++++ 3 files changed, 252 insertions(+) create mode 100644 campaign/event_20250227_cn/a1.py create mode 100644 campaign/event_20250227_cn/a2.py create mode 100644 campaign/event_20250227_cn/a3.py diff --git a/campaign/event_20250227_cn/a1.py b/campaign/event_20250227_cn/a1.py new file mode 100644 index 000000000..c5515790e --- /dev/null +++ b/campaign/event_20250227_cn/a1.py @@ -0,0 +1,94 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('A1') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ++ -- ME -- -- SP SP ++ MB + -- ME -- ME -- -- -- -- -- + ME -- ++ ++ Me -- -- __ Me + -- -- ++ ++ -- MS MS -- -- + -- ME -- -- ME -- -- ++ -- + -- -- ME -- -- -- Me ++ -- + ME -- -- -- Me -- -- Me -- + -- -- ME ++ ++ ++ -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1, 'boss': 1}, + {'battle': 4, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_SIREN_HAS_BOSS_ICON_SMALL = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_SWIPE_MULTIPLY = (1.227, 1.250) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.187, 1.209) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.152, 1.173) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/event_20250227_cn/a2.py b/campaign/event_20250227_cn/a2.py new file mode 100644 index 000000000..b298d1fb7 --- /dev/null +++ b/campaign/event_20250227_cn/a2.py @@ -0,0 +1,79 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['F2', 'D2'] +MAP.map_data = """ + -- -- ME -- -- ME -- ++ -- + ME ++ -- ME -- -- -- -- ME + -- -- ME ++ ++ ++ -- Me -- + -- ME -- SP -- SP -- -- -- + -- -- -- -- -- -- -- -- ME + -- ME -- -- __ -- -- Me -- + ME ++ -- MS -- MS -- ++ ++ + -- ++ Me -- MB -- Me ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.128, 1.149) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.091, 1.111) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.059, 1.078) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20250227_cn/a3.py b/campaign/event_20250227_cn/a3.py new file mode 100644 index 000000000..494c376df --- /dev/null +++ b/campaign/event_20250227_cn/a3.py @@ -0,0 +1,79 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP -- -- -- ++ -- ++ ++ -- + SP -- -- MS -- -- Me ++ ++ -- + ++ ++ ++ -- MS -- -- -- ME -- + -- -- -- __ -- -- Me -- -- ME + -- ME -- -- Me ++ Me -- ME ++ + ME -- MB -- -- ++ Me -- -- ME + ++ ++ -- ME -- -- -- -- ME -- + ++ ++ ME -- -- ++ -- ME -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.240, 1.263) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.199, 1.221) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.164, 1.185) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() From b7e5bcf49c856b9a7e9ae0fa42ac96ebbff8e5d9 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 27 Feb 2025 22:49:08 +0800 Subject: [PATCH 48/56] Add: Chapter B --- .../template/TEMPLATE_SIREN_BolzanoAlter.gif | Bin 0 -> 4408 bytes .../template/TEMPLATE_SIREN_CesareAlter.gif | Bin 0 -> 3299 bytes .../template/TEMPLATE_SIREN_SirenBoss25.gif | Bin 0 -> 1054 bytes .../template/TEMPLATE_SIREN_SirenBoss26.gif | Bin 0 -> 2189 bytes .../template/TEMPLATE_SIREN_TrentoAlter.gif | Bin 0 -> 2216 bytes .../template/TEMPLATE_SIREN_BolzanoAlter.gif | Bin 0 -> 4408 bytes .../template/TEMPLATE_SIREN_CesareAlter.gif | Bin 0 -> 3299 bytes .../template/TEMPLATE_SIREN_SirenBoss25.gif | Bin 0 -> 1054 bytes .../template/TEMPLATE_SIREN_SirenBoss26.gif | Bin 0 -> 2189 bytes .../template/TEMPLATE_SIREN_TrentoAlter.gif | Bin 0 -> 2216 bytes .../template/TEMPLATE_SIREN_BolzanoAlter.gif | Bin 0 -> 4408 bytes .../template/TEMPLATE_SIREN_CesareAlter.gif | Bin 0 -> 3299 bytes .../template/TEMPLATE_SIREN_SirenBoss25.gif | Bin 0 -> 1054 bytes .../template/TEMPLATE_SIREN_SirenBoss26.gif | Bin 0 -> 2189 bytes .../template/TEMPLATE_SIREN_TrentoAlter.gif | Bin 0 -> 2216 bytes .../template/TEMPLATE_SIREN_BolzanoAlter.gif | Bin 0 -> 4408 bytes .../template/TEMPLATE_SIREN_CesareAlter.gif | Bin 0 -> 3299 bytes .../template/TEMPLATE_SIREN_SirenBoss25.gif | Bin 0 -> 1054 bytes .../template/TEMPLATE_SIREN_SirenBoss26.gif | Bin 0 -> 2189 bytes .../template/TEMPLATE_SIREN_TrentoAlter.gif | Bin 0 -> 2216 bytes campaign/event_20250227_cn/a1.py | 2 + campaign/event_20250227_cn/b1.py | 96 ++++++++++++++++++ campaign/event_20250227_cn/b2.py | 80 +++++++++++++++ campaign/event_20250227_cn/b3.py | 85 ++++++++++++++++ module/template/assets.py | 5 + 25 files changed, 268 insertions(+) create mode 100644 assets/cn/template/TEMPLATE_SIREN_BolzanoAlter.gif create mode 100644 assets/cn/template/TEMPLATE_SIREN_CesareAlter.gif create mode 100644 assets/cn/template/TEMPLATE_SIREN_SirenBoss25.gif create mode 100644 assets/cn/template/TEMPLATE_SIREN_SirenBoss26.gif create mode 100644 assets/cn/template/TEMPLATE_SIREN_TrentoAlter.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_BolzanoAlter.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_CesareAlter.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_SirenBoss25.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_SirenBoss26.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_TrentoAlter.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_BolzanoAlter.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_CesareAlter.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_SirenBoss25.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_SirenBoss26.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_TrentoAlter.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_BolzanoAlter.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_CesareAlter.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_SirenBoss25.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_SirenBoss26.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_TrentoAlter.gif create mode 100644 campaign/event_20250227_cn/b1.py create mode 100644 campaign/event_20250227_cn/b2.py create mode 100644 campaign/event_20250227_cn/b3.py diff --git a/assets/cn/template/TEMPLATE_SIREN_BolzanoAlter.gif b/assets/cn/template/TEMPLATE_SIREN_BolzanoAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..240a5aa70520ea759b272b34fc39da6aa13a7c4f GIT binary patch literal 4408 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 ZxY(jj)TwP~wJZ_cxMU$Kp-~aX{{ow^Yl{E? literal 0 HcmV?d00001 diff --git a/assets/cn/template/TEMPLATE_SIREN_CesareAlter.gif b/assets/cn/template/TEMPLATE_SIREN_CesareAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..e13ef5bb01a68d3ecf89ad23ebda37c5d454e74a GIT binary patch literal 3299 zcmeI!{WsHpAHea?Y}n@B7RJhkF~it~OiOdKG4}}xWz!IyqB!L%U5(1^bh#Pk=90@n zDyNWCk`~2`Fx}lJ(bk*fsCr&r6ch}BwI^XMj`~G%)f9drXywB^r-jDP2=5bw^ z0v$*n%7viS)zzKYsl1;lrCZZx$C9=jP_7r>CDjefs3dlgE!A zKX~xq{{8!tlau4)<0B&@3WcJ-zrU}qPbQPyxN)PWr{~I*D_vb(?d|PtZEfeyooi`n zX>M+AY;0_3XsEBRKYjXiO-)U8b#+x$l~gLNtgNi4s3vHYzOJsWj*gDDwzig*mZqjA3WY)8B!cJIetXilZvr7#AsF&=%AMmfRrY8eYC=^kQx9vF3)~?HW|G*`BEUd0 z4cp+-^eiGIf~=AU#4r(mP(s=&77h`LRS2|5P4YX~oqPi+6YD5~60{6Z7M;OEDqIai zDuLp^jFA_q8pd^0=%vON6`+knI+wFycMO~aSBnLy9519RF9VNTf)`dh#>@Dy7Xv|c zHha?fGY9AVs;CjYwY1~$MPjPgRTtPLl17E~w(&i<7fn8RylawpMV~uTiK8i6dE3-{ z%Hc$X@E;9#6nT(UPiG0EUjb=HnE7UPz(mI>iA$3xOnrYDDYV++nl4*zVxIah0*wFM zU!UaLm}f(#Sq`CGGN!Sj;8{{RL35A)wFAvM8<;3`tE}N9?*zh2lEuYmPPKcp|95}6 zYsh^5{24d{ka_?9{nFCX+qZ9Dzka>2urND2`~3OynVA`-Hjf@Xnwpvd)J#lFjE#-m zyLS(OGdw&jm&*qS2bJbrzka>DyBnBu`SRt?&d!dGj*AyBUbt}K?AfzGo~EWIU`}mq zEdU2-1E?t}DLHlO)QJ-(fH0YvnMaNsNl#Bdbm&lOYASFBAd{Gw2!s&|g}Zm}j*X2K z2n2wasHi9)Oh`xwfF&p>NNJ0&ukUYo@$&NeUYIRgw)_SeCX@Mx&H!X=Y;69}8BhbjcUYw)e0k<_{zj&qBu zvrrPp105FV+$`3JU2mpjjCY7R0qSIVd0A-(sFPQ(UcG$z5;O{c17ymxXU~8d4<9}p9UZ-U z_b$Lyqu;w=273O%RYK{{H^I#|NmB zAK3BZK>2|k%0T%Z4iG3tMn+0I)*1!au@)$6Z~!$_Rl)WCoIh;?|IH7)Ud|8uheeOh?csVParx6p7bJ-a5{%FLK;@dj!%oN0*X09daa_&#tu#-|ui0 z*2JqI2j)emykqkWiGKdk|16CYOYKtl(IR%UUx_)ftyXWM$*+oOZz+_QSqS}R literal 0 HcmV?d00001 diff --git a/assets/cn/template/TEMPLATE_SIREN_SirenBoss25.gif b/assets/cn/template/TEMPLATE_SIREN_SirenBoss25.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ff8223cf1cb0797e211def5cb0cfc7eee077bcd GIT binary patch literal 1054 zcmZ?wbhEHb6k_0EXlG#f|NsBLfB*je{rl(7pI^Uz{rK_Y%a<>oKY#x8>C=Y~AKt%z z|L)zpw{PFRdGqG^^XHEqJ-T)4*3FwYZ``;$Bu2=wr$O;uG@Wo2bWMMXI|IcaHW$;rtH2?=p=aj~(nQBhG55fS0x;emmH0RaL2 z{{DV`e!jlGK0ZF4o}L~a9&T=KuCA^wE-uc_&Q4BFj*gBtHa1pPRu&c(W@culrlv+l zMuvul`uh5MdV0FLx>{OVnwpv#8X9V9YO1QLDk>_<%F2q0iV6w}a&mIAva&KVGLn*# z5)u;P;^JarVxpp=A|fKf!oosALV|*V0s;d3{QP`;d^|in92^{MY-|jpV917m;(u;G z*N|Xm#{gF&Jp*RO|Nj{jf3k2W0zISy@)RhWFmSwJ;N6q(nYBk;-+!0P6Q$N}aa{ps zn}Ee?XJ;BlENih`(b_d#PoVgN#izq<{TfLpW*90TJ3UofM)AOgq?Y4+^3GWsIuupB zXX=D(sE8Ce&^$@jw(5g`lk(9HL4`1el|rnH&5XK}{(QK2*nOgey2lIwM&%QHELzOug0WOw^S_Q@?Hij)Gg+-}eQhZ`c5&{MZ49UzK6KpDz SQn@GdN~q{4T(DMPum%8{kMC~) literal 0 HcmV?d00001 diff --git a/assets/cn/template/TEMPLATE_SIREN_SirenBoss26.gif b/assets/cn/template/TEMPLATE_SIREN_SirenBoss26.gif new file mode 100644 index 0000000000000000000000000000000000000000..bbb95b27aceb40cfeb94307a0162c5e5282db080 GIT binary patch literal 2189 zcmZ?wbhEHb1xwB`_o;Y#h`0?Y%jvYIC^yrZzM-Cr8 zeCW`jg9i^DIB;O!zI}W5?%ln6_pV*Lwrtt5Y15`9OO`BHuwc%dIkRWao;7RMq)C$| zPMkPl!i4_*{@&i+o}QlW?(X*X_U7j1rlzKbhKBn3`r6vsnwpx5ii+~`^0KnBl9H0* z;^KmWg8cmayu7@eoSd|@w3L*TD zcQ-dT7Z(?2XJ-co2Rl1ETU%Qj8yjnDYbz@&Gcz+&Q&STY6JujzBO@b2Lqh`t1ATpc zJv}{LU0od=9c^uGEiElgO-&6A4K+12RaI3L6%}P=WhEsgMMXsg1qFF|c{w>bSy@>b z85wD5X(=fwNl8fw2?=p=aWOG5QBhG55fNcwVId(Q0RaJietteaK5lMqE-o&HQ83g( zK=D7fpKD04vtxj(k)8oF@#O&B=-Gf3(LY;bUxs-C#3=HsQM ziqlw``CSr{l#g=B`7N;tEMj3i$Y8gm=jNmq4t^Ud{@QI13cqlZVmNem=F2R_j+{WF(swMJL z$(U!Rj?8R}$^#1yHprwOD)@Qnh>w&}(t!fM35i}ahL8?qF>}FS16h1!6`9U*tSHMI8N0#Zbp*vh8FSBrq8O1D9S2Rd;W9BsQ+!9lG zDYbjLmPpnY2j->j5}H1T6a<5xbx&)+47K(vSFQkymJ1gyoH=vm)TvW=ikAKR_XCTT zJ$v>5iILwJQ-Nhbai!gbab?}wY9dkwzRYWiO51V4R$s?CtF#WelW%F*i3SSjNB$ z7p~Sjm9JFd=ds(KNy^jG&FYlZCMd1%*G?8;ngEiIFsQ( zuVR{56JzkRo*4#gd>khdQv9YE#_g-fvD7I6D-YdU0W3AF0e}AFEdT%j literal 0 HcmV?d00001 diff --git a/assets/cn/template/TEMPLATE_SIREN_TrentoAlter.gif b/assets/cn/template/TEMPLATE_SIREN_TrentoAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..d789a3db1d872cad28ced55cc68d1c016b8bdfb5 GIT binary patch literal 2216 zcmZ?wbhEHb3xgM~@yjaA4=oo!hr>-?nYr=FOWo zZQ8VM-MY1F*REN!X4R@yD_5>uwrtswB}*19S~PFoyy?@YPnj}h^5n@ACr+F&VM1SD zUvF=3XJ=retv#lUS3X4PIh*7 zR#sMKW@bi4Mp{~0YHDgqN=kBaa#B)KVq#)KLPC6ed|X^yY;0^yOiXlibW~JSWMpJS zL_~Oacvx6iXlQ6iNJwySa8OWCU|?WCK!Cr$zn`CCcfhljhn zyPKPvtE;Pvi;J_fvy+pPqobpPgM+=jy`7z%t*xz%jg7UnwUw2XrKP2Xg@w7fxtW=n ziHV7^v9Xbnk)ffXfq{X(zP_HGp02L0j*gDDwzig*mWGCgnwpxbs;Y{Lin6k@l9H05 zqN1#i!a1@@{EF$E5z@qTu5?2P9l5IQ;2@hP^mE0N%G!v8<*tA?F6ci39 zHS(!hPRYqIY-F0E!!M)bvC*MR!XQ=aKu3XMrz9`0k;8!ow{A%V<&cPmrnb{v!buah zY%EUmn`Iy8#lv}+-ACT3`OA}w&2Ih*4h>l)GmV#@k+zRNv%oRJI`;$!XnE z21)yTEH6FbnQqZmQKKl_>Md%Na%6&I(lPJ3&dCQ>I5s^!DWn>8>rcR8HU34HbJkQa zZcgnMHMG65Vq)+KZYk}|86x_Xms(CqNR?kWAjp!=FRYd_@5_sck3D#fmE6!+I60+f zqO9Eqg%;kz4GY=DJMQkmBa-*|TTPoPn1$`}XbIvuDrl-MfK>&W;^BfQ8PMEn7Bh z*Z?eafW^(yrAvWj&Emz2=ggTiYu2o(Q>RXvG^xM8A6U?Ib#+0CnAXFMdnMGUU;1zxz&v}7?gH6^}qftM@_3JP*^a*)CW zSh9$TiHV4a01FpEK|uil0X{xHZfinbGEJPtZIO;Qq)l4vkY>=08Awpp{Gp|NuotAIv_ zN5aw55;{V0DglKqp51)qQ)xY24A-@7(d}iQ*D;bYi z$@lhL{M5!L?HF_E4(H}nA8DPqZ6PZ+sq#qJ)@~}`e0=1qxL(8>0m)+4UU}8X0|t?g zoKJ}xq;^%j+{AuSTtBm7!pvZm;{ry;mlik*cYGByOj@9z=Xr?5ccN*^oj;Dk?pz|8 n4s}0X98_tOHOT)}GBG)sQ&7?R#{p)(=LZkEa@er2FjxZsv6fXI literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_BolzanoAlter.gif b/assets/en/template/TEMPLATE_SIREN_BolzanoAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..240a5aa70520ea759b272b34fc39da6aa13a7c4f GIT binary patch literal 4408 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 ZxY(jj)TwP~wJZ_cxMU$Kp-~aX{{ow^Yl{E? literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_CesareAlter.gif b/assets/en/template/TEMPLATE_SIREN_CesareAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..e13ef5bb01a68d3ecf89ad23ebda37c5d454e74a GIT binary patch literal 3299 zcmeI!{WsHpAHea?Y}n@B7RJhkF~it~OiOdKG4}}xWz!IyqB!L%U5(1^bh#Pk=90@n zDyNWCk`~2`Fx}lJ(bk*fsCr&r6ch}BwI^XMj`~G%)f9drXywB^r-jDP2=5bw^ z0v$*n%7viS)zzKYsl1;lrCZZx$C9=jP_7r>CDjefs3dlgE!A zKX~xq{{8!tlau4)<0B&@3WcJ-zrU}qPbQPyxN)PWr{~I*D_vb(?d|PtZEfeyooi`n zX>M+AY;0_3XsEBRKYjXiO-)U8b#+x$l~gLNtgNi4s3vHYzOJsWj*gDDwzig*mZqjA3WY)8B!cJIetXilZvr7#AsF&=%AMmfRrY8eYC=^kQx9vF3)~?HW|G*`BEUd0 z4cp+-^eiGIf~=AU#4r(mP(s=&77h`LRS2|5P4YX~oqPi+6YD5~60{6Z7M;OEDqIai zDuLp^jFA_q8pd^0=%vON6`+knI+wFycMO~aSBnLy9519RF9VNTf)`dh#>@Dy7Xv|c zHha?fGY9AVs;CjYwY1~$MPjPgRTtPLl17E~w(&i<7fn8RylawpMV~uTiK8i6dE3-{ z%Hc$X@E;9#6nT(UPiG0EUjb=HnE7UPz(mI>iA$3xOnrYDDYV++nl4*zVxIah0*wFM zU!UaLm}f(#Sq`CGGN!Sj;8{{RL35A)wFAvM8<;3`tE}N9?*zh2lEuYmPPKcp|95}6 zYsh^5{24d{ka_?9{nFCX+qZ9Dzka>2urND2`~3OynVA`-Hjf@Xnwpvd)J#lFjE#-m zyLS(OGdw&jm&*qS2bJbrzka>DyBnBu`SRt?&d!dGj*AyBUbt}K?AfzGo~EWIU`}mq zEdU2-1E?t}DLHlO)QJ-(fH0YvnMaNsNl#Bdbm&lOYASFBAd{Gw2!s&|g}Zm}j*X2K z2n2wasHi9)Oh`xwfF&p>NNJ0&ukUYo@$&NeUYIRgw)_SeCX@Mx&H!X=Y;69}8BhbjcUYw)e0k<_{zj&qBu zvrrPp105FV+$`3JU2mpjjCY7R0qSIVd0A-(sFPQ(UcG$z5;O{c17ymxXU~8d4<9}p9UZ-U z_b$Lyqu;w=273O%RYK{{H^I#|NmB zAK3BZK>2|k%0T%Z4iG3tMn+0I)*1!au@)$6Z~!$_Rl)WCoIh;?|IH7)Ud|8uheeOh?csVParx6p7bJ-a5{%FLK;@dj!%oN0*X09daa_&#tu#-|ui0 z*2JqI2j)emykqkWiGKdk|16CYOYKtl(IR%UUx_)ftyXWM$*+oOZz+_QSqS}R literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_SirenBoss25.gif b/assets/en/template/TEMPLATE_SIREN_SirenBoss25.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ff8223cf1cb0797e211def5cb0cfc7eee077bcd GIT binary patch literal 1054 zcmZ?wbhEHb6k_0EXlG#f|NsBLfB*je{rl(7pI^Uz{rK_Y%a<>oKY#x8>C=Y~AKt%z z|L)zpw{PFRdGqG^^XHEqJ-T)4*3FwYZ``;$Bu2=wr$O;uG@Wo2bWMMXI|IcaHW$;rtH2?=p=aj~(nQBhG55fS0x;emmH0RaL2 z{{DV`e!jlGK0ZF4o}L~a9&T=KuCA^wE-uc_&Q4BFj*gBtHa1pPRu&c(W@culrlv+l zMuvul`uh5MdV0FLx>{OVnwpv#8X9V9YO1QLDk>_<%F2q0iV6w}a&mIAva&KVGLn*# z5)u;P;^JarVxpp=A|fKf!oosALV|*V0s;d3{QP`;d^|in92^{MY-|jpV917m;(u;G z*N|Xm#{gF&Jp*RO|Nj{jf3k2W0zISy@)RhWFmSwJ;N6q(nYBk;-+!0P6Q$N}aa{ps zn}Ee?XJ;BlENih`(b_d#PoVgN#izq<{TfLpW*90TJ3UofM)AOgq?Y4+^3GWsIuupB zXX=D(sE8Ce&^$@jw(5g`lk(9HL4`1el|rnH&5XK}{(QK2*nOgey2lIwM&%QHELzOug0WOw^S_Q@?Hij)Gg+-}eQhZ`c5&{MZ49UzK6KpDz SQn@GdN~q{4T(DMPum%8{kMC~) literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_SirenBoss26.gif b/assets/en/template/TEMPLATE_SIREN_SirenBoss26.gif new file mode 100644 index 0000000000000000000000000000000000000000..bbb95b27aceb40cfeb94307a0162c5e5282db080 GIT binary patch literal 2189 zcmZ?wbhEHb1xwB`_o;Y#h`0?Y%jvYIC^yrZzM-Cr8 zeCW`jg9i^DIB;O!zI}W5?%ln6_pV*Lwrtt5Y15`9OO`BHuwc%dIkRWao;7RMq)C$| zPMkPl!i4_*{@&i+o}QlW?(X*X_U7j1rlzKbhKBn3`r6vsnwpx5ii+~`^0KnBl9H0* z;^KmWg8cmayu7@eoSd|@w3L*TD zcQ-dT7Z(?2XJ-co2Rl1ETU%Qj8yjnDYbz@&Gcz+&Q&STY6JujzBO@b2Lqh`t1ATpc zJv}{LU0od=9c^uGEiElgO-&6A4K+12RaI3L6%}P=WhEsgMMXsg1qFF|c{w>bSy@>b z85wD5X(=fwNl8fw2?=p=aWOG5QBhG55fNcwVId(Q0RaJietteaK5lMqE-o&HQ83g( zK=D7fpKD04vtxj(k)8oF@#O&B=-Gf3(LY;bUxs-C#3=HsQM ziqlw``CSr{l#g=B`7N;tEMj3i$Y8gm=jNmq4t^Ud{@QI13cqlZVmNem=F2R_j+{WF(swMJL z$(U!Rj?8R}$^#1yHprwOD)@Qnh>w&}(t!fM35i}ahL8?qF>}FS16h1!6`9U*tSHMI8N0#Zbp*vh8FSBrq8O1D9S2Rd;W9BsQ+!9lG zDYbjLmPpnY2j->j5}H1T6a<5xbx&)+47K(vSFQkymJ1gyoH=vm)TvW=ikAKR_XCTT zJ$v>5iILwJQ-Nhbai!gbab?}wY9dkwzRYWiO51V4R$s?CtF#WelW%F*i3SSjNB$ z7p~Sjm9JFd=ds(KNy^jG&FYlZCMd1%*G?8;ngEiIFsQ( zuVR{56JzkRo*4#gd>khdQv9YE#_g-fvD7I6D-YdU0W3AF0e}AFEdT%j literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_TrentoAlter.gif b/assets/en/template/TEMPLATE_SIREN_TrentoAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..d789a3db1d872cad28ced55cc68d1c016b8bdfb5 GIT binary patch literal 2216 zcmZ?wbhEHb3xgM~@yjaA4=oo!hr>-?nYr=FOWo zZQ8VM-MY1F*REN!X4R@yD_5>uwrtswB}*19S~PFoyy?@YPnj}h^5n@ACr+F&VM1SD zUvF=3XJ=retv#lUS3X4PIh*7 zR#sMKW@bi4Mp{~0YHDgqN=kBaa#B)KVq#)KLPC6ed|X^yY;0^yOiXlibW~JSWMpJS zL_~Oacvx6iXlQ6iNJwySa8OWCU|?WCK!Cr$zn`CCcfhljhn zyPKPvtE;Pvi;J_fvy+pPqobpPgM+=jy`7z%t*xz%jg7UnwUw2XrKP2Xg@w7fxtW=n ziHV7^v9Xbnk)ffXfq{X(zP_HGp02L0j*gDDwzig*mWGCgnwpxbs;Y{Lin6k@l9H05 zqN1#i!a1@@{EF$E5z@qTu5?2P9l5IQ;2@hP^mE0N%G!v8<*tA?F6ci39 zHS(!hPRYqIY-F0E!!M)bvC*MR!XQ=aKu3XMrz9`0k;8!ow{A%V<&cPmrnb{v!buah zY%EUmn`Iy8#lv}+-ACT3`OA}w&2Ih*4h>l)GmV#@k+zRNv%oRJI`;$!XnE z21)yTEH6FbnQqZmQKKl_>Md%Na%6&I(lPJ3&dCQ>I5s^!DWn>8>rcR8HU34HbJkQa zZcgnMHMG65Vq)+KZYk}|86x_Xms(CqNR?kWAjp!=FRYd_@5_sck3D#fmE6!+I60+f zqO9Eqg%;kz4GY=DJMQkmBa-*|TTPoPn1$`}XbIvuDrl-MfK>&W;^BfQ8PMEn7Bh z*Z?eafW^(yrAvWj&Emz2=ggTiYu2o(Q>RXvG^xM8A6U?Ib#+0CnAXFMdnMGUU;1zxz&v}7?gH6^}qftM@_3JP*^a*)CW zSh9$TiHV4a01FpEK|uil0X{xHZfinbGEJPtZIO;Qq)l4vkY>=08Awpp{Gp|NuotAIv_ zN5aw55;{V0DglKqp51)qQ)xY24A-@7(d}iQ*D;bYi z$@lhL{M5!L?HF_E4(H}nA8DPqZ6PZ+sq#qJ)@~}`e0=1qxL(8>0m)+4UU}8X0|t?g zoKJ}xq;^%j+{AuSTtBm7!pvZm;{ry;mlik*cYGByOj@9z=Xr?5ccN*^oj;Dk?pz|8 n4s}0X98_tOHOT)}GBG)sQ&7?R#{p)(=LZkEa@er2FjxZsv6fXI literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_BolzanoAlter.gif b/assets/jp/template/TEMPLATE_SIREN_BolzanoAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..240a5aa70520ea759b272b34fc39da6aa13a7c4f GIT binary patch literal 4408 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 ZxY(jj)TwP~wJZ_cxMU$Kp-~aX{{ow^Yl{E? literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_CesareAlter.gif b/assets/jp/template/TEMPLATE_SIREN_CesareAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..e13ef5bb01a68d3ecf89ad23ebda37c5d454e74a GIT binary patch literal 3299 zcmeI!{WsHpAHea?Y}n@B7RJhkF~it~OiOdKG4}}xWz!IyqB!L%U5(1^bh#Pk=90@n zDyNWCk`~2`Fx}lJ(bk*fsCr&r6ch}BwI^XMj`~G%)f9drXywB^r-jDP2=5bw^ z0v$*n%7viS)zzKYsl1;lrCZZx$C9=jP_7r>CDjefs3dlgE!A zKX~xq{{8!tlau4)<0B&@3WcJ-zrU}qPbQPyxN)PWr{~I*D_vb(?d|PtZEfeyooi`n zX>M+AY;0_3XsEBRKYjXiO-)U8b#+x$l~gLNtgNi4s3vHYzOJsWj*gDDwzig*mZqjA3WY)8B!cJIetXilZvr7#AsF&=%AMmfRrY8eYC=^kQx9vF3)~?HW|G*`BEUd0 z4cp+-^eiGIf~=AU#4r(mP(s=&77h`LRS2|5P4YX~oqPi+6YD5~60{6Z7M;OEDqIai zDuLp^jFA_q8pd^0=%vON6`+knI+wFycMO~aSBnLy9519RF9VNTf)`dh#>@Dy7Xv|c zHha?fGY9AVs;CjYwY1~$MPjPgRTtPLl17E~w(&i<7fn8RylawpMV~uTiK8i6dE3-{ z%Hc$X@E;9#6nT(UPiG0EUjb=HnE7UPz(mI>iA$3xOnrYDDYV++nl4*zVxIah0*wFM zU!UaLm}f(#Sq`CGGN!Sj;8{{RL35A)wFAvM8<;3`tE}N9?*zh2lEuYmPPKcp|95}6 zYsh^5{24d{ka_?9{nFCX+qZ9Dzka>2urND2`~3OynVA`-Hjf@Xnwpvd)J#lFjE#-m zyLS(OGdw&jm&*qS2bJbrzka>DyBnBu`SRt?&d!dGj*AyBUbt}K?AfzGo~EWIU`}mq zEdU2-1E?t}DLHlO)QJ-(fH0YvnMaNsNl#Bdbm&lOYASFBAd{Gw2!s&|g}Zm}j*X2K z2n2wasHi9)Oh`xwfF&p>NNJ0&ukUYo@$&NeUYIRgw)_SeCX@Mx&H!X=Y;69}8BhbjcUYw)e0k<_{zj&qBu zvrrPp105FV+$`3JU2mpjjCY7R0qSIVd0A-(sFPQ(UcG$z5;O{c17ymxXU~8d4<9}p9UZ-U z_b$Lyqu;w=273O%RYK{{H^I#|NmB zAK3BZK>2|k%0T%Z4iG3tMn+0I)*1!au@)$6Z~!$_Rl)WCoIh;?|IH7)Ud|8uheeOh?csVParx6p7bJ-a5{%FLK;@dj!%oN0*X09daa_&#tu#-|ui0 z*2JqI2j)emykqkWiGKdk|16CYOYKtl(IR%UUx_)ftyXWM$*+oOZz+_QSqS}R literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_SirenBoss25.gif b/assets/jp/template/TEMPLATE_SIREN_SirenBoss25.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ff8223cf1cb0797e211def5cb0cfc7eee077bcd GIT binary patch literal 1054 zcmZ?wbhEHb6k_0EXlG#f|NsBLfB*je{rl(7pI^Uz{rK_Y%a<>oKY#x8>C=Y~AKt%z z|L)zpw{PFRdGqG^^XHEqJ-T)4*3FwYZ``;$Bu2=wr$O;uG@Wo2bWMMXI|IcaHW$;rtH2?=p=aj~(nQBhG55fS0x;emmH0RaL2 z{{DV`e!jlGK0ZF4o}L~a9&T=KuCA^wE-uc_&Q4BFj*gBtHa1pPRu&c(W@culrlv+l zMuvul`uh5MdV0FLx>{OVnwpv#8X9V9YO1QLDk>_<%F2q0iV6w}a&mIAva&KVGLn*# z5)u;P;^JarVxpp=A|fKf!oosALV|*V0s;d3{QP`;d^|in92^{MY-|jpV917m;(u;G z*N|Xm#{gF&Jp*RO|Nj{jf3k2W0zISy@)RhWFmSwJ;N6q(nYBk;-+!0P6Q$N}aa{ps zn}Ee?XJ;BlENih`(b_d#PoVgN#izq<{TfLpW*90TJ3UofM)AOgq?Y4+^3GWsIuupB zXX=D(sE8Ce&^$@jw(5g`lk(9HL4`1el|rnH&5XK}{(QK2*nOgey2lIwM&%QHELzOug0WOw^S_Q@?Hij)Gg+-}eQhZ`c5&{MZ49UzK6KpDz SQn@GdN~q{4T(DMPum%8{kMC~) literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_SirenBoss26.gif b/assets/jp/template/TEMPLATE_SIREN_SirenBoss26.gif new file mode 100644 index 0000000000000000000000000000000000000000..bbb95b27aceb40cfeb94307a0162c5e5282db080 GIT binary patch literal 2189 zcmZ?wbhEHb1xwB`_o;Y#h`0?Y%jvYIC^yrZzM-Cr8 zeCW`jg9i^DIB;O!zI}W5?%ln6_pV*Lwrtt5Y15`9OO`BHuwc%dIkRWao;7RMq)C$| zPMkPl!i4_*{@&i+o}QlW?(X*X_U7j1rlzKbhKBn3`r6vsnwpx5ii+~`^0KnBl9H0* z;^KmWg8cmayu7@eoSd|@w3L*TD zcQ-dT7Z(?2XJ-co2Rl1ETU%Qj8yjnDYbz@&Gcz+&Q&STY6JujzBO@b2Lqh`t1ATpc zJv}{LU0od=9c^uGEiElgO-&6A4K+12RaI3L6%}P=WhEsgMMXsg1qFF|c{w>bSy@>b z85wD5X(=fwNl8fw2?=p=aWOG5QBhG55fNcwVId(Q0RaJietteaK5lMqE-o&HQ83g( zK=D7fpKD04vtxj(k)8oF@#O&B=-Gf3(LY;bUxs-C#3=HsQM ziqlw``CSr{l#g=B`7N;tEMj3i$Y8gm=jNmq4t^Ud{@QI13cqlZVmNem=F2R_j+{WF(swMJL z$(U!Rj?8R}$^#1yHprwOD)@Qnh>w&}(t!fM35i}ahL8?qF>}FS16h1!6`9U*tSHMI8N0#Zbp*vh8FSBrq8O1D9S2Rd;W9BsQ+!9lG zDYbjLmPpnY2j->j5}H1T6a<5xbx&)+47K(vSFQkymJ1gyoH=vm)TvW=ikAKR_XCTT zJ$v>5iILwJQ-Nhbai!gbab?}wY9dkwzRYWiO51V4R$s?CtF#WelW%F*i3SSjNB$ z7p~Sjm9JFd=ds(KNy^jG&FYlZCMd1%*G?8;ngEiIFsQ( zuVR{56JzkRo*4#gd>khdQv9YE#_g-fvD7I6D-YdU0W3AF0e}AFEdT%j literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_TrentoAlter.gif b/assets/jp/template/TEMPLATE_SIREN_TrentoAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..d789a3db1d872cad28ced55cc68d1c016b8bdfb5 GIT binary patch literal 2216 zcmZ?wbhEHb3xgM~@yjaA4=oo!hr>-?nYr=FOWo zZQ8VM-MY1F*REN!X4R@yD_5>uwrtswB}*19S~PFoyy?@YPnj}h^5n@ACr+F&VM1SD zUvF=3XJ=retv#lUS3X4PIh*7 zR#sMKW@bi4Mp{~0YHDgqN=kBaa#B)KVq#)KLPC6ed|X^yY;0^yOiXlibW~JSWMpJS zL_~Oacvx6iXlQ6iNJwySa8OWCU|?WCK!Cr$zn`CCcfhljhn zyPKPvtE;Pvi;J_fvy+pPqobpPgM+=jy`7z%t*xz%jg7UnwUw2XrKP2Xg@w7fxtW=n ziHV7^v9Xbnk)ffXfq{X(zP_HGp02L0j*gDDwzig*mWGCgnwpxbs;Y{Lin6k@l9H05 zqN1#i!a1@@{EF$E5z@qTu5?2P9l5IQ;2@hP^mE0N%G!v8<*tA?F6ci39 zHS(!hPRYqIY-F0E!!M)bvC*MR!XQ=aKu3XMrz9`0k;8!ow{A%V<&cPmrnb{v!buah zY%EUmn`Iy8#lv}+-ACT3`OA}w&2Ih*4h>l)GmV#@k+zRNv%oRJI`;$!XnE z21)yTEH6FbnQqZmQKKl_>Md%Na%6&I(lPJ3&dCQ>I5s^!DWn>8>rcR8HU34HbJkQa zZcgnMHMG65Vq)+KZYk}|86x_Xms(CqNR?kWAjp!=FRYd_@5_sck3D#fmE6!+I60+f zqO9Eqg%;kz4GY=DJMQkmBa-*|TTPoPn1$`}XbIvuDrl-MfK>&W;^BfQ8PMEn7Bh z*Z?eafW^(yrAvWj&Emz2=ggTiYu2o(Q>RXvG^xM8A6U?Ib#+0CnAXFMdnMGUU;1zxz&v}7?gH6^}qftM@_3JP*^a*)CW zSh9$TiHV4a01FpEK|uil0X{xHZfinbGEJPtZIO;Qq)l4vkY>=08Awpp{Gp|NuotAIv_ zN5aw55;{V0DglKqp51)qQ)xY24A-@7(d}iQ*D;bYi z$@lhL{M5!L?HF_E4(H}nA8DPqZ6PZ+sq#qJ)@~}`e0=1qxL(8>0m)+4UU}8X0|t?g zoKJ}xq;^%j+{AuSTtBm7!pvZm;{ry;mlik*cYGByOj@9z=Xr?5ccN*^oj;Dk?pz|8 n4s}0X98_tOHOT)}GBG)sQ&7?R#{p)(=LZkEa@er2FjxZsv6fXI literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_BolzanoAlter.gif b/assets/tw/template/TEMPLATE_SIREN_BolzanoAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..240a5aa70520ea759b272b34fc39da6aa13a7c4f GIT binary patch literal 4408 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 ZxY(jj)TwP~wJZ_cxMU$Kp-~aX{{ow^Yl{E? literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_CesareAlter.gif b/assets/tw/template/TEMPLATE_SIREN_CesareAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..e13ef5bb01a68d3ecf89ad23ebda37c5d454e74a GIT binary patch literal 3299 zcmeI!{WsHpAHea?Y}n@B7RJhkF~it~OiOdKG4}}xWz!IyqB!L%U5(1^bh#Pk=90@n zDyNWCk`~2`Fx}lJ(bk*fsCr&r6ch}BwI^XMj`~G%)f9drXywB^r-jDP2=5bw^ z0v$*n%7viS)zzKYsl1;lrCZZx$C9=jP_7r>CDjefs3dlgE!A zKX~xq{{8!tlau4)<0B&@3WcJ-zrU}qPbQPyxN)PWr{~I*D_vb(?d|PtZEfeyooi`n zX>M+AY;0_3XsEBRKYjXiO-)U8b#+x$l~gLNtgNi4s3vHYzOJsWj*gDDwzig*mZqjA3WY)8B!cJIetXilZvr7#AsF&=%AMmfRrY8eYC=^kQx9vF3)~?HW|G*`BEUd0 z4cp+-^eiGIf~=AU#4r(mP(s=&77h`LRS2|5P4YX~oqPi+6YD5~60{6Z7M;OEDqIai zDuLp^jFA_q8pd^0=%vON6`+knI+wFycMO~aSBnLy9519RF9VNTf)`dh#>@Dy7Xv|c zHha?fGY9AVs;CjYwY1~$MPjPgRTtPLl17E~w(&i<7fn8RylawpMV~uTiK8i6dE3-{ z%Hc$X@E;9#6nT(UPiG0EUjb=HnE7UPz(mI>iA$3xOnrYDDYV++nl4*zVxIah0*wFM zU!UaLm}f(#Sq`CGGN!Sj;8{{RL35A)wFAvM8<;3`tE}N9?*zh2lEuYmPPKcp|95}6 zYsh^5{24d{ka_?9{nFCX+qZ9Dzka>2urND2`~3OynVA`-Hjf@Xnwpvd)J#lFjE#-m zyLS(OGdw&jm&*qS2bJbrzka>DyBnBu`SRt?&d!dGj*AyBUbt}K?AfzGo~EWIU`}mq zEdU2-1E?t}DLHlO)QJ-(fH0YvnMaNsNl#Bdbm&lOYASFBAd{Gw2!s&|g}Zm}j*X2K z2n2wasHi9)Oh`xwfF&p>NNJ0&ukUYo@$&NeUYIRgw)_SeCX@Mx&H!X=Y;69}8BhbjcUYw)e0k<_{zj&qBu zvrrPp105FV+$`3JU2mpjjCY7R0qSIVd0A-(sFPQ(UcG$z5;O{c17ymxXU~8d4<9}p9UZ-U z_b$Lyqu;w=273O%RYK{{H^I#|NmB zAK3BZK>2|k%0T%Z4iG3tMn+0I)*1!au@)$6Z~!$_Rl)WCoIh;?|IH7)Ud|8uheeOh?csVParx6p7bJ-a5{%FLK;@dj!%oN0*X09daa_&#tu#-|ui0 z*2JqI2j)emykqkWiGKdk|16CYOYKtl(IR%UUx_)ftyXWM$*+oOZz+_QSqS}R literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_SirenBoss25.gif b/assets/tw/template/TEMPLATE_SIREN_SirenBoss25.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ff8223cf1cb0797e211def5cb0cfc7eee077bcd GIT binary patch literal 1054 zcmZ?wbhEHb6k_0EXlG#f|NsBLfB*je{rl(7pI^Uz{rK_Y%a<>oKY#x8>C=Y~AKt%z z|L)zpw{PFRdGqG^^XHEqJ-T)4*3FwYZ``;$Bu2=wr$O;uG@Wo2bWMMXI|IcaHW$;rtH2?=p=aj~(nQBhG55fS0x;emmH0RaL2 z{{DV`e!jlGK0ZF4o}L~a9&T=KuCA^wE-uc_&Q4BFj*gBtHa1pPRu&c(W@culrlv+l zMuvul`uh5MdV0FLx>{OVnwpv#8X9V9YO1QLDk>_<%F2q0iV6w}a&mIAva&KVGLn*# z5)u;P;^JarVxpp=A|fKf!oosALV|*V0s;d3{QP`;d^|in92^{MY-|jpV917m;(u;G z*N|Xm#{gF&Jp*RO|Nj{jf3k2W0zISy@)RhWFmSwJ;N6q(nYBk;-+!0P6Q$N}aa{ps zn}Ee?XJ;BlENih`(b_d#PoVgN#izq<{TfLpW*90TJ3UofM)AOgq?Y4+^3GWsIuupB zXX=D(sE8Ce&^$@jw(5g`lk(9HL4`1el|rnH&5XK}{(QK2*nOgey2lIwM&%QHELzOug0WOw^S_Q@?Hij)Gg+-}eQhZ`c5&{MZ49UzK6KpDz SQn@GdN~q{4T(DMPum%8{kMC~) literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_SirenBoss26.gif b/assets/tw/template/TEMPLATE_SIREN_SirenBoss26.gif new file mode 100644 index 0000000000000000000000000000000000000000..bbb95b27aceb40cfeb94307a0162c5e5282db080 GIT binary patch literal 2189 zcmZ?wbhEHb1xwB`_o;Y#h`0?Y%jvYIC^yrZzM-Cr8 zeCW`jg9i^DIB;O!zI}W5?%ln6_pV*Lwrtt5Y15`9OO`BHuwc%dIkRWao;7RMq)C$| zPMkPl!i4_*{@&i+o}QlW?(X*X_U7j1rlzKbhKBn3`r6vsnwpx5ii+~`^0KnBl9H0* z;^KmWg8cmayu7@eoSd|@w3L*TD zcQ-dT7Z(?2XJ-co2Rl1ETU%Qj8yjnDYbz@&Gcz+&Q&STY6JujzBO@b2Lqh`t1ATpc zJv}{LU0od=9c^uGEiElgO-&6A4K+12RaI3L6%}P=WhEsgMMXsg1qFF|c{w>bSy@>b z85wD5X(=fwNl8fw2?=p=aWOG5QBhG55fNcwVId(Q0RaJietteaK5lMqE-o&HQ83g( zK=D7fpKD04vtxj(k)8oF@#O&B=-Gf3(LY;bUxs-C#3=HsQM ziqlw``CSr{l#g=B`7N;tEMj3i$Y8gm=jNmq4t^Ud{@QI13cqlZVmNem=F2R_j+{WF(swMJL z$(U!Rj?8R}$^#1yHprwOD)@Qnh>w&}(t!fM35i}ahL8?qF>}FS16h1!6`9U*tSHMI8N0#Zbp*vh8FSBrq8O1D9S2Rd;W9BsQ+!9lG zDYbjLmPpnY2j->j5}H1T6a<5xbx&)+47K(vSFQkymJ1gyoH=vm)TvW=ikAKR_XCTT zJ$v>5iILwJQ-Nhbai!gbab?}wY9dkwzRYWiO51V4R$s?CtF#WelW%F*i3SSjNB$ z7p~Sjm9JFd=ds(KNy^jG&FYlZCMd1%*G?8;ngEiIFsQ( zuVR{56JzkRo*4#gd>khdQv9YE#_g-fvD7I6D-YdU0W3AF0e}AFEdT%j literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_TrentoAlter.gif b/assets/tw/template/TEMPLATE_SIREN_TrentoAlter.gif new file mode 100644 index 0000000000000000000000000000000000000000..d789a3db1d872cad28ced55cc68d1c016b8bdfb5 GIT binary patch literal 2216 zcmZ?wbhEHb3xgM~@yjaA4=oo!hr>-?nYr=FOWo zZQ8VM-MY1F*REN!X4R@yD_5>uwrtswB}*19S~PFoyy?@YPnj}h^5n@ACr+F&VM1SD zUvF=3XJ=retv#lUS3X4PIh*7 zR#sMKW@bi4Mp{~0YHDgqN=kBaa#B)KVq#)KLPC6ed|X^yY;0^yOiXlibW~JSWMpJS zL_~Oacvx6iXlQ6iNJwySa8OWCU|?WCK!Cr$zn`CCcfhljhn zyPKPvtE;Pvi;J_fvy+pPqobpPgM+=jy`7z%t*xz%jg7UnwUw2XrKP2Xg@w7fxtW=n ziHV7^v9Xbnk)ffXfq{X(zP_HGp02L0j*gDDwzig*mWGCgnwpxbs;Y{Lin6k@l9H05 zqN1#i!a1@@{EF$E5z@qTu5?2P9l5IQ;2@hP^mE0N%G!v8<*tA?F6ci39 zHS(!hPRYqIY-F0E!!M)bvC*MR!XQ=aKu3XMrz9`0k;8!ow{A%V<&cPmrnb{v!buah zY%EUmn`Iy8#lv}+-ACT3`OA}w&2Ih*4h>l)GmV#@k+zRNv%oRJI`;$!XnE z21)yTEH6FbnQqZmQKKl_>Md%Na%6&I(lPJ3&dCQ>I5s^!DWn>8>rcR8HU34HbJkQa zZcgnMHMG65Vq)+KZYk}|86x_Xms(CqNR?kWAjp!=FRYd_@5_sck3D#fmE6!+I60+f zqO9Eqg%;kz4GY=DJMQkmBa-*|TTPoPn1$`}XbIvuDrl-MfK>&W;^BfQ8PMEn7Bh z*Z?eafW^(yrAvWj&Emz2=ggTiYu2o(Q>RXvG^xM8A6U?Ib#+0CnAXFMdnMGUU;1zxz&v}7?gH6^}qftM@_3JP*^a*)CW zSh9$TiHV4a01FpEK|uil0X{xHZfinbGEJPtZIO;Qq)l4vkY>=08Awpp{Gp|NuotAIv_ zN5aw55;{V0DglKqp51)qQ)xY24A-@7(d}iQ*D;bYi z$@lhL{M5!L?HF_E4(H}nA8DPqZ6PZ+sq#qJ)@~}`e0=1qxL(8>0m)+4UU}8X0|t?g zoKJ}xq;^%j+{AuSTtBm7!pvZm;{ry;mlik*cYGByOj@9z=Xr?5ccN*^oj;Dk?pz|8 n4s}0X98_tOHOT)}GBG)sQ&7?R#{p)(=LZkEa@er2FjxZsv6fXI literal 0 HcmV?d00001 diff --git a/campaign/event_20250227_cn/a1.py b/campaign/event_20250227_cn/a1.py index c5515790e..60aba3579 100644 --- a/campaign/event_20250227_cn/a1.py +++ b/campaign/event_20250227_cn/a1.py @@ -58,7 +58,9 @@ class Config: # ===== End of generated config ===== MAP_CHAPTER_SWITCH_20241219 = True + MAP_HAS_MODE_SWITCH = True STAGE_ENTRANCE = ['half', '20240725'] + STAGE_INCREASE_AB = True MAP_SIREN_HAS_BOSS_ICON_SMALL = True INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { 'height': (80, 255 - 33), diff --git a/campaign/event_20250227_cn/b1.py b/campaign/event_20250227_cn/b1.py new file mode 100644 index 000000000..7602ea1b1 --- /dev/null +++ b/campaign/event_20250227_cn/b1.py @@ -0,0 +1,96 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('B1') +MAP.shape = 'K8' +MAP.camera_data = ['D2', 'D6', 'H2', 'H6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ ME -- -- -- ME -- ++ -- ME -- + ME -- ++ -- ++ -- ME ++ ME -- ME + -- -- -- MB -- -- -- -- -- -- -- + -- Me ++ -- ++ Me -- ++ ++ ++ -- + -- -- MS __ MS -- -- -- ME -- -- + Me -- -- MS -- -- Me -- -- ME -- + ++ ++ -- -- -- ++ ++ Me ME -- ++ + ++ ++ SP -- SP ++ ++ -- -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2, 'boss': 1}, + {'battle': 5, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['TrentoAlter', 'BolzanoAlter', 'CesareAlter'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + MAP_HAS_MODE_SWITCH = True + STAGE_ENTRANCE = ['half', '20240725'] + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_SWIPE_MULTIPLY = (1.131, 1.152) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.094, 1.114) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.062, 1.081) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20250227_cn/b2.py b/campaign/event_20250227_cn/b2.py new file mode 100644 index 000000000..374091673 --- /dev/null +++ b/campaign/event_20250227_cn/b2.py @@ -0,0 +1,80 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'K8' +MAP.camera_data = ['E2', 'E6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G2', 'E2'] +MAP.map_data = """ + -- -- ++ ++ SP -- SP ++ ++ -- -- + -- -- ++ ++ -- -- -- ++ ++ -- -- + -- -- Me -- -- MS -- -- Me -- -- + ++ ME -- -- MS -- MS -- -- ME ++ + ++ -- -- ME -- MB -- ME -- -- ++ + -- -- Me -- -- __ -- -- Me -- -- + -- ++ -- ME -- Me -- ME -- ++ -- + -- -- -- -- ME -- ME -- -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SirenBoss26'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.258, 1.282) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.217, 1.239) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.182, 1.203) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20250227_cn/b3.py b/campaign/event_20250227_cn/b3.py new file mode 100644 index 000000000..33e212116 --- /dev/null +++ b/campaign/event_20250227_cn/b3.py @@ -0,0 +1,85 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'K9' +MAP.camera_data = ['E3', 'E6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['E6', 'G6'] +MAP.map_data = """ + -- ++ ++ -- -- -- -- -- ++ ++ -- + -- ++ ++ -- -- MB -- -- ++ ++ -- + -- -- ++ ++ ++ -- ++ ++ ++ -- -- + -- ++ -- Me -- __ -- Me -- ++ -- + -- ME Me -- MS -- MS -- Me ME -- + -- ME -- -- -- MS -- -- -- ME -- + -- ME -- ME -- -- -- ME -- ME -- + -- ++ ME ++ SP -- SP ++ ME ++ -- + -- -- -- ++ -- -- -- ++ -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 10 10 10 50 50 50 50 + 50 50 50 50 10 10 10 50 50 50 50 + 50 50 50 50 10 10 10 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SirenBoss26', 'SirenBoss25'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.063, 1.083) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.028, 1.047) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.998, 1.016) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/module/template/assets.py b/module/template/assets.py index e4f19d3a4..3db698482 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -64,6 +64,7 @@ TEMPLATE_SIREN_BBpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SI TEMPLATE_SIREN_BBred = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BBred.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BBred.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BBred.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BBred.gif'}) TEMPLATE_SIREN_BaltimoreIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BaltimoreIdol.gif'}) TEMPLATE_SIREN_Bellona = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Bellona.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Bellona.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Bellona.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Bellona.gif'}) +TEMPLATE_SIREN_BolzanoAlter = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BolzanoAlter.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BolzanoAlter.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BolzanoAlter.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BolzanoAlter.gif'}) TEMPLATE_SIREN_CA = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CA.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CA.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CA.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CA.gif'}) TEMPLATE_SIREN_CAalchemist = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CAalchemist.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CAalchemist.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CAalchemist.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CAalchemist.gif'}) TEMPLATE_SIREN_CAgreen = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CAgreen.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CAgreen.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CAgreen.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CAgreen.gif'}) @@ -78,6 +79,7 @@ TEMPLATE_SIREN_CValchemist = Template(file={'cn': './assets/cn/template/TEMPLATE TEMPLATE_SIREN_CVlightning = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CVlightning.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CVlightning.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CVlightning.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CVlightning.gif'}) TEMPLATE_SIREN_CVpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CVpurple.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CVpurple.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CVpurple.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CVpurple.gif'}) TEMPLATE_SIREN_Carabiniere = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Carabiniere.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Carabiniere.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Carabiniere.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Carabiniere.gif'}) +TEMPLATE_SIREN_CesareAlter = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CesareAlter.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CesareAlter.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CesareAlter.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CesareAlter.gif'}) TEMPLATE_SIREN_Champagne = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Champagne.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Champagne.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Champagne.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Champagne.gif'}) TEMPLATE_SIREN_ChihayaKisaragi = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_ChihayaKisaragi.gif', 'en': './assets/en/template/TEMPLATE_SIREN_ChihayaKisaragi.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_ChihayaKisaragi.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_ChihayaKisaragi.gif'}) TEMPLATE_SIREN_Chitose = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Chitose.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Chitose.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Chitose.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Chitose.gif'}) @@ -199,6 +201,8 @@ TEMPLATE_SIREN_SirenBoss16 = Template(file={'cn': './assets/cn/template/TEMPLATE TEMPLATE_SIREN_SirenBoss18 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss18.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss18.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss18.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss18.gif'}) TEMPLATE_SIREN_SirenBoss182 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss182.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss182.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss182.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss182.gif'}) TEMPLATE_SIREN_SirenBoss19 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss19.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss19.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss19.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss19.gif'}) +TEMPLATE_SIREN_SirenBoss25 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss25.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss25.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss25.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss25.gif'}) +TEMPLATE_SIREN_SirenBoss26 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss26.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss26.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss26.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss26.gif'}) TEMPLATE_SIREN_Sirenboss10 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Sirenboss10.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Sirenboss10.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Sirenboss10.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Sirenboss10.gif'}) TEMPLATE_SIREN_Sirius = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Sirius.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Sirius.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Sirius.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Sirius.gif'}) TEMPLATE_SIREN_Soobrazitelny = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Soobrazitelny.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Soobrazitelny.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Soobrazitelny.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Soobrazitelny.gif'}) @@ -215,6 +219,7 @@ TEMPLATE_SIREN_ToLoveNana01 = Template(file={'cn': './assets/cn/template/TEMPLAT TEMPLATE_SIREN_ToLoveNana03 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_ToLoveNana03.gif', 'en': './assets/en/template/TEMPLATE_SIREN_ToLoveNana03.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_ToLoveNana03.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_ToLoveNana03.gif'}) TEMPLATE_SIREN_ToLoveYui02 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_ToLoveYui02.gif', 'en': './assets/en/template/TEMPLATE_SIREN_ToLoveYui02.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_ToLoveYui02.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_ToLoveYui02.gif'}) TEMPLATE_SIREN_Trento = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Trento.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Trento.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Trento.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Trento.gif'}) +TEMPLATE_SIREN_TrentoAlter = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_TrentoAlter.gif', 'en': './assets/en/template/TEMPLATE_SIREN_TrentoAlter.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_TrentoAlter.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_TrentoAlter.gif'}) TEMPLATE_SIREN_U101 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_U101.gif', 'en': './assets/en/template/TEMPLATE_SIREN_U101.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_U101.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_U101.gif'}) TEMPLATE_SIREN_U522 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_U522.gif', 'en': './assets/en/template/TEMPLATE_SIREN_U522.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_U522.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_U522.gif'}) TEMPLATE_SIREN_U73 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_U73.gif', 'en': './assets/en/template/TEMPLATE_SIREN_U73.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_U73.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_U73.gif'}) From 852fe6fbf8ebd081ed320816a348c02f0438ca1a Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 27 Feb 2025 23:19:14 +0800 Subject: [PATCH 49/56] Add: Chapter CD --- campaign/event_20250227_cn/c1.py | 96 ++++++++++++++++++++++++++++++++ campaign/event_20250227_cn/c2.py | 79 ++++++++++++++++++++++++++ campaign/event_20250227_cn/c3.py | 80 ++++++++++++++++++++++++++ campaign/event_20250227_cn/d1.py | 96 ++++++++++++++++++++++++++++++++ campaign/event_20250227_cn/d2.py | 89 +++++++++++++++++++++++++++++ campaign/event_20250227_cn/d3.py | 94 +++++++++++++++++++++++++++++++ 6 files changed, 534 insertions(+) create mode 100644 campaign/event_20250227_cn/c1.py create mode 100644 campaign/event_20250227_cn/c2.py create mode 100644 campaign/event_20250227_cn/c3.py create mode 100644 campaign/event_20250227_cn/d1.py create mode 100644 campaign/event_20250227_cn/d2.py create mode 100644 campaign/event_20250227_cn/d3.py diff --git a/campaign/event_20250227_cn/c1.py b/campaign/event_20250227_cn/c1.py new file mode 100644 index 000000000..089505dfe --- /dev/null +++ b/campaign/event_20250227_cn/c1.py @@ -0,0 +1,96 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('C1') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ++ -- ME -- -- SP SP ++ MB + -- ME -- ME -- -- -- -- -- + ME -- ++ ++ Me -- -- __ Me + -- -- ++ ++ -- MS MS -- -- + -- ME -- -- ME -- -- ++ -- + -- -- ME -- -- -- Me ++ -- + ME -- -- -- Me -- -- Me -- + -- -- ME ++ ++ ++ -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + MAP_HAS_MODE_SWITCH = True + STAGE_ENTRANCE = ['half', '20240725'] + STAGE_INCREASE_AB = True + MAP_SIREN_HAS_BOSS_ICON_SMALL = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_SWIPE_MULTIPLY = (1.227, 1.250) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.187, 1.209) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.152, 1.173) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20250227_cn/c2.py b/campaign/event_20250227_cn/c2.py new file mode 100644 index 000000000..7c6304e46 --- /dev/null +++ b/campaign/event_20250227_cn/c2.py @@ -0,0 +1,79 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['F2', 'D2'] +MAP.map_data = """ + -- -- ME -- -- ME -- ++ -- + ME ++ -- ME -- -- -- -- ME + -- -- ME ++ ++ ++ -- Me -- + -- ME -- SP -- SP -- -- -- + -- -- -- -- -- -- -- -- ME + -- ME -- -- __ -- -- Me -- + ME ++ -- MS -- MS -- ++ ++ + -- ++ Me -- MB -- Me ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.128, 1.149) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.091, 1.111) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.059, 1.078) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20250227_cn/c3.py b/campaign/event_20250227_cn/c3.py new file mode 100644 index 000000000..c00feb34f --- /dev/null +++ b/campaign/event_20250227_cn/c3.py @@ -0,0 +1,80 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP -- -- -- ++ -- ++ ++ -- + SP -- -- MS -- -- Me ++ ++ -- + ++ ++ ++ -- MS -- -- -- ME -- + -- -- -- __ -- -- Me -- -- ME + -- ME -- -- Me ++ Me -- ME ++ + ME -- MB -- -- ++ Me -- -- ME + ++ ++ -- ME -- -- -- -- ME -- + ++ ++ ME -- -- ++ -- ME -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.240, 1.263) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.199, 1.221) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.164, 1.185) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20250227_cn/d1.py b/campaign/event_20250227_cn/d1.py new file mode 100644 index 000000000..e5b0cbeb7 --- /dev/null +++ b/campaign/event_20250227_cn/d1.py @@ -0,0 +1,96 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('D1') +MAP.shape = 'K8' +MAP.camera_data = ['D2', 'D6', 'H2', 'H6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ ME -- -- -- ME -- ++ -- ME -- + ME -- ++ -- ++ -- ME ++ ME -- ME + -- -- -- MB -- -- -- -- -- -- -- + -- Me ++ -- ++ Me -- ++ ++ ++ -- + -- -- MS __ MS -- -- -- ME -- -- + Me -- -- MS -- -- Me -- -- ME -- + ++ ++ -- -- -- ++ ++ Me ME -- ++ + ++ ++ SP -- SP ++ ++ -- -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['TrentoAlter', 'BolzanoAlter', 'CesareAlter'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + MAP_HAS_MODE_SWITCH = True + STAGE_ENTRANCE = ['half', '20240725'] + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_SWIPE_MULTIPLY = (1.131, 1.152) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.094, 1.114) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.062, 1.081) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20250227_cn/d2.py b/campaign/event_20250227_cn/d2.py new file mode 100644 index 000000000..5f495dc4a --- /dev/null +++ b/campaign/event_20250227_cn/d2.py @@ -0,0 +1,89 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'K8' +MAP.camera_data = ['E2', 'E6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G2', 'E2'] +MAP.map_data = """ + -- -- ++ ++ SP -- SP ++ ++ -- -- + -- -- ++ ++ -- -- -- ++ ++ -- -- + -- -- Me -- -- MS -- -- Me -- -- + ++ ME -- -- MS -- MS -- -- ME ++ + ++ -- -- ME -- MB -- ME -- -- ++ + -- -- Me -- -- __ -- -- Me -- -- + -- ++ -- ME -- Me -- ME -- ++ -- + -- -- -- -- ME -- ME -- -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SirenBoss26'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.258, 1.282) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.217, 1.239) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.182, 1.203) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20250227_cn/d3.py b/campaign/event_20250227_cn/d3.py new file mode 100644 index 000000000..6d1d33f7c --- /dev/null +++ b/campaign/event_20250227_cn/d3.py @@ -0,0 +1,94 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'K9' +MAP.camera_data = ['E3', 'E6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['E6', 'G6'] +MAP.map_data = """ + -- ++ ++ -- -- -- -- -- ++ ++ -- + -- ++ ++ -- -- MB -- -- ++ ++ -- + -- -- ++ ++ ++ -- ++ ++ ++ -- -- + -- ++ -- Me -- __ -- Me -- ++ -- + -- ME Me -- MS -- MS -- Me ME -- + -- ME -- -- -- MS -- -- -- ME -- + -- ME -- ME -- -- -- ME -- ME -- + -- ++ ME ++ SP -- SP ++ ME ++ -- + -- -- -- ++ -- -- -- ++ -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 10 10 10 50 50 50 50 + 50 50 50 50 10 10 10 50 50 50 50 + 50 50 50 50 10 10 10 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SirenBoss26', 'SirenBoss25'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.063, 1.083) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.028, 1.047) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.998, 1.016) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() From e222c31fb71b06960c5e7be1a6dc0577733c3baf Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 27 Feb 2025 23:30:13 +0800 Subject: [PATCH 50/56] Add: Auto increase from chapter A to B --- module/config/config_manual.py | 3 +++ module/handler/fast_forward.py | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/module/config/config_manual.py b/module/config/config_manual.py index bba88a081..f35d6c8f1 100644 --- a/module/config/config_manual.py +++ b/module/config/config_manual.py @@ -115,6 +115,9 @@ class ManualConfig: MAP_HAS_MODE_SWITCH = False # event_20240725_cn has mode switch in map preparation # Events from 20240725 to 20241219 introduced new chapter switches MAP_CHAPTER_SWITCH_20241219 = False + # Since event_20241219_cn chapter B unlocks event startup + # which means chapter AB are continuous + STAGE_INCREASE_AB = False MAP_HAS_CLEAR_PERCENTAGE = True MAP_HAS_WALK_SPEEDUP = False MAP_HAS_AMBUSH = True diff --git a/module/handler/fast_forward.py b/module/handler/fast_forward.py index 4c2d3cbf3..06ded406e 100644 --- a/module/handler/fast_forward.py +++ b/module/handler/fast_forward.py @@ -332,8 +332,11 @@ class FastForwardHandler(AutoSearchHandler): str: Name of next stage in upper case, or origin name if unable to increase. """ + stage_increase = self.STAGE_INCREASE + if self.config.STAGE_INCREASE_AB: + stage_increase.insert(0, 'A1 > A2 > A3 > B1 > B2 > B3') name = to_map_input_name(name) - for increase in self.STAGE_INCREASE: + for increase in stage_increase: increase = [i.strip(' \t\r\n') for i in increase.split('>')] if name in increase: index = increase.index(name) + 1 From fba0dd98754a6637ab194d466b3fc79f5b594310 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 27 Feb 2025 23:31:00 +0800 Subject: [PATCH 51/56] Dev: Convert siren names --- dev_tools/map_extractor.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dev_tools/map_extractor.py b/dev_tools/map_extractor.py index 3ba289eb5..b0974c282 100644 --- a/dev_tools/map_extractor.py +++ b/dev_tools/map_extractor.py @@ -287,6 +287,13 @@ DIC_SIREN_NAME_CHI_TO_ENG = { 'tolove_renxing03': 'ToLoveNana03', 'tolove_renxing04': 'ToLoveHaruna04', 'tolove_renxing05': 'ToLoveGoldenDarkness05', + + # Paradiso of Shackled Light + 'boerzhanuo_alter': 'BolzanoAlter', + 'kaisa_alter': 'CesareAlter', + 'teluntuo_alter': 'TrentoAlter', + 'sairenboss26': 'SirenBoss26', + 'sairenboss25': 'SirenBoss25', } From 4bc278b00e9fb9fd59874d8621be535a03dcad78 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 27 Feb 2025 23:40:47 +0800 Subject: [PATCH 52/56] Add: Chapter SP --- campaign/event_20250227_cn/sp.py | 141 +++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 campaign/event_20250227_cn/sp.py diff --git a/campaign/event_20250227_cn/sp.py b/campaign/event_20250227_cn/sp.py new file mode 100644 index 000000000..2b429ca4e --- /dev/null +++ b/campaign/event_20250227_cn/sp.py @@ -0,0 +1,141 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('SP') +MAP.shape = 'I9' +MAP.camera_data = ['E3', 'E5', 'E7'] +MAP.camera_data_spawn_point = ['E7'] +MAP.map_data = """ + -- ++ ++ -- -- -- ++ ++ -- + -- ++ ++ -- MB -- ++ ++ -- + -- ++ ++ ++ -- ++ ++ ++ -- + -- -- ME -- -- -- ME -- -- + ++ ME -- -- -- -- -- ME ++ + ++ -- ME -- __ -- ME -- ++ + -- ME -- -- -- -- -- ME -- + -- ++ -- -- -- -- -- ++ -- + -- -- ++ SP -- SP -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 8}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6}, + {'battle': 7, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + # MAP_HAS_MODE_SWITCH = True + STAGE_ENTRANCE = ['half', '20240725'] + STAGE_INCREASE_AB = True + MAP_IS_ONE_TIME_STAGE = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_SWIPE_MULTIPLY = (1.153, 1.175) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.115, 1.136) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.082, 1.102) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + _is_D9 = False + + def battle_0(self): + if self.fleet_at(D9): + self._is_D9 = True + + if self._is_D9: + self.clear_chosen_enemy(D7) + else: + self.clear_chosen_enemy(F7) + + return True + + def battle_1(self): + if self._is_D9: + self.clear_chosen_enemy(F7) + else: + self.clear_chosen_enemy(D7) + + return True + + def battle_2(self): + if self._is_D9: + self.clear_chosen_enemy(D7) + else: + self.clear_chosen_enemy(F7) + + return True + + def battle_3(self): + if self._is_D9: + self.clear_chosen_enemy(F7) + else: + self.clear_chosen_enemy(D7) + + return True + + def battle_4(self): + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=2): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_7(self): + return self.fleet_boss.clear_boss() From 86ce8f8c47d2fe0c4fe7e1bdc299fc81c8962ae3 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 28 Feb 2025 00:10:07 +0800 Subject: [PATCH 53/56] Upd: Battle UI Pharaoh - TODO: [EN][JP][TW] Add Quit_Pharaoh --- assets/cn/combat_ui/PAUSE_Pharaoh.png | Bin 0 -> 6073 bytes assets/cn/combat_ui/QUIT_Pharaoh.png | Bin 0 -> 8500 bytes module/combat/combat.py | 7 +++++++ module/combat_ui/assets.py | 2 ++ module/exercise/hp_daemon.py | 14 ++++++++++++-- 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 assets/cn/combat_ui/PAUSE_Pharaoh.png create mode 100644 assets/cn/combat_ui/QUIT_Pharaoh.png diff --git a/assets/cn/combat_ui/PAUSE_Pharaoh.png b/assets/cn/combat_ui/PAUSE_Pharaoh.png new file mode 100644 index 0000000000000000000000000000000000000000..91faee781cca42801f4a0294d34645f4af0e32d9 GIT binary patch literal 6073 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 KtXr<_@bEwQA)OBZ literal 0 HcmV?d00001 diff --git a/assets/cn/combat_ui/QUIT_Pharaoh.png b/assets/cn/combat_ui/QUIT_Pharaoh.png new file mode 100644 index 0000000000000000000000000000000000000000..d5e99db4c9cebced06478645a88eb46c18d2fbe7 GIT binary patch literal 8500 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 O06fq#gp_JLe(@jfu=64S literal 0 HcmV?d00001 diff --git a/module/combat/combat.py b/module/combat/combat.py index f82a9012b..0b62b6e9b 100644 --- a/module/combat/combat.py +++ b/module/combat/combat.py @@ -103,6 +103,9 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan return PAUSE_Cyber if PAUSE_HolyLight.match_template_color(self.device.image, offset=(10, 10)): return PAUSE_HolyLight + # PAUSE_Pharaoh has random animation, assets should avoid the area in the middle and use match_luma + if PAUSE_Pharaoh.match_luma(self.device.image, offset=(10, 10)): + return PAUSE_Pharaoh return False def handle_combat_quit(self, offset=(20, 20), interval=3): @@ -128,6 +131,10 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan timer.reset() return True # Battle UI PAUSE_HolyLight uses QUIT_New + if QUIT_Pharaoh.match_luma(self.device.image, offset=offset): + self.device.click(QUIT_Pharaoh) + timer.reset() + return True return False def ensure_combat_oil_loaded(self): diff --git a/module/combat_ui/assets.py b/module/combat_ui/assets.py index 8901a617a..4b19da285 100644 --- a/module/combat_ui/assets.py +++ b/module/combat_ui/assets.py @@ -12,7 +12,9 @@ PAUSE_HolyLight = Button(area={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250 PAUSE_Iridescent_Fantasy = Button(area={'cn': (1232, 33, 1252, 57), 'en': (1232, 33, 1252, 57), 'jp': (1232, 33, 1252, 57), 'tw': (1232, 33, 1252, 57)}, color={'cn': (124, 139, 190), 'en': (124, 139, 190), 'jp': (124, 139, 190), 'tw': (124, 139, 190)}, button={'cn': (1232, 33, 1252, 57), 'en': (1232, 33, 1252, 57), 'jp': (1232, 33, 1252, 57), 'tw': (1232, 33, 1252, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_Iridescent_Fantasy.png', 'en': './assets/en/combat_ui/PAUSE_Iridescent_Fantasy.png', 'jp': './assets/jp/combat_ui/PAUSE_Iridescent_Fantasy.png', 'tw': './assets/tw/combat_ui/PAUSE_Iridescent_Fantasy.png'}) PAUSE_Neon = Button(area={'cn': (1228, 32, 1250, 59), 'en': (1228, 32, 1250, 59), 'jp': (1228, 32, 1250, 59), 'tw': (1228, 32, 1250, 59)}, color={'cn': (106, 137, 80), 'en': (106, 137, 80), 'jp': (106, 137, 80), 'tw': (106, 137, 80)}, button={'cn': (1228, 32, 1250, 59), 'en': (1228, 32, 1250, 59), 'jp': (1228, 32, 1250, 59), 'tw': (1228, 32, 1250, 59)}, file={'cn': './assets/cn/combat_ui/PAUSE_Neon.png', 'en': './assets/cn/combat_ui/PAUSE_Neon.png', 'jp': './assets/cn/combat_ui/PAUSE_Neon.png', 'tw': './assets/cn/combat_ui/PAUSE_Neon.png'}) PAUSE_New = Button(area={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), 'jp': (1231, 29, 1253, 56), 'tw': (1231, 29, 1253, 56)}, color={'cn': (156, 158, 166), 'en': (156, 158, 166), 'jp': (156, 158, 166), 'tw': (156, 158, 166)}, button={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), 'jp': (1231, 29, 1253, 56), 'tw': (1231, 29, 1253, 56)}, file={'cn': './assets/cn/combat_ui/PAUSE_New.png', 'en': './assets/en/combat_ui/PAUSE_New.png', 'jp': './assets/jp/combat_ui/PAUSE_New.png', 'tw': './assets/tw/combat_ui/PAUSE_New.png'}) +PAUSE_Pharaoh = Button(area={'cn': (1229, 55, 1259, 62), 'en': (1229, 55, 1259, 62), 'jp': (1229, 55, 1259, 62), 'tw': (1229, 55, 1259, 62)}, color={'cn': (164, 119, 78), 'en': (164, 119, 78), 'jp': (164, 119, 78), 'tw': (164, 119, 78)}, button={'cn': (1229, 55, 1259, 62), 'en': (1229, 55, 1259, 62), 'jp': (1229, 55, 1259, 62), 'tw': (1229, 55, 1259, 62)}, file={'cn': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'en': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'jp': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'tw': './assets/cn/combat_ui/PAUSE_Pharaoh.png'}) QUIT = Button(area={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, color={'cn': (199, 122, 114), 'en': (216, 168, 164), 'jp': (196, 120, 113), 'tw': (200, 126, 118)}, button={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, file={'cn': './assets/cn/combat_ui/QUIT.png', 'en': './assets/en/combat_ui/QUIT.png', 'jp': './assets/jp/combat_ui/QUIT.png', 'tw': './assets/tw/combat_ui/QUIT.png'}) QUIT_Christmas = Button(area={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, color={'cn': (195, 139, 166), 'en': (207, 166, 185), 'jp': (195, 139, 166), 'tw': (195, 139, 166)}, button={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Christmas.png', 'en': './assets/en/combat_ui/QUIT_Christmas.png', 'jp': './assets/cn/combat_ui/QUIT_Christmas.png', 'tw': './assets/cn/combat_ui/QUIT_Christmas.png'}) QUIT_Iridescent_Fantasy = Button(area={'cn': (391, 522, 464, 540), 'en': (402, 507, 460, 523), 'jp': (391, 522, 464, 540), 'tw': (391, 522, 464, 540)}, color={'cn': (121, 73, 79), 'en': (255, 174, 164), 'jp': (108, 60, 70), 'tw': (121, 73, 79)}, button={'cn': (391, 522, 464, 540), 'en': (402, 507, 460, 523), 'jp': (391, 522, 464, 540), 'tw': (391, 522, 464, 540)}, file={'cn': './assets/cn/combat_ui/QUIT_Iridescent_Fantasy.png', 'en': './assets/en/combat_ui/QUIT_Iridescent_Fantasy.png', 'jp': './assets/jp/combat_ui/QUIT_Iridescent_Fantasy.png', 'tw': './assets/cn/combat_ui/QUIT_Iridescent_Fantasy.png'}) QUIT_New = Button(area={'cn': (394, 506, 467, 524), 'en': (404, 506, 463, 523), 'jp': (394, 506, 467, 524), 'tw': (394, 506, 467, 524)}, color={'cn': (255, 180, 171), 'en': (255, 195, 187), 'jp': (255, 180, 171), 'tw': (255, 180, 171)}, button={'cn': (394, 506, 467, 524), 'en': (404, 506, 463, 523), 'jp': (394, 506, 467, 524), 'tw': (394, 506, 467, 524)}, file={'cn': './assets/cn/combat_ui/QUIT_New.png', 'en': './assets/en/combat_ui/QUIT_New.png', 'jp': './assets/cn/combat_ui/QUIT_New.png', 'tw': './assets/cn/combat_ui/QUIT_New.png'}) +QUIT_Pharaoh = Button(area={'cn': (400, 507, 477, 525), 'en': (400, 507, 477, 525), 'jp': (400, 507, 477, 525), 'tw': (400, 507, 477, 525)}, color={'cn': (204, 132, 108), 'en': (204, 132, 108), 'jp': (204, 132, 108), 'tw': (204, 132, 108)}, button={'cn': (400, 507, 477, 525), 'en': (400, 507, 477, 525), 'jp': (400, 507, 477, 525), 'tw': (400, 507, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Pharaoh.png', 'en': './assets/cn/combat_ui/QUIT_Pharaoh.png', 'jp': './assets/cn/combat_ui/QUIT_Pharaoh.png', 'tw': './assets/cn/combat_ui/QUIT_Pharaoh.png'}) diff --git a/module/exercise/hp_daemon.py b/module/exercise/hp_daemon.py index 68516b96d..f9f62d6f6 100644 --- a/module/exercise/hp_daemon.py +++ b/module/exercise/hp_daemon.py @@ -1,7 +1,16 @@ from module.base.base import ModuleBase from module.base.timer import Timer from module.base.utils import color_bar_percentage -from module.combat_ui.assets import PAUSE, PAUSE_Christmas, PAUSE_Cyber, PAUSE_HolyLight, PAUSE_Iridescent_Fantasy, PAUSE_Neon, PAUSE_New +from module.combat_ui.assets import ( + PAUSE, + PAUSE_Christmas, + PAUSE_Cyber, + PAUSE_HolyLight, + PAUSE_Iridescent_Fantasy, + PAUSE_Neon, + PAUSE_New, + PAUSE_Pharaoh, +) from module.exercise.assets import * from module.logger import logger @@ -67,7 +76,8 @@ class HpDaemon(ModuleBase): PAUSE_Neon, PAUSE_Christmas, PAUSE_Cyber, - PAUSE_HolyLight + PAUSE_HolyLight, + PAUSE_Pharaoh, ]: self.attacker_hp = self._calculate_hp(image, area=ATTACKER_HP_AREA_New.area, reverse=True) self.defender_hp = self._calculate_hp(image, area=DEFENDER_HP_AREA_New.area, reverse=True) From f79781250c57ba045c4ab78f20568cfde1ba97f2 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 28 Feb 2025 00:26:28 +0800 Subject: [PATCH 54/56] Fix: Avoid potential duplicate STAGE_INCREASE inserting --- module/handler/fast_forward.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/handler/fast_forward.py b/module/handler/fast_forward.py index 06ded406e..2bc5f9046 100644 --- a/module/handler/fast_forward.py +++ b/module/handler/fast_forward.py @@ -332,7 +332,8 @@ class FastForwardHandler(AutoSearchHandler): str: Name of next stage in upper case, or origin name if unable to increase. """ - stage_increase = self.STAGE_INCREASE + # Copy STAGE_INCREASE to avoid potential duplicate inserting + stage_increase = [r for r in self.STAGE_INCREASE] if self.config.STAGE_INCREASE_AB: stage_increase.insert(0, 'A1 > A2 > A3 > B1 > B2 > B3') name = to_map_input_name(name) From be90d02e52d39098f203cdc87b71cdf35ec5ec0f Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 28 Feb 2025 01:58:29 +0800 Subject: [PATCH 55/56] Upd: Increase from chapter C to D also --- module/config/config_manual.py | 2 ++ module/handler/fast_forward.py | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/module/config/config_manual.py b/module/config/config_manual.py index f35d6c8f1..d15bda3c4 100644 --- a/module/config/config_manual.py +++ b/module/config/config_manual.py @@ -118,6 +118,8 @@ class ManualConfig: # Since event_20241219_cn chapter B unlocks event startup # which means chapter AB are continuous STAGE_INCREASE_AB = False + # Insert anything to STAGE_INCREASE + STAGE_INCREASE_CUSTOM = '' MAP_HAS_CLEAR_PERCENTAGE = True MAP_HAS_WALK_SPEEDUP = False MAP_HAS_AMBUSH = True diff --git a/module/handler/fast_forward.py b/module/handler/fast_forward.py index 2bc5f9046..3fccdd863 100644 --- a/module/handler/fast_forward.py +++ b/module/handler/fast_forward.py @@ -334,8 +334,19 @@ class FastForwardHandler(AutoSearchHandler): """ # Copy STAGE_INCREASE to avoid potential duplicate inserting stage_increase = [r for r in self.STAGE_INCREASE] + # Insert custom increase logic if self.config.STAGE_INCREASE_AB: - stage_increase.insert(0, 'A1 > A2 > A3 > B1 > B2 > B3') + stage_increase = [ + 'A1 > A2 > A3 > B1 > B2 > B3', + 'C1 > C2 > C3 > D1 > D2 > D3', + ] + stage_increase + custom = self.config.STAGE_INCREASE_CUSTOM + if custom: + if isinstance(custom, str): + custom = [custom] + stage_increase = custom + stage_increase + + # Increase stage name = to_map_input_name(name) for increase in stage_increase: increase = [i.strip(' \t\r\n') for i in increase.split('>')] From 9e74c43c93df7d3740fee40d664ecbd9462fbdeb Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 28 Feb 2025 02:05:06 +0800 Subject: [PATCH 56/56] Fix: [ALAS] Don't redirect 5555 to MuMu serials on MAC as BlueStacks Air would use it --- module/device/connection.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/module/device/connection.py b/module/device/connection.py index 74a79ddaf..3c2cc21fd 100644 --- a/module/device/connection.py +++ b/module/device/connection.py @@ -1025,10 +1025,7 @@ class Connection(ConnectionAttr): self.serial = emu_serial # Redirect MuMu12 from 127.0.0.1:7555 to 127.0.0.1:16xxx - if ( - (IS_WINDOWS and self.serial == '127.0.0.1:7555') - or (IS_MACINTOSH and self.serial == '127.0.0.1:5555') - ): + if self.serial == '127.0.0.1:7555': for _ in range(2): mumu12 = available.select(may_mumu12_family=True) if mumu12.count == 1: