From 08e5d21446892102da73448d2dd80e6fcc8748cb Mon Sep 17 00:00:00 2001 From: Horizon101011 <43370844+Horizon101011@users.noreply.github.com> Date: Sun, 6 Nov 2022 23:26:38 +0800 Subject: [PATCH 01/16] Opt: Give priority to ship with higher emotion and lower level --- module/campaign/gems_farming.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/campaign/gems_farming.py b/module/campaign/gems_farming.py index 040069fe7..82b27a70c 100644 --- a/module/campaign/gems_farming.py +++ b/module/campaign/gems_farming.py @@ -232,7 +232,7 @@ class GemsFarming(CampaignRun, Dock, EquipmentChange): ship = self.get_common_rarity_cv() if ship: - self._ship_change_confirm(ship[0].button) + self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button) logger.info('Change flagship success') return True @@ -259,7 +259,7 @@ class GemsFarming(CampaignRun, Dock, EquipmentChange): ship = self.get_common_rarity_dd() if ship: - self._ship_change_confirm(ship[0].button) + self._ship_change_confirm(max(ship, key=lambda s: s.emotion).button) logger.info('Change vanguard ship success') return True From 6fbc76e6a438658f2ebd8c97f9e3f1a2033b6643 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 7 Nov 2022 00:27:36 +0800 Subject: [PATCH 02/16] Fix: Config update on overridden fields --- module/config/config_updater.py | 2 +- submodule/AlasMaaBridge/module/config/config_updater.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/config/config_updater.py b/module/config/config_updater.py index 72e2d215c..e5c03eb40 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -501,7 +501,7 @@ class ConfigUpdater: def deep_load(keys): data = deep_get(self.args, keys=keys, default={}) value = deep_get(old, keys=keys, default=data['value']) - if value is None or value == '' or data['type'] in ['lock'] or is_template: + if is_template or value is None or value == '' or data['type'] == 'lock' or data.get('display') == 'hide': value = data['value'] value = parse_value(value, data=data) deep_set(new, keys=keys, value=value) diff --git a/submodule/AlasMaaBridge/module/config/config_updater.py b/submodule/AlasMaaBridge/module/config/config_updater.py index 3f838e386..2bf1d8840 100644 --- a/submodule/AlasMaaBridge/module/config/config_updater.py +++ b/submodule/AlasMaaBridge/module/config/config_updater.py @@ -87,7 +87,7 @@ class ConfigUpdater(config_updater.ConfigUpdater): def deep_load(keys): data = deep_get(self.args, keys=keys, default={}) value = deep_get(old, keys=keys, default=data['value']) - if is_template or value is None or value == '' or data['type'] in ['lock']: + if is_template or value is None or value == '' or data['type'] == 'lock' or data.get('display') == 'hide': value = data['value'] value = parse_value(value, data=data) deep_set(new, keys=keys, value=value) From 525ce2ac68036a5081f59ea459374f64f44b1afc Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Mon, 7 Nov 2022 20:22:31 +0800 Subject: [PATCH 03/16] Add: Auto detection of bluestacks serial for MAA --- .../module/config/i18n/zh-CN.json | 2 +- .../AlasMaaBridge/module/handler/handler.py | 103 +++++++++++++++++- 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/submodule/AlasMaaBridge/module/config/i18n/zh-CN.json b/submodule/AlasMaaBridge/module/config/i18n/zh-CN.json index 852344fda..0007d2468 100644 --- a/submodule/AlasMaaBridge/module/config/i18n/zh-CN.json +++ b/submodule/AlasMaaBridge/module/config/i18n/zh-CN.json @@ -134,7 +134,7 @@ }, "Serial": { "name": "模拟器 Serial", - "help": "模拟器默认 Serial:\n- 蓝叠模拟器 127.0.0.1:5555\n- 夜神模拟器 127.0.0.1:62001\n- 夜神模拟器64位 127.0.0.1:59865\n- MuMu模拟器 127.0.0.1:7555\n- 逍遥模拟器 127.0.0.1:21503\n- 雷电模拟器 emulator-5554 或 127.0.0.1:5555\n如果你有多个模拟器,它们的 Serial 将不是默认的,可以在 console.bat 中执行 `adb devices` 查询" + "help": "模拟器默认 Serial:\n- 蓝叠模拟器 127.0.0.1:5555\n- 蓝叠模拟器4 Hyper-v版,填\"bluestacks4-hyperv\"自动连接,多开填\"bluestacks4-hyperv-2\"以此类推\n- 蓝叠模拟器5 Hyper-v版,填\"bluestacks5-hyperv\"自动连接,多开填\"bluestacks5-hyperv-1\"以此类推\n- 夜神模拟器 127.0.0.1:62001\n- 夜神模拟器64位 127.0.0.1:59865\n- MuMu模拟器 127.0.0.1:7555\n- 逍遥模拟器 127.0.0.1:21503\n- 雷电模拟器 emulator-5554 或 127.0.0.1:5555\n如果你有多个模拟器,它们的 Serial 将不是默认的,可以在 console.bat 中执行 `adb devices` 查询" }, "PackageName": { "name": "游戏服务器", diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index f7ca843f5..1ea3b224a 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -8,6 +8,8 @@ import datetime from importlib import import_module from typing import Any +from cached_property import cached_property + from deploy.config import DeployConfig from module.base.timer import Timer from module.config.utils import read_file, deep_get @@ -169,14 +171,111 @@ class AssistantHandler: else: self.task_switch_timer.reset() + def serial_check(self): + """ + serial check + """ + if self.is_bluestacks4_hyperv: + self.serial = self.find_bluestacks4_hyperv(self.serial) + if self.is_bluestacks5_hyperv: + self.serial = self.find_bluestacks5_hyperv(self.serial) + + @cached_property + def is_bluestacks4_hyperv(self): + return "bluestacks4-hyperv" in self.serial + + @cached_property + def is_bluestacks5_hyperv(self): + return "bluestacks5-hyperv" in self.serial + + @staticmethod + def find_bluestacks4_hyperv(serial): + """ + Find dynamic serial of BlueStacks4 Hyper-V Beta. + + Args: + serial (str): 'bluestacks4-hyperv', 'bluestacks4-hyperv-2' for multi instance, and so on. + + Returns: + str: 127.0.0.1:{port} + """ + from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx + + logger.info("Use BlueStacks4 Hyper-V Beta") + logger.info("Reading Realtime adb port") + + if serial == "bluestacks4-hyperv": + folder_name = "Android" + else: + folder_name = f"Android_{serial[19:]}" + + try: + with OpenKey(HKEY_LOCAL_MACHINE, + rf"SOFTWARE\BlueStacks_bgp64_hyperv\Guests\{folder_name}\Config") as key: + port = QueryValueEx(key, "BstAdbPort")[0] + except FileNotFoundError: + logger.error(rf'Unable to find registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_bgp64_hyperv\Guests\{folder_name}\Config') + logger.error('Please confirm that your are using BlueStack 4 hyper-v and not regular BlueStacks 4') + logger.error(r'Please check if there is any other emulator instances under ' + r'registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_bgp64_hyperv\Guests') + raise RequestHumanTakeover + logger.info(f"New adb port: {port}") + return f"127.0.0.1:{port}" + + @staticmethod + def find_bluestacks5_hyperv(serial): + """ + Find dynamic serial of BlueStacks5 Hyper-V. + + Args: + serial (str): 'bluestacks5-hyperv', 'bluestacks5-hyperv-1' for multi instance, and so on. + + Returns: + str: 127.0.0.1:{port} + """ + from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx + + logger.info("Use BlueStacks5 Hyper-V") + logger.info("Reading Realtime adb port") + + if serial == "bluestacks5-hyperv": + parameter_name = r"bst\.instance\.Nougat64\.status\.adb_port" + else: + parameter_name = rf"bst\.instance\.Nougat64_{serial[19:]}\.status.adb_port" + + try: + with OpenKey(HKEY_LOCAL_MACHINE, r"SOFTWARE\BlueStacks_nxt") as key: + directory = QueryValueEx(key, 'UserDefinedDir')[0] + except FileNotFoundError: + try: + with OpenKey(HKEY_LOCAL_MACHINE, r"SOFTWARE\BlueStacks_nxt_cn") as key: + directory = QueryValueEx(key, 'UserDefinedDir')[0] + except FileNotFoundError: + logger.error('Unable to find registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_nxt ' + 'or HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_nxt_cn') + logger.error('Please confirm that you are using BlueStacks 5 hyper-v and not regular BlueStacks 5') + raise RequestHumanTakeover + logger.info(f"Configuration file directory: {directory}") + + with open(os.path.join(directory, 'bluestacks.conf'), encoding='utf-8') as f: + content = f.read() + port = re.search(rf'{parameter_name}="(\d+)"', content) + if port is None: + logger.warning(f"Did not match the result: {serial}.") + raise RequestHumanTakeover + port = port.group(1) + logger.info(f"Match to dynamic port: {port}") + return f"127.0.0.1:{port}" + def connect(self): adb = os.path.abspath(DeployConfig().AdbExecutable) - serial = self.config.MaaEmulator_Serial + self.serial = self.config.MaaEmulator_Serial + self.serial_check() old_callback_list = self.callback_list self.callback_list = [] - if not self.asst.connect(adb, serial): + if not self.asst.connect(adb, self.serial): raise RequestHumanTakeover self.callback_list = old_callback_list From 0ad88950b019ebc216f3669e761ac06e353ac12f Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Mon, 7 Nov 2022 20:28:08 +0800 Subject: [PATCH 04/16] Opt: Delay infrast task to next day if possible --- submodule/AlasMaaBridge/module/handler/handler.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index 1ea3b224a..0605b58a1 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -400,7 +400,7 @@ class AssistantHandler: if periods is None: logger.critical('无法找到配置文件中的排班周期,请检查文件是否有效') raise RequestHumanTakeover - for period in periods: + for j, period in enumerate(periods): start_time = datetime.datetime.combine( datetime.date.today(), datetime.datetime.strptime(period[0], '%H:%M').time() @@ -412,6 +412,13 @@ class AssistantHandler: now_time = datetime.datetime.now() if start_time <= now_time < end_time: args['plan_index'] = i + # 处理跨天的情形 + # 如:"period": [["22:00", "23:59"], ["00:00","06:00"]] + if j != len(periods) - 1 and period[1] == '23:59' and periods[j + 1][0] == '00:00': + end_time = datetime.datetime.combine( + datetime.date.today() + datetime.timedelta(days=1), + datetime.datetime.strptime(periods[j + 1][1], '%H:%M').time() + ) break if 'plan_index' in args: break From 85a752ff1b8db8cdcd43af44a9c4e5694138db75 Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Mon, 7 Nov 2022 21:16:34 +0800 Subject: [PATCH 05/16] Refactor: Use static method of ConnectionAttr --- .../AlasMaaBridge/module/handler/handler.py | 84 +------------------ 1 file changed, 3 insertions(+), 81 deletions(-) diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index 0605b58a1..40b4d9113 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -13,6 +13,7 @@ from cached_property import cached_property from deploy.config import DeployConfig from module.base.timer import Timer from module.config.utils import read_file, deep_get +from module.device.connection_attr import ConnectionAttr from module.exception import RequestHumanTakeover from module.logger import logger @@ -176,9 +177,9 @@ class AssistantHandler: serial check """ if self.is_bluestacks4_hyperv: - self.serial = self.find_bluestacks4_hyperv(self.serial) + self.serial = ConnectionAttr.find_bluestacks4_hyperv(self.serial) if self.is_bluestacks5_hyperv: - self.serial = self.find_bluestacks5_hyperv(self.serial) + self.serial = ConnectionAttr.find_bluestacks5_hyperv(self.serial) @cached_property def is_bluestacks4_hyperv(self): @@ -188,85 +189,6 @@ class AssistantHandler: def is_bluestacks5_hyperv(self): return "bluestacks5-hyperv" in self.serial - @staticmethod - def find_bluestacks4_hyperv(serial): - """ - Find dynamic serial of BlueStacks4 Hyper-V Beta. - - Args: - serial (str): 'bluestacks4-hyperv', 'bluestacks4-hyperv-2' for multi instance, and so on. - - Returns: - str: 127.0.0.1:{port} - """ - from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx - - logger.info("Use BlueStacks4 Hyper-V Beta") - logger.info("Reading Realtime adb port") - - if serial == "bluestacks4-hyperv": - folder_name = "Android" - else: - folder_name = f"Android_{serial[19:]}" - - try: - with OpenKey(HKEY_LOCAL_MACHINE, - rf"SOFTWARE\BlueStacks_bgp64_hyperv\Guests\{folder_name}\Config") as key: - port = QueryValueEx(key, "BstAdbPort")[0] - except FileNotFoundError: - logger.error(rf'Unable to find registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_bgp64_hyperv\Guests\{folder_name}\Config') - logger.error('Please confirm that your are using BlueStack 4 hyper-v and not regular BlueStacks 4') - logger.error(r'Please check if there is any other emulator instances under ' - r'registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_bgp64_hyperv\Guests') - raise RequestHumanTakeover - logger.info(f"New adb port: {port}") - return f"127.0.0.1:{port}" - - @staticmethod - def find_bluestacks5_hyperv(serial): - """ - Find dynamic serial of BlueStacks5 Hyper-V. - - Args: - serial (str): 'bluestacks5-hyperv', 'bluestacks5-hyperv-1' for multi instance, and so on. - - Returns: - str: 127.0.0.1:{port} - """ - from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx - - logger.info("Use BlueStacks5 Hyper-V") - logger.info("Reading Realtime adb port") - - if serial == "bluestacks5-hyperv": - parameter_name = r"bst\.instance\.Nougat64\.status\.adb_port" - else: - parameter_name = rf"bst\.instance\.Nougat64_{serial[19:]}\.status.adb_port" - - try: - with OpenKey(HKEY_LOCAL_MACHINE, r"SOFTWARE\BlueStacks_nxt") as key: - directory = QueryValueEx(key, 'UserDefinedDir')[0] - except FileNotFoundError: - try: - with OpenKey(HKEY_LOCAL_MACHINE, r"SOFTWARE\BlueStacks_nxt_cn") as key: - directory = QueryValueEx(key, 'UserDefinedDir')[0] - except FileNotFoundError: - logger.error('Unable to find registry HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_nxt ' - 'or HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks_nxt_cn') - logger.error('Please confirm that you are using BlueStacks 5 hyper-v and not regular BlueStacks 5') - raise RequestHumanTakeover - logger.info(f"Configuration file directory: {directory}") - - with open(os.path.join(directory, 'bluestacks.conf'), encoding='utf-8') as f: - content = f.read() - port = re.search(rf'{parameter_name}="(\d+)"', content) - if port is None: - logger.warning(f"Did not match the result: {serial}.") - raise RequestHumanTakeover - port = port.group(1) - logger.info(f"Match to dynamic port: {port}") - return f"127.0.0.1:{port}" - def connect(self): adb = os.path.abspath(DeployConfig().AdbExecutable) self.serial = self.config.MaaEmulator_Serial From fe79137d037676551ba179c3bb64bef9d8c54fbd Mon Sep 17 00:00:00 2001 From: appleapple802 Date: Tue, 8 Nov 2022 11:22:14 +0800 Subject: [PATCH 06/16] fix:[tw]os_combat assets --- assets/tw/os_combat/SIREN_PREPARATION.png | Bin 20317 -> 19818 bytes module/os_combat/assets.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/tw/os_combat/SIREN_PREPARATION.png b/assets/tw/os_combat/SIREN_PREPARATION.png index 9786eddab2e0170f3657808701dc43d3e307cd89..3c337c0d47df638507d84368525198f76bea09f7 100644 GIT binary patch literal 19818 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 ut#UuQy*fs%_oJ3pB^uqGC)Y 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 FzX5~!KIi}d literal 20317 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%0Dr(CI6X0$e)YE8g9X@ zQgR%PVLKa|#9}dn{({B(y6IWwg8uuzsU>rJ#){@VcA>RhqRUgbbuOfb`beO59=9@G zclJI-9e`YLp5Cx`{wdHYT{VM*xCho9`9mM+_A$gk*hLy%X}G-e!o3W+I=OQ;&%O7L z{fF>SPZIX6f-G3Cpf;#iHf#K?f^C?7+EXJrA%gO6+pKjk+lC2VYV)?7{TgtR#-Fu? zxd%326;O2p?^=|L?X>jMVrTjQVV&{5(fbbr0@PQsRKaPNys`X3%nLH8aQ}@`%f!yq z9(mr*;f!psx?SkUhrv^wrf##?t)3)V33aO&R6R~MR zG=S<$z}WuY0!*?$njO<+)5MMSJVP6!8dL;fgLvw))shW|2`%DMI@&gA|4lc+cLw|#*crPpJFmU5G6HfR*xlwgMaq)NZXv7A+p?Qnxd%mMFoknhoF#zT2R!6i^rjim5C|7#x2&c+ zg`8zrs$P>*R`Kgh0VE{|c1t{6#XH&DbcTV}{w}+s#H(YkX^5-F_1#}<;PMNR$!Uyw zYNoCg>^xzI+4B&4zxE)c^YNOvIdrBqP_1-cq4zVs-#k3A@>Ov4n4{ zB$pkZ%on_<7+{oHgO10({%g#5uL=au=3Ld@r@GX4M{*@cp;gQdlK?R_Rb>%MUVIVQ z_uq1yxInaa1wmShn6MMVy);|W8&@O4IuK*hSIseU!Z=j?jryS1=4LuGmxYCtI>=6o zb@dy@%4D;m(oPOAsq-nvB8#;gR_ok3%fr9uQx{H{-@zbG29`Yx7@J*_uUI-$eTA{| z5xCG&Ozf5XsuI?m>}NU$QUGBrMkphiK8EKiZ~Y4{2Fiq%8WnEaWtiu{$`M`FC)J&7 zqDxc>F-hzJ)O=i-9$k~gzPR2a`G9Q+t>2bTN@)92Ki6D=Bs+A;RR<|p5X{nHv7;Gk z73Yr0LrzDhJfyc5(Wf*=llfzh3!@ISFbN zk>IPv{iXfvhWlYg*1TQ^d29|Qvbmdun^C@C^7&!#nVwad6TGdk@>1h&`#8oFaKXVS zRXDjbU8!q~5XEEvpH|NPC(SF4;!T>=G}BsReQ9TX3@&PH(P$=vVKiN^&X-ECDos0F zt8uNH;&8T#qAWF?#LkgU5u4VsL6rnr9kuN$kBA+0tWHbCG2Rp_q`rWHi2A4q?CRgJ z`v=?~?#(^PIp_1ecB6N3C9I6_#n#%bCF7L5akHugV9~Kk5c4-WjX)S57>E1q{h|2Q zOikPjx9AGK=VQZ(b205*$_koCdQmPDeBA+j)1+tGvuqz6Scvplly1D|G_WDITjre_ zkB$rhbaisfI#KF^+C-Uh@Xyod8F$oYTUn>lnK)=2*>M+XB<|xu6Zg(BVV{|ML%dR& z0YnLAIC;e&(O4`Xb&e{1Q*LNCaF287kA?JYEN9(xZp`*?pehSVVl%E@H&uZi&bCyW z8cB@#hSH6(Mhwh+0CS7$%V{@BjZ!K#Z%u@0s2}pKR|{C!Y*53QBB30i(55)pi3)YM zYRSp+hO~`3^&^##^(^81ZS(5R_oG{rn~USoSNF(t+=8Cbxv*^zYf(S2eM05VbH@>b zjEs~V-KZ1BE|M)i5k)_61z*MO>a%A;~P^)nJRwTAnj%=6p5!gipRBj1JAUpuJ zug;Y)W+zOqZ@1Vifxkn(pZ>n<3iDaE!@jIfD#6k{g2N*ReX)DF4v#WFxeVctUaM#P zTJdI3pT61N#FR#2rI#{KK2!lw2z09D4kX##3~xhDUel)AYPzpp70BB6572Q3OS3|p1nAbk$p?ASrBH}fA(ik1b_q)F)<41H9aR?tX!S+U@-&kbgZOL2CY;^Cq zbXZ~g}styHD} diff --git a/module/os_combat/assets.py b/module/os_combat/assets.py index 4a898cc3d..368fcf6bb 100644 --- a/module/os_combat/assets.py +++ b/module/os_combat/assets.py @@ -5,4 +5,4 @@ from module.base.template import Template # Don't modify it manually. BATTLE_PREPARATION = Button(area={'cn': (1031, 624, 1228, 682), 'en': (1031, 624, 1228, 682), 'jp': (1030, 623, 1229, 683), 'tw': (1031, 624, 1228, 682)}, color={'cn': (216, 159, 83), 'en': (216, 160, 91), 'jp': (214, 157, 83), 'tw': (216, 159, 83)}, button={'cn': (1031, 624, 1228, 682), 'en': (1031, 624, 1228, 682), 'jp': (1030, 623, 1229, 683), 'tw': (1031, 624, 1228, 682)}, file={'cn': './assets/cn/os_combat/BATTLE_PREPARATION.png', 'en': './assets/en/os_combat/BATTLE_PREPARATION.png', 'jp': './assets/jp/os_combat/BATTLE_PREPARATION.png', 'tw': './assets/tw/os_combat/BATTLE_PREPARATION.png'}) -SIREN_PREPARATION = Button(area={'cn': (1043, 638, 1240, 698), 'en': (1043, 639, 1240, 698), 'jp': (1042, 638, 1241, 699), 'tw': (1043, 638, 1240, 698)}, color={'cn': (136, 94, 111), 'en': (131, 85, 102), 'jp': (136, 97, 113), 'tw': (136, 94, 111)}, button={'cn': (1043, 638, 1240, 698), 'en': (1043, 639, 1240, 698), 'jp': (1042, 638, 1241, 699), 'tw': (1043, 638, 1240, 698)}, file={'cn': './assets/cn/os_combat/SIREN_PREPARATION.png', 'en': './assets/en/os_combat/SIREN_PREPARATION.png', 'jp': './assets/jp/os_combat/SIREN_PREPARATION.png', 'tw': './assets/tw/os_combat/SIREN_PREPARATION.png'}) +SIREN_PREPARATION = Button(area={'cn': (1043, 638, 1240, 698), 'en': (1043, 639, 1240, 698), 'jp': (1042, 638, 1241, 699), 'tw': (1047, 641, 1239, 698)}, color={'cn': (136, 94, 111), 'en': (131, 85, 102), 'jp': (136, 97, 113), 'tw': (138, 106, 121)}, button={'cn': (1043, 638, 1240, 698), 'en': (1043, 639, 1240, 698), 'jp': (1042, 638, 1241, 699), 'tw': (1047, 641, 1239, 698)}, file={'cn': './assets/cn/os_combat/SIREN_PREPARATION.png', 'en': './assets/en/os_combat/SIREN_PREPARATION.png', 'jp': './assets/jp/os_combat/SIREN_PREPARATION.png', 'tw': './assets/tw/os_combat/SIREN_PREPARATION.png'}) From 40b3e6f40e100e0e1bacacf473b68fe9bf735b9c Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Tue, 8 Nov 2022 15:36:32 +0800 Subject: [PATCH 07/16] Opt: Parse custom infrast periods more delicately - Deal with periods crossing different dates, like [20:00, 7:00] - Delay infrast task as long as possible --- .../AlasMaaBridge/module/handler/handler.py | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index 40b4d9113..227e7cf93 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -11,7 +11,7 @@ from typing import Any from cached_property import cached_property from deploy.config import DeployConfig -from module.base.timer import Timer +from module.base.timer import Timer, future_time from module.config.utils import read_file, deep_get from module.device.connection_attr import ConnectionAttr from module.exception import RequestHumanTakeover @@ -322,27 +322,35 @@ class AssistantHandler: if periods is None: logger.critical('无法找到配置文件中的排班周期,请检查文件是否有效') raise RequestHumanTakeover - for j, period in enumerate(periods): - start_time = datetime.datetime.combine( - datetime.date.today(), - datetime.datetime.strptime(period[0], '%H:%M').time() - ) - end_time = datetime.datetime.combine( - datetime.date.today(), - datetime.datetime.strptime(period[1], '%H:%M').time() - ) - now_time = datetime.datetime.now() - if start_time <= now_time < end_time: + period_index = None + now_time = datetime.datetime.now().time() + periods_sorted = sorted([ + tuple(datetime.time.fromisoformat(x) for x in p) + for p in periods + ]) + for j, period in enumerate(periods_sorted): + # 分别对应三种情况: + # [05:00, 07:00], now_time=06:00 + # [20:00, 07:00], now_time=06:00 + # [20:00, 07:00], now_time=21:00 + if (period[0] <= now_time < period[1] or + now_time < period[1] < period[0] or + period[1] < period[0] <= now_time): + period_index = j args['plan_index'] = i - # 处理跨天的情形 - # 如:"period": [["22:00", "23:59"], ["00:00","06:00"]] - if j != len(periods) - 1 and period[1] == '23:59' and periods[j + 1][0] == '00:00': - end_time = datetime.datetime.combine( - datetime.date.today() + datetime.timedelta(days=1), - datetime.datetime.strptime(periods[j + 1][1], '%H:%M').time() - ) break if 'plan_index' in args: + periods_sorted = periods_sorted[period_index:] + periods_sorted[:period_index] + future_time_ = lambda x: future_time(x.isoformat(timespec='minutes')) + # 找到下次换班时间,时间差不大于1分钟视为连续时段 + # 如[[22:00, 06:59], [05:00, 08:59], [09:00, 10:59], [13:00, 17:59]] + # 现在是22:00,下次在10:59之后换班即可,中间的06:59和08:59不必换班 + end_time = future_time_(periods_sorted[0][1]) + for period in periods_sorted[1:]: + start_time = future_time_(period[0]) + if start_time - end_time > datetime.timedelta(minutes=1): + break + end_time = max(end_time, future_time_(period[1])) break self.maa_start('Infrast', args) From ac10a8b4fbd947d545f59bf81e9bd2a4c2ba9080 Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Tue, 8 Nov 2022 19:01:58 +0800 Subject: [PATCH 08/16] Opt: Revert back and set now_time <= end_time --- .../AlasMaaBridge/module/handler/handler.py | 44 ++++++++----------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index 227e7cf93..dd3168a31 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -322,35 +322,27 @@ class AssistantHandler: if periods is None: logger.critical('无法找到配置文件中的排班周期,请检查文件是否有效') raise RequestHumanTakeover - period_index = None - now_time = datetime.datetime.now().time() - periods_sorted = sorted([ - tuple(datetime.time.fromisoformat(x) for x in p) - for p in periods - ]) - for j, period in enumerate(periods_sorted): - # 分别对应三种情况: - # [05:00, 07:00], now_time=06:00 - # [20:00, 07:00], now_time=06:00 - # [20:00, 07:00], now_time=21:00 - if (period[0] <= now_time < period[1] or - now_time < period[1] < period[0] or - period[1] < period[0] <= now_time): - period_index = j + for j, period in enumerate(periods): + start_time = datetime.datetime.combine( + datetime.date.today(), + datetime.datetime.strptime(period[0], '%H:%M').time() + ) + end_time = datetime.datetime.combine( + datetime.date.today(), + datetime.datetime.strptime(period[1], '%H:%M').time() + ) + now_time = datetime.datetime.now() + if start_time <= now_time <= end_time: args['plan_index'] = i + # 处理跨天的情形 + # 如:"period": [["22:00", "23:59"], ["00:00","06:00"]] + if j != len(periods) - 1 and period[1] == '23:59' and periods[j + 1][0] == '00:00': + end_time = datetime.datetime.combine( + datetime.date.today() + datetime.timedelta(days=1), + datetime.datetime.strptime(periods[j + 1][1], '%H:%M').time() + ) break if 'plan_index' in args: - periods_sorted = periods_sorted[period_index:] + periods_sorted[:period_index] - future_time_ = lambda x: future_time(x.isoformat(timespec='minutes')) - # 找到下次换班时间,时间差不大于1分钟视为连续时段 - # 如[[22:00, 06:59], [05:00, 08:59], [09:00, 10:59], [13:00, 17:59]] - # 现在是22:00,下次在10:59之后换班即可,中间的06:59和08:59不必换班 - end_time = future_time_(periods_sorted[0][1]) - for period in periods_sorted[1:]: - start_time = future_time_(period[0]) - if start_time - end_time > datetime.timedelta(minutes=1): - break - end_time = max(end_time, future_time_(period[1])) break self.maa_start('Infrast', args) From 98f4533268fdd2b2d66c1f7d7eb8e78317a095db Mon Sep 17 00:00:00 2001 From: Zebartin <1500012724@pku.edu.cn> Date: Tue, 8 Nov 2022 19:05:32 +0800 Subject: [PATCH 09/16] Refactor: Remove unused import --- submodule/AlasMaaBridge/module/handler/handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodule/AlasMaaBridge/module/handler/handler.py b/submodule/AlasMaaBridge/module/handler/handler.py index dd3168a31..7993a93c8 100644 --- a/submodule/AlasMaaBridge/module/handler/handler.py +++ b/submodule/AlasMaaBridge/module/handler/handler.py @@ -11,7 +11,7 @@ from typing import Any from cached_property import cached_property from deploy.config import DeployConfig -from module.base.timer import Timer, future_time +from module.base.timer import Timer from module.config.utils import read_file, deep_get from module.device.connection_attr import ConnectionAttr from module.exception import RequestHumanTakeover From ecce9336dfb03bea185fe662423bf26b906f5f26 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 8 Nov 2022 23:14:56 +0800 Subject: [PATCH 10/16] Fix: Retirement failed to confirm ships after being used by GemsFarming because they have no equipments, and no EQUIP_CONFIRM_2 click --- module/retire/retirement.py | 1 + 1 file changed, 1 insertion(+) diff --git a/module/retire/retirement.py b/module/retire/retirement.py index 780797039..b90f3f606 100644 --- a/module/retire/retirement.py +++ b/module/retire/retirement.py @@ -108,6 +108,7 @@ class Retirement(Enhancement, QuickRetireSettingHandler): if self.appear(GET_ITEMS_1, offset=(30, 30), interval=2): self.device.click(GET_ITEMS_1_RETIREMENT_SAVE) self.interval_reset(SHIP_CONFIRM) + executed = True continue if self._unable_to_enhance \ or self.config.Retirement_OldRetireSR \ From f29a246a7b8d2efa8dd27e3c5c5eca3f7fedde7f Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 9 Nov 2022 00:52:12 +0800 Subject: [PATCH 11/16] Fix: Trying to add prefix "1" on empty Opsi shop amount and log empty OCR result --- module/ocr/ocr.py | 3 +++ module/os_handler/shop.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/module/ocr/ocr.py b/module/ocr/ocr.py index 4917c0dc3..0573f1afd 100644 --- a/module/ocr/ocr.py +++ b/module/ocr/ocr.py @@ -112,7 +112,10 @@ class Digit(Ocr): result = super().after_process(result) result = result.replace('I', '1').replace('D', '0').replace('S', '5') + prev = result result = int(result) if result else 0 + if str(result) != prev: + logger.warning(f'OCR {self.name}: Result "{prev}" is revised to "{result}"') return result diff --git a/module/os_handler/shop.py b/module/os_handler/shop.py index a5c4e2d4b..1262779d7 100644 --- a/module/os_handler/shop.py +++ b/module/os_handler/shop.py @@ -11,6 +11,19 @@ OCR_SHOP_YELLOW_COINS = Digit(SHOP_YELLOW_COINS, letter=(239, 239, 239), thresho OCR_SHOP_PURPLE_COINS = Digit(SHOP_PURPLE_COINS, letter=(255, 255, 255), name='OCR_SHOP_PURPLE_COINS') +class OSShopAmount(Digit): + def after_process(self, result): + result = result.replace('I', '1').replace('D', '0').replace('S', '5') + + prev = result + if result.startswith('0'): + result = '1' + result + logger.warning(f'OS shop amount {prev} is revised to {result}') + + result = super().after_process(result) + return result + + class OSShopHandler(UI, MapEventHandler): _shop_yellow_coins = 0 _shop_purple_coins = 0 @@ -29,6 +42,7 @@ class OSShopHandler(UI, MapEventHandler): shop_grid = ButtonGrid( origin=(237, 219), delta=(189, 224), button_shape=(98, 98), grid_shape=(4, 2), name='SHOP_GRID') shop_items = ItemGrid(shop_grid, templates={}, amount_area=(60, 74, 96, 95)) + shop_items.price_ocr = OSShopAmount([], letter=(255, 223, 57), threshold=32, name='Price_ocr') shop_items.load_template_folder('./assets/shop/os') shop_items.load_cost_template_folder('./assets/shop/os_cost') return shop_items From 870f2f2fbe72aeb7f732dbecbdd5ff54085a0667 Mon Sep 17 00:00:00 2001 From: SarContDeli <48789988+SaiCateDoan@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:16:49 +0800 Subject: [PATCH 12/16] Fix: InvalidChar missing in gui.yaml --- module/config/argument/args.json | 4 ++-- module/config/argument/gui.yaml | 1 + module/config/i18n/en-US.json | 2 +- module/config/i18n/ja-JP.json | 2 +- module/config/i18n/zh-CN.json | 2 +- module/config/i18n/zh-TW.json | 4 ++-- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 74fc07930..115a8f446 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3278,7 +3278,7 @@ "event_20200227_cn" ], "display": "disabled", - "tw": "event_20210121_cn", + "tw": "event_20211111_cn", "cn": "event_20220915_cn", "en": "event_20220915_cn", "jp": "event_20220915_cn" @@ -7974,4 +7974,4 @@ } } } -} +} \ No newline at end of file diff --git a/module/config/argument/gui.yaml b/module/config/argument/gui.yaml index 7017808ea..19f3eceab 100644 --- a/module/config/argument/gui.yaml +++ b/module/config/argument/gui.yaml @@ -57,6 +57,7 @@ AddAlas: CopyFrom: Confirm: FileExist: + InvalidChar: Update: UpToDate: diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index d1bdf09ac..ea20724ae 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -585,6 +585,7 @@ "name": "Event Name", "help": "Automatically selects to the latest event", "campaign_main": "campaign_main", + "event_20211111_cn": "The Flame-Touched Dagger", "raid_20221027": "Fight On Royal Maids!(Part 3)", "event_20210121_cn": "Empyreal Tragicomedy Rerun", "event_20220915_cn": "Violet Tempest Blooming Lycoris", @@ -616,7 +617,6 @@ "event_20201229_cn": "Inverted Orthant", "event_20211229_cn": "Tower of Transcendence", "event_20211125_cn": "World-spanning Arclight", - "event_20211111_cn": "The Flame-Touched Dagger", "event_20211028_tw": "復刻光與影的鳶尾之華", "event_20210722_cn": "Azur Anthem", "event_20210819_cn": "Microlayer Medley Rerun", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index ca1889b84..50032d7eb 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -585,6 +585,7 @@ "name": "Campaign.Event.name", "help": "Campaign.Event.help", "campaign_main": "campaign_main", + "event_20211111_cn": "燈火のシニエ", "raid_20221027": "戦え!ロイヤルメイド隊3rd", "event_20210121_cn": "悲歎せし焔海の詩(復刻)", "event_20220915_cn": "赫の涙月 菫の暁風", @@ -616,7 +617,6 @@ "event_20201229_cn": "虚畳なりし限象", "event_20211229_cn": "遡望せし虹彩の塔", "event_20211125_cn": "弧光は交わる世界にて", - "event_20211111_cn": "燈火のシニエ", "event_20211028_tw": "復刻光與影的鳶尾之華", "event_20210722_cn": "海に響くアイドルの歌", "event_20210819_cn": "闇靄払う銀翼(復刻)", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index bb3c2c77f..52a275e54 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -585,6 +585,7 @@ "name": "活动名称", "help": "自动选择至最新的活动", "campaign_main": "主线图", + "event_20211111_cn": "杰诺瓦的焰火", "raid_20221027": "战斗!皇家女仆队3rd", "event_20210121_cn": "复刻神圣的悲喜剧", "event_20220915_cn": "紫绛槿岚", @@ -616,7 +617,6 @@ "event_20201229_cn": "负象限作战", "event_20211229_cn": "逆转彩虹之塔", "event_20211125_cn": "交汇世界的弧光", - "event_20211111_cn": "杰诺瓦的焰火", "event_20211028_tw": "復刻光與影的鳶尾之華", "event_20210722_cn": "响彻碧海的偶像歌", "event_20210819_cn": "复刻微层混合", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 4f1a264da..ca3ebef2d 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -585,8 +585,8 @@ "name": "活動名稱", "help": "自動選擇至最新的活動圖", "campaign_main": "主線圖", - "raid_20221027": "Fight On Royal Maids!(Part 3)", "event_20211111_cn": "杰諾瓦的焰火", + "raid_20221027": "Fight On Royal Maids!(Part 3)", "event_20210121_cn": "復刻神聖的悲喜劇", "event_20220915_cn": "Violet Tempest Blooming Lycoris", "event_20210916_cn": "碧海光粼", @@ -2290,4 +2290,4 @@ "InvalidFeedBack": "格式錯誤。 示例:{0}" } } -} +} \ No newline at end of file From 8c4d6c770f2ce3a90f9e35bc7c926939c21837b9 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 9 Nov 2022 22:38:10 +0800 Subject: [PATCH 13/16] Fix: Retirement failed to confirm ships after being used by GemsFarming --- module/retire/retirement.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/module/retire/retirement.py b/module/retire/retirement.py index b90f3f606..1d107df4e 100644 --- a/module/retire/retirement.py +++ b/module/retire/retirement.py @@ -77,6 +77,7 @@ class Retirement(Enhancement, QuickRetireSettingHandler): backup, self._popup_offset = self._popup_offset, (20, 50) for button in [SHIP_CONFIRM, SHIP_CONFIRM_2, EQUIP_CONFIRM, EQUIP_CONFIRM_2, GET_ITEMS_1, SR_SSR_CONFIRM]: self.interval_clear(button) + timeout = Timer(10, count=10).start() while 1: if skip_first_screenshot: skip_first_screenshot = False @@ -84,9 +85,18 @@ class Retirement(Enhancement, QuickRetireSettingHandler): self.device.screenshot() # End - if executed and self.appear(IN_RETIREMENT_CHECK): - self.handle_info_bar() + if timeout.reached(): + # Ships being used by GemsFarming have no equipment to disassemble + # So `executed` is never set to True, causing infinite loop + # Handled with dirty timeout, a better fix is required + logger.warning('Wait _retirement_confirm timeout, assume finished') break + if self.appear(IN_RETIREMENT_CHECK): + if executed: + self.handle_info_bar() + break + else: + timeout.reset() # Click if self.appear(SHIP_CONFIRM, offset=(30, 30), interval=2) \ @@ -108,7 +118,6 @@ class Retirement(Enhancement, QuickRetireSettingHandler): if self.appear(GET_ITEMS_1, offset=(30, 30), interval=2): self.device.click(GET_ITEMS_1_RETIREMENT_SAVE) self.interval_reset(SHIP_CONFIRM) - executed = True continue if self._unable_to_enhance \ or self.config.Retirement_OldRetireSR \ From 6af9383cd40ab95ed8465e86209b61df7e9dc137 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 9 Nov 2022 22:58:11 +0800 Subject: [PATCH 14/16] Fix: Dont log empty check on LevelOcr --- module/combat/level.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/module/combat/level.py b/module/combat/level.py index f25f64d84..342e216fe 100644 --- a/module/combat/level.py +++ b/module/combat/level.py @@ -131,3 +131,12 @@ class LevelOcr(Digit): if first_digit + 3 < 46: # LV_GRID_MAIN.button_shape[0] = 46 return image[:, first_digit:] return np.array([[255]], dtype=np.uint8) + + def after_process(self, result): + result = result.replace('I', '1').replace('D', '0').replace('S', '5') + + # No correction log, cause levels are usually empty + # Like: [23, 0, 0, 100, 0, 0] + result = int(result) if result else 0 + + return result From 9cfc4d098f05d12956dd9a45cdcd40c6a8b52f3e Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 9 Nov 2022 23:23:32 +0800 Subject: [PATCH 15/16] Fix: Handle empty mail list --- assets/cn/freebies/MAIL_EMPTY.png | Bin 0 -> 4276 bytes module/freebies/assets.py | 1 + module/freebies/mail.py | 16 +++++++++++----- 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 assets/cn/freebies/MAIL_EMPTY.png diff --git a/assets/cn/freebies/MAIL_EMPTY.png b/assets/cn/freebies/MAIL_EMPTY.png new file mode 100644 index 0000000000000000000000000000000000000000..08c8a7ac634cdb8462739e4c36efd55d0af56f7e GIT binary patch literal 4276 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 Date: Thu, 10 Nov 2022 20:55:16 +0800 Subject: [PATCH 16/16] inverted orthant rerun update --- campaign/Readme.md | 211 ++++++++++++++++--------------- module/config/argument/args.json | 74 ++++++----- module/config/i18n/en-US.json | 2 +- module/config/i18n/ja-JP.json | 2 +- module/config/i18n/zh-CN.json | 2 +- module/config/i18n/zh-TW.json | 2 +- 6 files changed, 150 insertions(+), 143 deletions(-) diff --git a/campaign/Readme.md b/campaign/Readme.md index 81ed0d070..db7cd3dc6 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -10,109 +10,110 @@ To add a new event, add a new row in here, and run `python -m dev_tools.event_ex **CN, EN, JP, TW** Event names in GUI. If an event is not aired on some servers, use `-`. -| Aired Date | Directory | Event Name | CN | EN | JP | TW | -|------------|--------------------------|---------------------------------|-------------|-------------------------------------|--------------------| -------------------- | -| 20170607 | war archives 20181020 en | Strive, Wish, and Strategize | 努力、希望和计划 | Strive, Wish, and Strategize | 努力、希望と計画 | 努力、希望和計劃 | -| 20170802 | war archives 20191031 en | Divergent Chessboard | 异色格 | Divergent Chessboard | 鏡写されし異色 | 異色格 | -| 20170928 | war archives 20190321 en | Visitors Dyed in Red | 红染的参访者 | Visitors Dyed in Red | 紅染の来訪者 | 紅染的參訪者 | -| 20171026 | war archives 20190620 en | Glorious Battle | 光荣的一战 | Glorious Battle | 栄光なる最終戦 | 光榮的一戰 | -| 20171228 | war archives 20181026 en | Fallen Wings | 坠落之翼 | Fallen Wings | 闇に堕ちた青き翼 | 墜落之翼 | -| 20180119 | war archives 20191010 en | Encircling Graf Spee | 围剿斯佩伯爵 | Encircling Graf Spee | アドミラル・グラーフ・シュペー追撃戦 | 圍剿斯佩伯爵 | -| 20180226 | war archives 20190221 en | Winter\'s Crown | 凛冬王冠 | Winter\'s Crown | 凛冽なりし冬の王冠 | 凜冬王冠 | -| 20180607 | war archives 20180607 cn | Ink Stained Steel Sakura | 墨染的钢铁之花 | Ink Stained Steel Sakura | 墨染まりし鋼の桜 | 墨染的鋼鐵之花 | -| 20180726 | war archives 20180726 cn | Iris of Light and Dark | 光与影的鸢尾之华 | Iris of Light and Dark | 光と影のアイリス | 光與影的鳶尾之華 | -| 20210121 | war archives 20181227 cn | Crimson Echoes | 苍红的回响 | Crimson Echoes | 縹映る深緋の残響 | 蒼紅的迴響 | -| 20210513 | war archives 20200820 cn | Scherzo of Iron and Blood | 铁血音符誓言 | Scherzo of Iron and Blood | 黒鉄の楽章 誓いの海 | - | -| 20211014 | war archives 20211014 cn | Crescendo of Polaris | 激奏的Polaris | Crescendo of Polaris | 激奏のポラリス | - | -| 20220113 | war archives 20190911 cn | Empyreal Tragicomedy | 神圣的悲喜剧 | Empyreal Tragicomedy | 悲歎せし焔海の詩 | - | -| 20220407 | war archives 20210325 cn | Ashen Simulacrum | 箱庭疗法 | Ashen Simulacrum | 開かれし紺碧の砂箱 | - | -| 20220721 | war archives 20210624 cn | Swirling Cherry Blossoms | 浮樱影华 | Swirling Cherry Blossoms | 翳りし満ちる影の華 | - | -| 20220901 | war archives 20200806 cn | The Enigma and the Shark | 最重要的宝物 | The Enigma and the Shark | 鉄血鮫とエニグマ | - | -| 20221013 | war archives 20201029 cn | Universe in Unison | 激唱的UNIVERSE | Universe in Unison | 激唱のユニバース | - | -| 20200227 | event 20200227 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | - | -| 20200312 | event 20200312 cn | The Solomon Ranger | 复刻斯图尔特的硝烟 | The Solomon Ranger Rerun | 南洋に靡く硝煙(復刻) | - | -| 20200326 | event 20200326 cn | Microlayer Medley | 微层混合 | Microlayer Medley | 闇靄払う銀翼 | - | -| 20200423 | event 20200423 cn | Crimson Echoes | 复刻苍红的回响 | Crimson Echoes Rerun | 縹映る深緋の残響(復刻) | - | -| 20200507 | event 20200507 cn | The Way Home in the Night | 夜幕下的归途 | The Way Home in the Night | 帰路は海色の陰りへと | - | -| 20200521 | event 20200521 cn | Skybound Oratorio | 穹顶下的圣咏曲 | - | 神穹を衝く聖歌 | - | -| 20200521 | event 20200521 en | Iris of Light and Dark | - | Iris of Light and Dark Rerun | - | - | -| 20200603 | event 20200603 cn | Counterattack Within the Fjord | 峡湾间的反击 | - | 峡湾間の反撃 | - | -| 20200603 | event 20200603 en | Prelude under the Moon | - | Prelude under the Moon Rerun | - | - | -| 20200611 | event 20200611 en | Skybound Oratorio | - | Skybound Oratorio | - | - | -| 20200624 | raid 20200624 | Air Raid Drills with Essex | 复刻特别演习埃塞克斯级 | Air Raid Drills with Essex Rerun | 特別演習超空強襲波(復刻) | 特別演習埃塞克斯級 | -| 20200716 | event 20200716 en | Ink Stained Steel Sakura | - | Ink Stained Steel Sakura Rerun | - | - | -| 20200723 | event 20200723 cn | Aurora Noctis | 永夜幻光 | Aurora Noctis | 極夜照らす幻光 | - | -| 20200806 | event 20200806 cn | The Enigma and the Shark | 复刻最重要的宝物 | - | 鉄血鮫とエニグマ(復刻) | - | -| 20200820 | event 20200820 cn | Scherzo of Iron and Blood | 复刻铁血音符誓言 | Scherzo of Iron and Blood Rerun | 黒鉄の楽章 誓いの海(復刻) | - | -| 20200903 | event 20200903 en | Stars of the Shimmering Fjord | - | Stars of the Shimmering Fjord | - | - | -| 20200917 | event 20200917 cn | Dreamwaker's Butterfly | 蝶海梦花 | Dreamwaker's Butterfly | 刹那觀る胡蝶の夢 | - | -| 20201002 | event 20201002 en | Counterattack Within the Fjord | - | Counterattack Within the Fjord | - | - | -| 20201012 | event 20201012 cn | Sundered Blue | 划破海空之翼 | - | 奔る彩帆の青 | - | -| 20201029 | event 20201029 cn | Universe in Unison | 激唱的UNIVERSE | Universe in Unison | 激唱のユニバース | - | -| 20201105 | event 20200312 cn | The Solomon Ranger | - | - | - | 斯圖爾特的硝煙 | -| 20201112 | event 20200903 en | Stars of the Shimmering Fjord | 复刻峡湾间的星辰 | - | 輝ける峡湾の星(復刻) | - | -| 20201112 | event 20201012 cn | Sundered Blue | - | Sundered Blue | - | - | -| 20201126 | event 20201126 cn | Vacation Lane | 假日航线 | Vacation Lane | バケーションレーン | - | -| 20201210 | event 20200806 cn | The Enigma and the Shark | - | The Enigma and the Shark Rerun | - | - | -| 20201229 | event 20201229 cn | Inverted Orthant | 负象限作战 | Inverted Orthant | 虚畳なりし限象 | - | -| 20210121 | event 20210121 cn | Empyreal Tragicomedy | 复刻神圣的悲喜剧 | Empyreal Tragicomedy Rerun | 悲歎せし焔海の詩(復刻) | - | -| 20210225 | event 20210225 cn | Khorovod of Dawn's Rime | 破晓冰华 | Khorovod of Dawn's Rime | 暁射す氷華の嵐 | - | -| 20210225 | event 20210225 tw | Northern Overture | - | - | - | 北境序曲 | -| 20210325 | event 20210325 cn | Ashen Simulacrum | 复刻箱庭疗法 | Ashen Simulacrum Rerun | 開かれし紺碧の砂箱(復刻) | - | -| 20210415 | event 20210415 tw | Encircling Graf Spee | - | - | - | 復刻圍剿施佩伯爵 | -| 20210422 | event 20210422 cn | Daedalian Hymn | 复兴的赞美诗 | Daedalian Hymn | 讃える復興の迷路 | - | -| 20210429 | event 20210429 tw | Ink Stained Steel Sakura | - | - | - | 復刻墨染的鋼鐵之花 | -| 20210527 | event 20210527 tw | Microlayer Medley | - | - | - | 微層混合 | -| 20210527 | event 20210527 cn | Mirror Involution | 镜位螺旋 | Mirror Involution | 照らす螺旋の鏡海 | - | -| 20210610 | event 20210610 tw | The Way Home in the Night | - | - | - | 夜幕下的歸途 | -| 20210624 | event 20210624 tw | Skybound Oratorio | - | - | - | 穹頂下的聖詠曲 | -| 20210624 | event 20210624 cn | Swirling Cherry Blossoms | 复刻浮樱影华 | Swirling Cherry Blossoms Rerun | 翳りし満ちる影の華(復刻) | - | -| 20210708 | raid 20210708 | Cross Wave | 复刻穿越彼方的水线 | Cross Wave rerun | 交錯する新たな波 (復刻) | - | -| 20210708 | event 20200903 en | Stars of the Shimmering Fjord | - | - | - | 峽灣間的星辰 | -| 20210722 | event 20210722 cn | Azur Anthem | 响彻碧海的偶像歌 | Azur Anthem | 海に響くアイドルの歌 | - | -| 20210729 | event 20200723 cn | Aurora Noctis | - | - | - | 永夜幻光 | -| 20210812 | event 20200806 cn | The Enigma and the Shark | - | - | - | 最重要的寶物 | -| 20210819 | event 20210819 cn | Microlayer Medley | 复刻微层混合 | Microlayer Medley Rerun | 闇靄払う銀翼(復刻) | - | -| 20210826 | event 20210722 cn | Azur Anthem | - | - | - | 響徹碧海的偶像歌 | -| 20210916 | event 20210916 cn | Upon the Shimmering Blue | 碧海光粼 | Upon the Shimmering Blue | 駆けよ 碧海の吹き風 | - | -| 20210923 | event 20200917 cn | Dreamwaker's Butterfly | - | - | - | 蝶海夢花 | -| 20211008 | event 20201012 cn | Sundered Blue | - | - | - | 劃破海空之翼 | -| 20211014 | raid 20210708 | Cross Wave | - | - | - | 穿越彼方的水線 | -| 20211028 | event 20211028 cn | Skybound Oratorio | 复刻穹顶下的圣咏曲 | Skybound Oratorio Rerun | 神穹を衝く聖歌(復刻) | - | -| 20211028 | event 20211028 tw | Iris of Light and Dark | - | - | - | 復刻光與影的鳶尾之華 | -| 20211111 | event 20211111 cn | The Flame-Touched Dagger | 杰诺瓦的焰火 | The Flame-Touched Dagger | 燈火のシニエ | - | -| 20211125 | event 20211125 cn | World-spanning Arclight | 交汇世界的弧光 | World-spanning Arclight | 弧光は交わる世界にて | - | -| 20211130 | event 20211125 cn | World-spanning Arclight | - | - | - | 交匯世界的弧光 | -| 20211214 | event 20200603 cn | Counterattack Within the Fjord | - | - | - | 峽灣間的反擊 | -| 20211229 | event 20211229 cn | Tower of Transcendence | 逆转彩虹之塔 | Tower of Transcendence | 遡望せし虹彩の塔 | - | -| 20211230 | event 20201229 cn | Inverted Orthant | - | - | - | 負象限作戰 | -| 20220127 | raid 20220127 | Mystery Investigation | 演习神秘事件调查 | Mystery Investigation | 秘密事件調査 | - | -| 20220210 | event 20220210 cn | Northern Overture Rerun | 复刻北境序曲 | Northern Overture Rerun | 凍絶の北海(復刻) | - | -| 20220224 | event 20210225 cn | Khorovod of Dawn's Rime | - | - | - | 破曉冰華 | -| 20220224 | event 20220224 cn | Abyssal Refrain | 深度回音 | Abyssal Refrain | 鳴動せし星霜の淵 | - | +| Aired Date | Directory | Event Name | CN | EN | JP | TW | +|------------|--------------------------|---------------------------------|-------------|--------------------------------------|--------------------| -------------------- | +| 20170607 | war archives 20181020 en | Strive, Wish, and Strategize | 努力、希望和计划 | Strive, Wish, and Strategize | 努力、希望と計画 | 努力、希望和計劃 | +| 20170802 | war archives 20191031 en | Divergent Chessboard | 异色格 | Divergent Chessboard | 鏡写されし異色 | 異色格 | +| 20170928 | war archives 20190321 en | Visitors Dyed in Red | 红染的参访者 | Visitors Dyed in Red | 紅染の来訪者 | 紅染的參訪者 | +| 20171026 | war archives 20190620 en | Glorious Battle | 光荣的一战 | Glorious Battle | 栄光なる最終戦 | 光榮的一戰 | +| 20171228 | war archives 20181026 en | Fallen Wings | 坠落之翼 | Fallen Wings | 闇に堕ちた青き翼 | 墜落之翼 | +| 20180119 | war archives 20191010 en | Encircling Graf Spee | 围剿斯佩伯爵 | Encircling Graf Spee | アドミラル・グラーフ・シュペー追撃戦 | 圍剿斯佩伯爵 | +| 20180226 | war archives 20190221 en | Winter\'s Crown | 凛冬王冠 | Winter\'s Crown | 凛冽なりし冬の王冠 | 凜冬王冠 | +| 20180607 | war archives 20180607 cn | Ink Stained Steel Sakura | 墨染的钢铁之花 | Ink Stained Steel Sakura | 墨染まりし鋼の桜 | 墨染的鋼鐵之花 | +| 20180726 | war archives 20180726 cn | Iris of Light and Dark | 光与影的鸢尾之华 | Iris of Light and Dark | 光と影のアイリス | 光與影的鳶尾之華 | +| 20210121 | war archives 20181227 cn | Crimson Echoes | 苍红的回响 | Crimson Echoes | 縹映る深緋の残響 | 蒼紅的迴響 | +| 20210513 | war archives 20200820 cn | Scherzo of Iron and Blood | 铁血音符誓言 | Scherzo of Iron and Blood | 黒鉄の楽章 誓いの海 | - | +| 20211014 | war archives 20211014 cn | Crescendo of Polaris | 激奏的Polaris | Crescendo of Polaris | 激奏のポラリス | - | +| 20220113 | war archives 20190911 cn | Empyreal Tragicomedy | 神圣的悲喜剧 | Empyreal Tragicomedy | 悲歎せし焔海の詩 | - | +| 20220407 | war archives 20210325 cn | Ashen Simulacrum | 箱庭疗法 | Ashen Simulacrum | 開かれし紺碧の砂箱 | - | +| 20220721 | war archives 20210624 cn | Swirling Cherry Blossoms | 浮樱影华 | Swirling Cherry Blossoms | 翳りし満ちる影の華 | - | +| 20220901 | war archives 20200806 cn | The Enigma and the Shark | 最重要的宝物 | The Enigma and the Shark | 鉄血鮫とエニグマ | - | +| 20221013 | war archives 20201029 cn | Universe in Unison | 激唱的UNIVERSE | Universe in Unison | 激唱のユニバース | - | +| 20200227 | event 20200227 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | - | +| 20200312 | event 20200312 cn | The Solomon Ranger | 复刻斯图尔特的硝烟 | The Solomon Ranger Rerun | 南洋に靡く硝煙(復刻) | - | +| 20200326 | event 20200326 cn | Microlayer Medley | 微层混合 | Microlayer Medley | 闇靄払う銀翼 | - | +| 20200423 | event 20200423 cn | Crimson Echoes | 复刻苍红的回响 | Crimson Echoes Rerun | 縹映る深緋の残響(復刻) | - | +| 20200507 | event 20200507 cn | The Way Home in the Night | 夜幕下的归途 | The Way Home in the Night | 帰路は海色の陰りへと | - | +| 20200521 | event 20200521 cn | Skybound Oratorio | 穹顶下的圣咏曲 | - | 神穹を衝く聖歌 | - | +| 20200521 | event 20200521 en | Iris of Light and Dark | - | Iris of Light and Dark Rerun | - | - | +| 20200603 | event 20200603 cn | Counterattack Within the Fjord | 峡湾间的反击 | - | 峡湾間の反撃 | - | +| 20200603 | event 20200603 en | Prelude under the Moon | - | Prelude under the Moon Rerun | - | - | +| 20200611 | event 20200611 en | Skybound Oratorio | - | Skybound Oratorio | - | - | +| 20200624 | raid 20200624 | Air Raid Drills with Essex | 复刻特别演习埃塞克斯级 | Air Raid Drills with Essex Rerun | 特別演習超空強襲波(復刻) | 特別演習埃塞克斯級 | +| 20200716 | event 20200716 en | Ink Stained Steel Sakura | - | Ink Stained Steel Sakura Rerun | - | - | +| 20200723 | event 20200723 cn | Aurora Noctis | 永夜幻光 | Aurora Noctis | 極夜照らす幻光 | - | +| 20200806 | event 20200806 cn | The Enigma and the Shark | 复刻最重要的宝物 | - | 鉄血鮫とエニグマ(復刻) | - | +| 20200820 | event 20200820 cn | Scherzo of Iron and Blood | 复刻铁血音符誓言 | Scherzo of Iron and Blood Rerun | 黒鉄の楽章 誓いの海(復刻) | - | +| 20200903 | event 20200903 en | Stars of the Shimmering Fjord | - | Stars of the Shimmering Fjord | - | - | +| 20200917 | event 20200917 cn | Dreamwaker's Butterfly | 蝶海梦花 | Dreamwaker's Butterfly | 刹那觀る胡蝶の夢 | - | +| 20201002 | event 20201002 en | Counterattack Within the Fjord | - | Counterattack Within the Fjord | - | - | +| 20201012 | event 20201012 cn | Sundered Blue | 划破海空之翼 | - | 奔る彩帆の青 | - | +| 20201029 | event 20201029 cn | Universe in Unison | 激唱的UNIVERSE | Universe in Unison | 激唱のユニバース | - | +| 20201105 | event 20200312 cn | The Solomon Ranger | - | - | - | 斯圖爾特的硝煙 | +| 20201112 | event 20200903 en | Stars of the Shimmering Fjord | 复刻峡湾间的星辰 | - | 輝ける峡湾の星(復刻) | - | +| 20201112 | event 20201012 cn | Sundered Blue | - | Sundered Blue | - | - | +| 20201126 | event 20201126 cn | Vacation Lane | 假日航线 | Vacation Lane | バケーションレーン | - | +| 20201210 | event 20200806 cn | The Enigma and the Shark | - | The Enigma and the Shark Rerun | - | - | +| 20201229 | event 20201229 cn | Inverted Orthant | 负象限作战 | Inverted Orthant | 虚畳なりし限象 | - | +| 20210121 | event 20210121 cn | Empyreal Tragicomedy | 复刻神圣的悲喜剧 | Empyreal Tragicomedy Rerun | 悲歎せし焔海の詩(復刻) | - | +| 20210225 | event 20210225 cn | Khorovod of Dawn's Rime | 破晓冰华 | Khorovod of Dawn's Rime | 暁射す氷華の嵐 | - | +| 20210225 | event 20210225 tw | Northern Overture | - | - | - | 北境序曲 | +| 20210325 | event 20210325 cn | Ashen Simulacrum | 复刻箱庭疗法 | Ashen Simulacrum Rerun | 開かれし紺碧の砂箱(復刻) | - | +| 20210415 | event 20210415 tw | Encircling Graf Spee | - | - | - | 復刻圍剿施佩伯爵 | +| 20210422 | event 20210422 cn | Daedalian Hymn | 复兴的赞美诗 | Daedalian Hymn | 讃える復興の迷路 | - | +| 20210429 | event 20210429 tw | Ink Stained Steel Sakura | - | - | - | 復刻墨染的鋼鐵之花 | +| 20210527 | event 20210527 tw | Microlayer Medley | - | - | - | 微層混合 | +| 20210527 | event 20210527 cn | Mirror Involution | 镜位螺旋 | Mirror Involution | 照らす螺旋の鏡海 | - | +| 20210610 | event 20210610 tw | The Way Home in the Night | - | - | - | 夜幕下的歸途 | +| 20210624 | event 20210624 tw | Skybound Oratorio | - | - | - | 穹頂下的聖詠曲 | +| 20210624 | event 20210624 cn | Swirling Cherry Blossoms | 复刻浮樱影华 | Swirling Cherry Blossoms Rerun | 翳りし満ちる影の華(復刻) | - | +| 20210708 | raid 20210708 | Cross Wave | 复刻穿越彼方的水线 | Cross Wave rerun | 交錯する新たな波 (復刻) | - | +| 20210708 | event 20200903 en | Stars of the Shimmering Fjord | - | - | - | 峽灣間的星辰 | +| 20210722 | event 20210722 cn | Azur Anthem | 响彻碧海的偶像歌 | Azur Anthem | 海に響くアイドルの歌 | - | +| 20210729 | event 20200723 cn | Aurora Noctis | - | - | - | 永夜幻光 | +| 20210812 | event 20200806 cn | The Enigma and the Shark | - | - | - | 最重要的寶物 | +| 20210819 | event 20210819 cn | Microlayer Medley | 复刻微层混合 | Microlayer Medley Rerun | 闇靄払う銀翼(復刻) | - | +| 20210826 | event 20210722 cn | Azur Anthem | - | - | - | 響徹碧海的偶像歌 | +| 20210916 | event 20210916 cn | Upon the Shimmering Blue | 碧海光粼 | Upon the Shimmering Blue | 駆けよ 碧海の吹き風 | - | +| 20210923 | event 20200917 cn | Dreamwaker's Butterfly | - | - | - | 蝶海夢花 | +| 20211008 | event 20201012 cn | Sundered Blue | - | - | - | 劃破海空之翼 | +| 20211014 | raid 20210708 | Cross Wave | - | - | - | 穿越彼方的水線 | +| 20211028 | event 20211028 cn | Skybound Oratorio | 复刻穹顶下的圣咏曲 | Skybound Oratorio Rerun | 神穹を衝く聖歌(復刻) | - | +| 20211028 | event 20211028 tw | Iris of Light and Dark | - | - | - | 復刻光與影的鳶尾之華 | +| 20211111 | event 20211111 cn | The Flame-Touched Dagger | 杰诺瓦的焰火 | The Flame-Touched Dagger | 燈火のシニエ | - | +| 20211125 | event 20211125 cn | World-spanning Arclight | 交汇世界的弧光 | World-spanning Arclight | 弧光は交わる世界にて | - | +| 20211130 | event 20211125 cn | World-spanning Arclight | - | - | - | 交匯世界的弧光 | +| 20211214 | event 20200603 cn | Counterattack Within the Fjord | - | - | - | 峽灣間的反擊 | +| 20211229 | event 20211229 cn | Tower of Transcendence | 逆转彩虹之塔 | Tower of Transcendence | 遡望せし虹彩の塔 | - | +| 20211230 | event 20201229 cn | Inverted Orthant | - | - | - | 負象限作戰 | +| 20220127 | raid 20220127 | Mystery Investigation | 演习神秘事件调查 | Mystery Investigation | 秘密事件調査 | - | +| 20220210 | event 20220210 cn | Northern Overture Rerun | 复刻北境序曲 | Northern Overture Rerun | 凍絶の北海(復刻) | - | +| 20220224 | event 20210225 cn | Khorovod of Dawn's Rime | - | - | - | 破曉冰華 | +| 20220224 | event 20220224 cn | Abyssal Refrain | 深度回音 | Abyssal Refrain | 鳴動せし星霜の淵 | - | | 20220310 | event 20200603 cn | Counterattack Within the Fjord | 复刻峡湾间的反击 | Counterattack Within the Fjord Rerun | 峡湾間の反撃(復刻) | - | -| 20220310 | event 20220310 tw | The Solomon Ranger | - | - | - | 復刻斯圖爾特的硝煙 | -| 20220324 | event 20220324 cn | Virtual Tower | 虚像构筑之塔 | Virtual Tower | 幻像の塔 | - | -| 20220324 | event 20210422 cn | Daedalian Hymn | - | - | - | 復興的讚美詩 | -| 20220407 | event 20220407 tw | Crimson Echoes | - | - | - | 蒼紅的迴響(復刻) | -| 20220414 | event 20220414 cn | Aurora Noctis | 复刻永夜幻光 | Aurora Noctis Rerun | 極夜照らす幻光(復刻) | - | -| 20220428 | event 20220428 cn | Rondo at Rainbow's End | 虹彩的终幕曲 | Rondo at Rainbow's End | 吟ずる瑠璃の楽章 | - | -| 20220505 | raid 20200624 | Air Raid Drills with Essex | - | - | - | 特別演習埃塞克斯級(復刻) | -| 20220526 | event 20220526 cn | Pledge of the Radiant Court | 泠誓光庭 | Pledge of the Radiant Court | 诚閃の剣 搖光の城 | - | -| 20220526 | event 20210527 cn | Mirror Involution | - | - | - | 鏡位螺旋 | -| 20220616 | event 20201012 cn | Sundered Blue | 复刻划破海空之翼 | Sundered Blue Rerun | 奔る彩帆の青(復刻) | - | -| 20220616 | event 20200820 cn | Scherzo of Iron and Blood | - | - | - | 復刻鐵血音符誓言 | -| 20220630 | raid 20210708 | Cross Wave | - | - | - | 復刻穿越彼方的水線 | -| 20220630 | raid 20220630 | Angel of Iris | 来自鸢尾的天使 | Angel of Iris | アイリスの天使 | - | -| 20220714 | event 20201029 cn | Universe in Unison | - | - | - | 激唱的UNIVERSE | -| 20220714 | event 20200917 cn | Dreamwaker's Butterfly | 复刻蝶海梦花 | Dreamwaker's Butterfly Rerun | 刹那觀る胡蝶の夢(復刻) | - | -| 20220728 | event 20220728 cn | Aquilifer's Ballade | 雄鹰的叙事歌 | Aquilifer's Ballade | 鋼鷲の冒険譚 | - | -| 20220804 | event 20211028 cn | Skybound Oratorio Rerun | - | - | - | 復刻穹頂下的聖詠曲 | -| 20220818 | event 20220324 cn | Virtual Tower | - | - | - | 虛像構築之塔 | -| 20220818 | event 20220818 cn | Operation Convergence | 远汇点作战 | Operation Convergence | 結像点作戦 | - | -| 20220901 | event 20200903 en | Stars of the Shimmering Fjord | - | - | - | 復刻峽灣間的星辰 | -| 20220915 | event 20210916 cn | Upon the Shimmering Blue | - | - | - | 碧海光粼 | -| 20220915 | event 20220915 cn | Violet Tempest Blooming Lycoris | 紫绛槿岚 | Violet Tempest Blooming Lycoris | 赫の涙月 菫の暁風 | - | -| 20221021 | event 20210121 cn | Empyreal Tragicomedy | - | - | - | 復刻神聖的悲喜劇 | -| 20221027 | raid 20221027 | Fight! Royal Maid | 战斗!皇家女仆队3rd | Fight On, Royal Maids!(Part 3) | 戦え!ロイヤルメイド隊3rd | - | -| 20221103 | event 20211111 cn | The Flame-Touched Dagger | - | - | - | 杰諾瓦的焰火 | +| 20220310 | event 20220310 tw | The Solomon Ranger | - | - | - | 復刻斯圖爾特的硝煙 | +| 20220324 | event 20220324 cn | Virtual Tower | 虚像构筑之塔 | Virtual Tower | 幻像の塔 | - | +| 20220324 | event 20210422 cn | Daedalian Hymn | - | - | - | 復興的讚美詩 | +| 20220407 | event 20220407 tw | Crimson Echoes | - | - | - | 蒼紅的迴響(復刻) | +| 20220414 | event 20220414 cn | Aurora Noctis | 复刻永夜幻光 | Aurora Noctis Rerun | 極夜照らす幻光(復刻) | - | +| 20220428 | event 20220428 cn | Rondo at Rainbow's End | 虹彩的终幕曲 | Rondo at Rainbow's End | 吟ずる瑠璃の楽章 | - | +| 20220505 | raid 20200624 | Air Raid Drills with Essex | - | - | - | 特別演習埃塞克斯級(復刻) | +| 20220526 | event 20220526 cn | Pledge of the Radiant Court | 泠誓光庭 | Pledge of the Radiant Court | 诚閃の剣 搖光の城 | - | +| 20220526 | event 20210527 cn | Mirror Involution | - | - | - | 鏡位螺旋 | +| 20220616 | event 20201012 cn | Sundered Blue | 复刻划破海空之翼 | Sundered Blue Rerun | 奔る彩帆の青(復刻) | - | +| 20220616 | event 20200820 cn | Scherzo of Iron and Blood | - | - | - | 復刻鐵血音符誓言 | +| 20220630 | raid 20210708 | Cross Wave | - | - | - | 復刻穿越彼方的水線 | +| 20220630 | raid 20220630 | Angel of Iris | 来自鸢尾的天使 | Angel of Iris | アイリスの天使 | - | +| 20220714 | event 20201029 cn | Universe in Unison | - | - | - | 激唱的UNIVERSE | +| 20220714 | event 20200917 cn | Dreamwaker's Butterfly | 复刻蝶海梦花 | Dreamwaker's Butterfly Rerun | 刹那觀る胡蝶の夢(復刻) | - | +| 20220728 | event 20220728 cn | Aquilifer's Ballade | 雄鹰的叙事歌 | Aquilifer's Ballade | 鋼鷲の冒険譚 | - | +| 20220804 | event 20211028 cn | Skybound Oratorio Rerun | - | - | - | 復刻穹頂下的聖詠曲 | +| 20220818 | event 20220324 cn | Virtual Tower | - | - | - | 虛像構築之塔 | +| 20220818 | event 20220818 cn | Operation Convergence | 远汇点作战 | Operation Convergence | 結像点作戦 | - | +| 20220901 | event 20200903 en | Stars of the Shimmering Fjord | - | - | - | 復刻峽灣間的星辰 | +| 20220915 | event 20210916 cn | Upon the Shimmering Blue | - | - | - | 碧海光粼 | +| 20220915 | event 20220915 cn | Violet Tempest Blooming Lycoris | 紫绛槿岚 | Violet Tempest Blooming Lycoris | 赫の涙月 菫の暁風 | - | +| 20221021 | event 20210121 cn | Empyreal Tragicomedy | - | - | - | 復刻神聖的悲喜劇 | +| 20221027 | raid 20221027 | Fight! Royal Maid | 战斗!皇家女仆队3rd | Fight On, Royal Maids!(Part 3) | 戦え!ロイヤルメイド隊3rd | - | +| 20221103 | event 20211111 cn | The Flame-Touched Dagger | - | - | - | 杰諾瓦的焰火 | +| 20221110 | event 20221110 cn | Inverted Orthant | 复刻负象限作战 | Inverted Orthant Rerun | 虚畳なりし限象(復刻) | - | diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 115a8f446..4dd0eabd8 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1516,6 +1516,7 @@ "value": "campaign_main", "option": [ "campaign_main", + "event_20201229_cn", "event_20211111_cn", "event_20210121_cn", "event_20220915_cn", @@ -1569,10 +1570,10 @@ "event_20200326_cn", "event_20200227_cn" ], - "tw": "event_20211111_cn", - "cn": "event_20220915_cn", - "en": "event_20220915_cn", - "jp": "event_20220915_cn" + "cn": "event_20201229_cn", + "en": "event_20201229_cn", + "jp": "event_20201229_cn", + "tw": "event_20201229_cn" }, "Mode": { "type": "select", @@ -1936,6 +1937,7 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20201229_cn", "event_20211111_cn", "event_20210121_cn", "event_20220915_cn", @@ -1960,7 +1962,6 @@ "event_20220224_cn", "event_20210225_cn", "event_20220210_cn", - "event_20201229_cn", "event_20211229_cn", "event_20211125_cn", "event_20211028_tw", @@ -1990,10 +1991,10 @@ "event_20200227_cn" ], "display": "disabled", - "tw": "event_20211111_cn", - "cn": "event_20220915_cn", - "en": "event_20220915_cn", - "jp": "event_20220915_cn" + "cn": "event_20201229_cn", + "en": "event_20201229_cn", + "jp": "event_20201229_cn", + "tw": "event_20201229_cn" }, "Mode": { "type": "select", @@ -2356,6 +2357,7 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20201229_cn", "event_20211111_cn", "event_20210121_cn", "event_20220915_cn", @@ -2380,7 +2382,6 @@ "event_20220224_cn", "event_20210225_cn", "event_20220210_cn", - "event_20201229_cn", "event_20211229_cn", "event_20211125_cn", "event_20211028_tw", @@ -2410,10 +2411,10 @@ "event_20200227_cn" ], "display": "disabled", - "tw": "event_20211111_cn", - "cn": "event_20220915_cn", - "en": "event_20220915_cn", - "jp": "event_20220915_cn" + "cn": "event_20201229_cn", + "en": "event_20201229_cn", + "jp": "event_20201229_cn", + "tw": "event_20211111_cn" }, "Mode": { "type": "select", @@ -2787,6 +2788,7 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20201229_cn", "event_20211111_cn", "event_20210121_cn", "event_20220915_cn", @@ -2841,10 +2843,10 @@ "event_20200227_cn" ], "display": "disabled", - "tw": "event_20211111_cn", - "cn": "event_20220915_cn", - "en": "event_20220915_cn", - "jp": "event_20220915_cn" + "cn": "event_20201229_cn", + "en": "event_20201229_cn", + "jp": "event_20201229_cn", + "tw": "event_20201229_cn" }, "Mode": { "type": "select", @@ -3224,6 +3226,7 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20201229_cn", "event_20211111_cn", "event_20210121_cn", "event_20220915_cn", @@ -3278,10 +3281,10 @@ "event_20200227_cn" ], "display": "disabled", - "tw": "event_20211111_cn", - "cn": "event_20220915_cn", - "en": "event_20220915_cn", - "jp": "event_20220915_cn" + "cn": "event_20201229_cn", + "en": "event_20201229_cn", + "jp": "event_20201229_cn", + "tw": "event_20211111_cn" }, "Mode": { "type": "select", @@ -3661,6 +3664,7 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20201229_cn", "event_20211111_cn", "event_20210121_cn", "event_20220915_cn", @@ -3715,10 +3719,10 @@ "event_20200227_cn" ], "display": "disabled", - "tw": "event_20211111_cn", - "cn": "event_20220915_cn", - "en": "event_20220915_cn", - "jp": "event_20220915_cn" + "cn": "event_20201229_cn", + "en": "event_20201229_cn", + "jp": "event_20201229_cn", + "tw": "event_20201229_cn" }, "Mode": { "type": "select", @@ -4098,6 +4102,7 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20201229_cn", "event_20211111_cn", "event_20210121_cn", "event_20220915_cn", @@ -4152,10 +4157,10 @@ "event_20200227_cn" ], "display": "disabled", - "tw": "event_20211111_cn", - "cn": "event_20220915_cn", - "en": "event_20220915_cn", - "jp": "event_20220915_cn" + "cn": "event_20201229_cn", + "en": "event_20201229_cn", + "jp": "event_20201229_cn", + "tw": "event_20201229_cn" }, "Mode": { "type": "select", @@ -4525,6 +4530,7 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20201229_cn", "event_20211111_cn", "event_20210121_cn", "event_20220915_cn", @@ -4579,10 +4585,10 @@ "event_20200227_cn" ], "display": "disabled", - "tw": "event_20211111_cn", - "cn": "event_20220915_cn", - "en": "event_20220915_cn", - "jp": "event_20220915_cn" + "cn": "event_20201229_cn", + "en": "event_20201229_cn", + "jp": "event_20201229_cn", + "tw": "event_20211111_cn" }, "Mode": { "type": "select", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index ea20724ae..2040e2559 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -585,6 +585,7 @@ "name": "Event Name", "help": "Automatically selects to the latest event", "campaign_main": "campaign_main", + "event_20201229_cn": "Inverted Orthant Rerun", "event_20211111_cn": "The Flame-Touched Dagger", "raid_20221027": "Fight On Royal Maids!(Part 3)", "event_20210121_cn": "Empyreal Tragicomedy Rerun", @@ -614,7 +615,6 @@ "event_20210225_cn": "Khorovod of Dawns Rime", "event_20220210_cn": "Northern Overture Rerun", "raid_20220127": "Mystery Investigation", - "event_20201229_cn": "Inverted Orthant", "event_20211229_cn": "Tower of Transcendence", "event_20211125_cn": "World-spanning Arclight", "event_20211028_tw": "復刻光與影的鳶尾之華", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 50032d7eb..2c918a499 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -585,6 +585,7 @@ "name": "Campaign.Event.name", "help": "Campaign.Event.help", "campaign_main": "campaign_main", + "event_20201229_cn": "虚畳なりし限象(復刻)", "event_20211111_cn": "燈火のシニエ", "raid_20221027": "戦え!ロイヤルメイド隊3rd", "event_20210121_cn": "悲歎せし焔海の詩(復刻)", @@ -614,7 +615,6 @@ "event_20210225_cn": "暁射す氷華の嵐", "event_20220210_cn": "凍絶の北海(復刻)", "raid_20220127": "秘密事件調査", - "event_20201229_cn": "虚畳なりし限象", "event_20211229_cn": "遡望せし虹彩の塔", "event_20211125_cn": "弧光は交わる世界にて", "event_20211028_tw": "復刻光與影的鳶尾之華", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 52a275e54..21ed346ac 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -585,6 +585,7 @@ "name": "活动名称", "help": "自动选择至最新的活动", "campaign_main": "主线图", + "event_20201229_cn": "复刻负象限作战", "event_20211111_cn": "杰诺瓦的焰火", "raid_20221027": "战斗!皇家女仆队3rd", "event_20210121_cn": "复刻神圣的悲喜剧", @@ -614,7 +615,6 @@ "event_20210225_cn": "破晓冰华", "event_20220210_cn": "复刻北境序曲", "raid_20220127": "演习神秘事件调查", - "event_20201229_cn": "负象限作战", "event_20211229_cn": "逆转彩虹之塔", "event_20211125_cn": "交汇世界的弧光", "event_20211028_tw": "復刻光與影的鳶尾之華", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index ca3ebef2d..255eef91f 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -585,6 +585,7 @@ "name": "活動名稱", "help": "自動選擇至最新的活動圖", "campaign_main": "主線圖", + "event_20201229_cn": "Inverted Orthant Rerun", "event_20211111_cn": "杰諾瓦的焰火", "raid_20221027": "Fight On Royal Maids!(Part 3)", "event_20210121_cn": "復刻神聖的悲喜劇", @@ -614,7 +615,6 @@ "event_20210225_cn": "破曉冰華", "event_20220210_cn": "Northern Overture Rerun", "raid_20220127": "Mystery Investigation", - "event_20201229_cn": "負象限作戰", "event_20211229_cn": "Tower of Transcendence", "event_20211125_cn": "交匯世界的弧光", "event_20211028_tw": "復刻光與影的鳶尾之華",