From 34d6019c619b6eb80e953df0ed1e155f210c305d Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 17 Jan 2024 18:08:17 +0800 Subject: [PATCH 01/65] Fix: Raise exception if relics are full --- tasks/combat/combat.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index 3ba806dad..d14e4fc39 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -1,4 +1,5 @@ from module.base.decorator import run_once +from module.exception import RequestHumanTakeover from module.logger import logger from tasks.combat.assets.assets_combat_finish import COMBAT_AGAIN, COMBAT_EXIT from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE @@ -81,6 +82,7 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo logger.hr('Combat prepare') skip_first_screenshot = True pre_set_team = bool(support_character) + trial = 0 while 1: if skip_first_screenshot: skip_first_screenshot = False @@ -90,6 +92,11 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo # End if self.is_combat_executing(): return True + # Relics full + # Clicking between COMBAT_PREPARE and COMBAT_TEAM_PREPARE + if trial > 3: + logger.critical('Failed to enter dungeon after 3 trial, probably because relics are full') + raise RequestHumanTakeover # Click if self.appear(COMBAT_TEAM_SUPPORT) and support_character: @@ -112,6 +119,7 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo return False self.device.click(COMBAT_PREPARE) self.interval_reset(COMBAT_PREPARE) + trial += 1 continue if self.handle_combat_interact(): continue @@ -308,6 +316,9 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo Returns: int: Run count + Raises: + RequestHumanTakeover: If relics are full + Pages: in: COMBAT_PREPARE or page_main with DUNGEON_COMBAT_INTERACT From 5016f0e53b19d52227e1c6d429c57f8fd1a066d1 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 17 Jan 2024 18:11:31 +0800 Subject: [PATCH 02/65] Fix: Dungeon didnt call daily if stamina quest is done --- tasks/dungeon/dungeon.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tasks/dungeon/dungeon.py b/tasks/dungeon/dungeon.py index 10afe2bae..5bfb4e171 100644 --- a/tasks/dungeon/dungeon.py +++ b/tasks/dungeon/dungeon.py @@ -405,11 +405,15 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat): return require def check_stamina_quest(self, stamina_used: int): - if KEYWORD_BATTLE_PASS_QUEST.Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max not in self.weekly_quests: - return + logger.info(f'Used {stamina_used} stamina') - logger.info(f'Done Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max stamina {stamina_used}') - self.config.stored.BattlePassQuestTrailblazePower.add(stamina_used) - if self.config.stored.BattlePassQuestTrailblazePower.is_full(): - logger.info('Achieved weekly quest Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max') - self.achieved_weekly_quest = True + if KEYWORD_BATTLE_PASS_QUEST.Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max in self.weekly_quests: + logger.info(f'Done Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max stamina {stamina_used}') + self.config.stored.BattlePassQuestTrailblazePower.add(stamina_used) + if self.config.stored.BattlePassQuestTrailblazePower.is_full(): + logger.info('Achieved weekly quest Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max') + self.achieved_weekly_quest = True + + if KEYWORDS_DAILY_QUEST.Consume_120_Trailblaze_Power in self.daily_quests: + logger.info(f'Done Consume_120_Trailblaze_Power stamina {stamina_used}') + self.achieved_daily_quest = True From 6214c8d494c589d09c9fd9a1d2ef34851bd1907f Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 17 Jan 2024 18:53:33 +0800 Subject: [PATCH 03/65] Add: Aim clicker in daemon --- config/template.json | 3 ++- module/config/argument/args.json | 10 ++++++++ module/config/argument/argument.yaml | 4 ++- module/config/config_generated.py | 1 + module/config/i18n/en-US.json | 8 ++++++ module/config/i18n/es-ES.json | 8 ++++++ module/config/i18n/ja-JP.json | 8 ++++++ module/config/i18n/zh-CN.json | 8 ++++++ module/config/i18n/zh-TW.json | 8 ++++++ tasks/base/daemon.py | 37 ++++++++++++++++++++++++++-- 10 files changed, 91 insertions(+), 4 deletions(-) diff --git a/config/template.json b/config/template.json index 1a066fef3..f930c95aa 100644 --- a/config/template.json +++ b/config/template.json @@ -206,7 +206,8 @@ }, "Daemon": { "Daemon": { - "Enable": true + "Enable": true, + "AimClicker": "do_not_click" } } } \ No newline at end of file diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 87e2afac5..27e0773f2 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1374,6 +1374,16 @@ "option_bold": [ true ] + }, + "AimClicker": { + "type": "select", + "value": "do_not_click", + "option": [ + "item_enemy", + "item", + "enemy", + "do_not_click" + ] } } } diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 7735641b1..3e0d467e8 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -277,4 +277,6 @@ Daemon: value: true option: [ true ] option_bold: [ true, ] - + AimClicker: + value: do_not_click + option: [ item_enemy, item, enemy, do_not_click ] diff --git a/module/config/config_generated.py b/module/config/config_generated.py index da2a17684..df92ca4ce 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -148,3 +148,4 @@ class GeneratedConfig: # Group `Daemon` Daemon_Enable = True # True + Daemon_AimClicker = 'do_not_click' # item_enemy, item, enemy, do_not_click diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index d9dd273d4..3827d0f63 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -950,6 +950,14 @@ "name": "Dialogue Clicker", "help": "Monitor game, automatically click dialogue, phone chatting, and blessing in simulated universe (follow the simulated universe task settings)", "True": "Enabled" + }, + "AimClicker": { + "name": "Click Aimed Items and Enemies", + "help": "", + "item_enemy": "Click items and enemies", + "item": "Click items only", + "enemy": "Click enemies only", + "do_not_click": "Don't click" } }, "Gui": { diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index 2492c16e1..e6a38f61e 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -950,6 +950,14 @@ "name": "Clic de diálogo", "help": "Monitorear el juego, hacer clic automáticamente en el diálogo, chatear por teléfono y bendecir en el universo simulado (sigue la configuración de tareas del universo simulado)", "True": "Activado" + }, + "AimClicker": { + "name": "Haz clic en Objetos y enemigos apuntados", + "help": "", + "item_enemy": "Haz clic en elementos y enemigos", + "item": "Haz clic solo en elementos", + "enemy": "Haz clic solo en enemigos", + "do_not_click": "No hacer clic" } }, "Gui": { diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 3d4216685..d4efefcb2 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -950,6 +950,14 @@ "name": "Daemon.Enable.name", "help": "Daemon.Enable.help", "True": "True" + }, + "AimClicker": { + "name": "Daemon.AimClicker.name", + "help": "Daemon.AimClicker.help", + "item_enemy": "item_enemy", + "item": "item", + "enemy": "enemy", + "do_not_click": "do_not_click" } }, "Gui": { diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 3c49637d8..7a8294222 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -950,6 +950,14 @@ "name": "剧情连点器", "help": "监听画面自动点击剧情、手机聊天、模拟宇宙祝福(遵循模拟宇宙任务设置)", "True": "已启用" + }, + "AimClicker": { + "name": "点击被瞄准破坏物和敌人", + "help": "", + "item_enemy": "点击破坏物和敌人", + "item": "仅点击破坏物", + "enemy": "仅点击敌人", + "do_not_click": "不点击" } }, "Gui": { diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 5a73b45f8..93808715e 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -950,6 +950,14 @@ "name": "劇情連點器", "help": "監聽畫面自動點擊劇情、手機聊天、模擬宇宙祝福(遵循模擬宇宙任務設定)", "True": "已啟用" + }, + "AimClicker": { + "name": "點擊被瞄準破壞物和敵人", + "help": "", + "item_enemy": "點擊破壞物和敵人", + "item": "僅點擊破壞物", + "enemy": "僅點擊敵人", + "do_not_click": "不點擊" } }, "Gui": { diff --git a/tasks/base/daemon.py b/tasks/base/daemon.py index 572a3ebd5..03a6a7d67 100644 --- a/tasks/base/daemon.py +++ b/tasks/base/daemon.py @@ -1,18 +1,45 @@ from module.base.timer import Timer +from module.daemon.daemon_base import DaemonBase from module.logger import logger from tasks.base.assets.assets_base_daemon import * from tasks.base.main_page import MainPage from tasks.base.page import page_main, page_rogue from tasks.daily.assets.assets_daily_camera import PICTURE_TAKEN from tasks.map.assets.assets_map_bigmap import TELEPORT_RIGHT +from tasks.map.interact.aim import AimDetectorMixin from tasks.rogue.route.base import RouteBase -class Daemon(RouteBase): +class Daemon(RouteBase, DaemonBase, AimDetectorMixin): + aim_interval = Timer(0.3, count=1) + + def handle_aim_click(self, item=True, enemy=True): + """ + Args: + item: + enemy: + + Returns: + bool: If clicked + """ + if not item and not enemy: + return False + if not self.is_in_main(): + return False + + if self.aim_interval.reached_and_reset(): + self.aim.predict(self.device.image, item=item, enemy=enemy) + if self.aim.aimed_enemy: + if self.handle_map_A(): + return True + if self.aim.aimed_item: + if self.handle_map_A(): + return True + return False + def run(self): # Rebind daemon settings along with rogue settings self.config.bind('Daemon', func_list=['Rogue']) - self.device.disable_stuck_detection() teleport_confirm = Timer(1, count=5) while 1: @@ -65,3 +92,9 @@ class Daemon(RouteBase): continue if self.handle_event_option(): continue + # Aim click + if self.handle_aim_click( + item='item' in self.config.Daemon_AimClicker, + enemy='enemy' in self.config.Daemon_AimClicker, + ): + continue From 98876f9245a3ac407def2cdc635c2bb045317b3e Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:08:16 +0800 Subject: [PATCH 04/65] Fix: Avoid interrupting human contact in daemon --- tasks/base/daemon.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tasks/base/daemon.py b/tasks/base/daemon.py index 03a6a7d67..86bf70863 100644 --- a/tasks/base/daemon.py +++ b/tasks/base/daemon.py @@ -1,5 +1,6 @@ from module.base.timer import Timer from module.daemon.daemon_base import DaemonBase +from module.device.method import maatouch from module.logger import logger from tasks.base.assets.assets_base_daemon import * from tasks.base.main_page import MainPage @@ -10,6 +11,17 @@ from tasks.map.interact.aim import AimDetectorMixin from tasks.rogue.route.base import RouteBase +class SecondaryMaatouchBuilder(maatouch.MaatouchBuilder): + def __init__(self, device, contact=0, handle_orientation=False): + """ + Click on secondary contact to avoid interruption of real-person contact + """ + super().__init__(device, contact=1, handle_orientation=handle_orientation) + + +maatouch.MaatouchBuilder = SecondaryMaatouchBuilder + + class Daemon(RouteBase, DaemonBase, AimDetectorMixin): aim_interval = Timer(0.3, count=1) @@ -40,6 +52,12 @@ class Daemon(RouteBase, DaemonBase, AimDetectorMixin): def run(self): # Rebind daemon settings along with rogue settings self.config.bind('Daemon', func_list=['Rogue']) + # Check contact + builder = self.device.maatouch_builder + if builder.contact >= 1: + logger.info(f'Maatouch contact on {builder.contact}') + else: + logger.warning(f'Maatouch contact on {builder.contact}, may cause interruptions') teleport_confirm = Timer(1, count=5) while 1: From 4eabe14a68fe67cacc3a34973fa12bb25b468a37 Mon Sep 17 00:00:00 2001 From: Zero <98764734+X-Zero-L@users.noreply.github.com> Date: Thu, 18 Jan 2024 12:59:21 +0800 Subject: [PATCH 05/65] Upd: Character (#280) Co-authored-by: LmeSzinc --- assets/character/DrRatio.png | Bin 0 -> 16887 bytes module/config/argument/args.json | 1 + module/config/config_generated.py | 2 +- module/config/config_updater.py | 2 +- module/config/i18n/en-US.json | 1 + module/config/i18n/es-ES.json | 1 + module/config/i18n/ja-JP.json | 1 + module/config/i18n/zh-CN.json | 1 + module/config/i18n/zh-TW.json | 1 + 9 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 assets/character/DrRatio.png diff --git a/assets/character/DrRatio.png b/assets/character/DrRatio.png new file mode 100644 index 0000000000000000000000000000000000000000..1383b38a606a22088712497cea46cb917fb2a30c GIT binary patch literal 16887 zcmWk$cRbX882^%VR-F-N5qdPJ(LDv}Y?5d#1~_FPF04gNL;zjYz_;Lk}f=N15vX?`vzqxmKy zsmUwDaNL8p+4Je@iLdqFBQ{%BO?6pK-5`J-V@ot(60sv19@O_pHS5rfJ_Ty_{&!tx zag6Ra6=vW7AeCn=_D*G`CTt?uZ~Tuwr~^QX&B8G_{3e0Kk0CZ=M0g@h^~m;9i!?TfqP<`iXOi z@z!n^JaCaQSuO7jKiI*j?lLsS9Ejk*9TYBCww0Wz4ylMo-2&Ks&b@H}aQg!@27*vR z#8eRA13_cEjSbi5H(oiHH*^pLH;I4XmEOI}2F%yX(7it-RqliFX=uB%OAgCki;*8y zoi2?_-&%J6j0JrNlKW0@n~(y4DPhzE4Nk_K`CfI$)X7%+61 zg#N;+MoNVs_=pRV#slsE&%yO&#RDFb0L-jdw9W^hH3GP;^c(}#0)P)nz@GmiA1Q~J z`Da3EV5CbZ1NFi zj)Ag�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 literal 0 HcmV?d00001 diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 27e0773f2..312487a4a 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -361,6 +361,7 @@ "Clara", "DanHeng", "DanHengImbibitorLunae", + "DrRatio", "FuXuan", "Gepard", "Guinaifen", diff --git a/module/config/config_generated.py b/module/config/config_generated.py index df92ca4ce..f97ee62f2 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -53,7 +53,7 @@ class GeneratedConfig: # Group `DungeonSupport` DungeonSupport_Use = 'when_daily' # always_use, when_daily, do_not_use - DungeonSupport_Character = 'FirstCharacter' # FirstCharacter, Argenti, Arlan, Asta, Bailu, Blade, Bronya, Clara, DanHeng, DanHengImbibitorLunae, FuXuan, Gepard, Guinaifen, Hanya, Herta, Himeko, Hook, Huohuo, JingYuan, Jingliu, Kafka, Luka, Luocha, Lynx, March7th, Natasha, Pela, Qingque, RuanMei, Sampo, Seele, Serval, SilverWolf, Sushang, Tingyun, TopazNumby, TrailblazerDestruction, TrailblazerPreservation, Welt, Xueyi, Yanqing, Yukong + DungeonSupport_Character = 'FirstCharacter' # FirstCharacter, Argenti, Arlan, Asta, Bailu, Blade, Bronya, Clara, DanHeng, DanHengImbibitorLunae, DrRatio, FuXuan, Gepard, Guinaifen, Hanya, Herta, Himeko, Hook, Huohuo, JingYuan, Jingliu, Kafka, Luka, Luocha, Lynx, March7th, Natasha, Pela, Qingque, RuanMei, Sampo, Seele, Serval, SilverWolf, Sushang, Tingyun, TopazNumby, TrailblazerDestruction, TrailblazerPreservation, Welt, Xueyi, Yanqing, Yukong # Group `DungeonStorage` DungeonStorage_TrailblazePower = {} diff --git a/module/config/config_updater.py b/module/config/config_updater.py index 1eba29771..d23cb8e28 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -92,7 +92,7 @@ class ConfigGenerator: options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Echo_of_War]) # Insert characters from tasks.character.keywords import CharacterList - unsupported_characters = ["DrRatio"] + unsupported_characters = [] characters = [character.name for character in CharacterList.instances.values() if character.name not in unsupported_characters] option_add(keys='DungeonSupport.Character.option', options=characters) diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 3827d0f63..e61bff3c0 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -381,6 +381,7 @@ "Clara": "Clara", "DanHeng": "Dan Heng", "DanHengImbibitorLunae": "Dan Heng • Imbibitor Lunae", + "DrRatio": "Dr. Ratio", "FuXuan": "Fu Xuan", "Gepard": "Gepard", "Guinaifen": "Guinaifen", diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index e6a38f61e..3103b4e4c 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -381,6 +381,7 @@ "Clara": "Clara", "DanHeng": "Dan Heng", "DanHengImbibitorLunae": "Dan Heng - Imbibitor Lunae", + "DrRatio": "Dr. Ratio", "FuXuan": "Fu Xuan", "Gepard": "Gepard", "Guinaifen": "Guinaifen", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index d4efefcb2..641efc2b5 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -381,6 +381,7 @@ "Clara": "クラーラ", "DanHeng": "丹恒", "DanHengImbibitorLunae": "丹恒・飲月", + "DrRatio": "Dr.レイシオ", "FuXuan": "符玄", "Gepard": "ジェパード", "Guinaifen": "桂乃芬", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 7a8294222..78a748b21 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -381,6 +381,7 @@ "Clara": "克拉拉", "DanHeng": "丹恒", "DanHengImbibitorLunae": "丹恒•饮月", + "DrRatio": "真理医生", "FuXuan": "符玄", "Gepard": "杰帕德", "Guinaifen": "桂乃芬", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 93808715e..9fe990535 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -381,6 +381,7 @@ "Clara": "克拉拉", "DanHeng": "丹恆", "DanHengImbibitorLunae": "丹恆•飲月", + "DrRatio": "真理醫生", "FuXuan": "符玄", "Gepard": "傑帕德", "Guinaifen": "桂乃芬", From e84e564e8b855867a96fbd02faa1bcf4997222b1 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:00:34 +0800 Subject: [PATCH 06/65] Fix: Handle GET_REWARD while switching battle pass tabs --- tasks/battle_pass/battle_pass.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tasks/battle_pass/battle_pass.py b/tasks/battle_pass/battle_pass.py index b1c684c37..b5053dec6 100644 --- a/tasks/battle_pass/battle_pass.py +++ b/tasks/battle_pass/battle_pass.py @@ -20,7 +20,15 @@ from tasks.base.ui import UI from tasks.battle_pass.assets.assets_battle_pass import * from tasks.battle_pass.keywords import * -SWITCH_BATTLE_PASS_TAB = Switch('BattlePassTab', is_selector=True) + +class BattlePassTab(Switch): + def handle_additional(self, main: UI): + if main.handle_reward(): + return True + return False + + +SWITCH_BATTLE_PASS_TAB = BattlePassTab('BattlePassTab', is_selector=True) SWITCH_BATTLE_PASS_TAB.add_state( KEYWORD_BATTLE_PASS_TAB.Rewards, check_button=REWARDS_CHECK, From f101ca2af310e42a170dc055e30f3daf0d985f43 Mon Sep 17 00:00:00 2001 From: Hengyu Date: Sun, 28 Jan 2024 13:45:04 +0800 Subject: [PATCH 07/65] Fix: enter dungeon that is "Temporary Early Access" --- dev_tools/keyword_extract.py | 2 +- tasks/dungeon/keywords/dungeon_entrance.py | 13 +++++++++++-- tasks/dungeon/ui.py | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/dev_tools/keyword_extract.py b/dev_tools/keyword_extract.py index dd53f1a6a..a28fc07d6 100644 --- a/dev_tools/keyword_extract.py +++ b/dev_tools/keyword_extract.py @@ -703,7 +703,7 @@ class KeywordExtract: self.load_keywords(list(self.iter_guide())) self.write_keywords(keyword_class='DungeonList', output_file='./tasks/dungeon/keywords/dungeon.py', text_convert=dungeon_name) - self.load_keywords(['传送', '追踪']) + self.load_keywords(['进入', '传送', '追踪']) self.write_keywords(keyword_class='DungeonEntrance', output_file='./tasks/dungeon/keywords/dungeon_entrance.py') self.generate_shadow_with_characters() self.load_keywords(['奖励', '任务', ]) diff --git a/tasks/dungeon/keywords/dungeon_entrance.py b/tasks/dungeon/keywords/dungeon_entrance.py index 4a3905cca..45165e7fb 100644 --- a/tasks/dungeon/keywords/dungeon_entrance.py +++ b/tasks/dungeon/keywords/dungeon_entrance.py @@ -3,8 +3,17 @@ from .classes import DungeonEntrance # This file was auto-generated, do not modify it manually. To generate: # ``` python -m dev_tools.keyword_extract ``` -Teleport = DungeonEntrance( +Enter = DungeonEntrance( id=1, + name='Enter', + cn='进入', + cht='進入', + en='Enter', + jp='入る', + es='Entrar', +) +Teleport = DungeonEntrance( + id=2, name='Teleport', cn='传送', cht='傳送', @@ -13,7 +22,7 @@ Teleport = DungeonEntrance( es='Ir', ) Navigate = DungeonEntrance( - id=2, + id=3, name='Navigate', cn='追踪', cht='追蹤', diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index f6648dcd8..c6f7f9ec4 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -109,7 +109,7 @@ class DraggableDungeonList(DraggableList): # Replace dungeon.button with teleport self.teleports = list(split_and_pair_button_attr( DUNGEON_LIST.cur_buttons, - split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Teleport, + split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Teleport and x != KEYWORDS_DUNGEON_ENTRANCE.Enter, relative_area=(0, 0, 1280, 120) )) self.navigates = list(split_and_pair_button_attr( From a64ce168be7358bd74eb7996ea8a0d2852c70500 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sun, 28 Jan 2024 16:36:15 +0800 Subject: [PATCH 08/65] Fix: Catch FileNotFoundError while itering registry --- module/device/platform/emulator_windows.py | 53 +++++++++++++--------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/module/device/platform/emulator_windows.py b/module/device/platform/emulator_windows.py index a317ad4f5..379b7a7b3 100644 --- a/module/device/platform/emulator_windows.py +++ b/module/device/platform/emulator_windows.py @@ -330,8 +330,12 @@ class EmulatorManager(EmulatorManagerBase): path = r'Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist' # {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\xxx.exe regex_hash = re.compile(r'{.*}') - with winreg.OpenKey(winreg.HKEY_CURRENT_USER, path) as reg: - folders = list_key(reg) + try: + with winreg.OpenKey(winreg.HKEY_CURRENT_USER, path) as reg: + folders = list_key(reg) + except FileNotFoundError: + return + for folder in folders: try: with winreg.OpenKey(winreg.HKEY_CURRENT_USER, f'{path}\\{folder}\\Count') as reg: @@ -358,8 +362,11 @@ class EmulatorManager(EmulatorManagerBase): str: Path to emulator executable, may contains duplicate values """ path = r'Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache' - with winreg.OpenKey(winreg.HKEY_CURRENT_USER, path) as reg: - rows = list_reg(reg) + try: + with winreg.OpenKey(winreg.HKEY_CURRENT_USER, path) as reg: + rows = list_reg(reg) + except FileNotFoundError: + return regex = re.compile(r'(^.*\.exe)\.') for row in rows: @@ -425,24 +432,28 @@ class EmulatorManager(EmulatorManagerBase): 'MEmu', ] for path in known_uninstall_registry_path: - with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path) as reg: - for software in list_key(reg): - if software not in known_emulator_registry_name: - continue + try: + with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path) as reg: + software_list = list_key(reg) + except FileNotFoundError: + continue + for software in software_list: + if software not in known_emulator_registry_name: + continue + try: with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, f'{path}\\{software}') as software_reg: - try: - uninstall = winreg.QueryValueEx(software_reg, 'UninstallString')[0] - except FileNotFoundError: - continue - if not uninstall: - continue - # UninstallString is like: - # C:\Program Files\BlueStacks_nxt\BlueStacksUninstaller.exe -tmp - # "E:\ProgramFiles\Microvirt\MEmu\uninstall\uninstall.exe" -u - # Extract path in "" - res = re.search('"(.*?)"', uninstall) - uninstall = res.group(1) if res else uninstall - yield uninstall + uninstall = winreg.QueryValueEx(software_reg, 'UninstallString')[0] + except FileNotFoundError: + continue + if not uninstall: + continue + # UninstallString is like: + # C:\Program Files\BlueStacks_nxt\BlueStacksUninstaller.exe -tmp + # "E:\ProgramFiles\Microvirt\MEmu\uninstall\uninstall.exe" -u + # Extract path in "" + res = re.search('"(.*?)"', uninstall) + uninstall = res.group(1) if res else uninstall + yield uninstall @cached_property def all_emulators(self) -> t.List[Emulator]: From 5fb3182b246b007959dd1d991e2365e3dab7f139 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sun, 28 Jan 2024 18:26:34 +0800 Subject: [PATCH 09/65] Fix: Detect Huohuo by avatar (#289) --- assets/share/character/switch/Huohuo.png | Bin 0 -> 6641 bytes .../assets/assets_character_switch.py | 10 +++++++ tasks/character/switch.py | 25 +++++++++++++----- 3 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 assets/share/character/switch/Huohuo.png diff --git a/assets/share/character/switch/Huohuo.png b/assets/share/character/switch/Huohuo.png new file mode 100644 index 0000000000000000000000000000000000000000..75757d1dafc2d49f5790ab5934fd08894d8c28b7 GIT binary patch literal 6641 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 OcrResultButton | None: + def _iter_character_by_avatar(self) -> t.Iterable[OcrResultButton]: + """ + Detect characters that can't be found by OCR + """ dict_template = { KEYWORD_CHARACTER_LIST.TrailblazerDestruction: [ TrailblazerDestructionMale, @@ -86,17 +95,19 @@ class CharacterSwitch(UI): TrailblazerPreservationFemale, ], + KEYWORD_CHARACTER_LIST.Huohuo: [ + Huohuo, + ], } for character, templates in dict_template.items(): for template in templates: template.load_search(TRAILBLAZER_SEARCH.area) if template.match_template(self.device.image): - logger.info(f'Found trailblazer: {template}') + logger.info(f'Found avatar {template}') # Create a fake OcrResultButton object box = BoxedResult(box=template.button, text_img=None, ocr_text='', score=1.0) button = OcrResultButton(boxed_result=box, matched_keyword=character) - return button - return None + yield button def _update_current_character(self) -> list[int]: """ From 3ad402373babc1be69f8eb9b350daa358342e170 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 29 Jan 2024 21:36:37 +0800 Subject: [PATCH 10/65] Fix: Parse emulator index in from MuMu ArkNights version --- module/device/platform/emulator_base.py | 12 ++++++++---- module/device/platform/platform_windows.py | 4 ++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/module/device/platform/emulator_base.py b/module/device/platform/emulator_base.py index cdb475948..19262b083 100644 --- a/module/device/platform/emulator_base.py +++ b/module/device/platform/emulator_base.py @@ -83,8 +83,9 @@ class EmulatorInstanceBase: def MuMuPlayer12_id(self): """ Convert MuMu 12 instance name to instance id. - Example name: MuMuPlayer-12.0-3 - Example ID : 3 + Example names: + MuMuPlayer-12.0-3 + YXArkNights-12.0-1 Returns: int: Instance ID, or None if this is not a MuMu 12 instance @@ -92,8 +93,11 @@ class EmulatorInstanceBase: res = re.search(r'MuMuPlayer-12.0-(\d+)', self.name) if res: return int(res.group(1)) - else: - return None + res = re.search(r'YXArkNights-12.0-(\d+)', self.name) + if res: + return int(res.group(1)) + + return None class EmulatorBase: diff --git a/module/device/platform/platform_windows.py b/module/device/platform/platform_windows.py index 049015663..36a58fb25 100644 --- a/module/device/platform/platform_windows.py +++ b/module/device/platform/platform_windows.py @@ -91,6 +91,8 @@ class PlatformWindows(PlatformBase, EmulatorManager): self.execute(f'"{exe}" -m {instance.name}') elif instance == Emulator.MuMuPlayer12: # MuMuPlayer.exe -v 0 + if instance.MuMuPlayer12_id is None: + logger.warning(f'Cannot get MuMu instance index from name {instance.name}') self.execute(f'"{exe}" -v {instance.MuMuPlayer12_id}') elif instance == Emulator.NoxPlayerFamily: # Nox.exe -clone:Nox_1 @@ -142,6 +144,8 @@ class PlatformWindows(PlatformBase, EmulatorManager): # MuMu 12 has 2 processes: # E:\ProgramFiles\Netease\MuMuPlayer-12.0\shell\MuMuPlayer.exe -v 0 # "C:\Program Files\MuMuVMMVbox\Hypervisor\MuMuVMMHeadless.exe" --comment MuMuPlayer-12.0-0 --startvm xxx + if instance.MuMuPlayer12_id is None: + logger.warning(f'Cannot get MuMu instance index from name {instance.name}') self.kill_process_by_regex( rf'(' rf'MuMuVMMHeadless.exe.*--comment {instance.name}' From 3dcfa005ef457e7553f6db589e9fb5d837d28e6f Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 29 Jan 2024 23:15:01 +0800 Subject: [PATCH 11/65] Fix: Remove early access dungeons (#295) --- tasks/dungeon/ui.py | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index c6f7f9ec4..bfd92ae93 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -9,7 +9,7 @@ from module.base.utils import get_color from module.exception import ScriptError from module.logger import logger from module.ocr.ocr import Ocr, OcrResultButton -from module.ocr.utils import split_and_pair_button_attr +from module.ocr.utils import split_and_pair_button_attr, split_and_pair_buttons from module.ui.draggable_list import DraggableList from module.ui.switch import Switch from tasks.base.page import page_guide @@ -104,18 +104,47 @@ class DraggableDungeonList(DraggableList): teleports: list[OcrResultButton] = [] navigates: list[OcrResultButton] = [] - def load_rows(self, main: ModuleBase): + def load_rows(self, main: ModuleBase, allow_early_access=False): + """ + Args: + main: + allow_early_access: True to allow dungeons that are in temporarily early access during events + """ + relative_area = (0, 0, 1280, 120) super().load_rows(main=main) + + # Check early access dungeons + buttons = DUNGEON_LIST.cur_buttons.copy() + for name, button in split_and_pair_buttons( + DUNGEON_LIST.cur_buttons, + split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Enter, + relative_area=relative_area + ): + logger.warning(f'Early access dungeon: {name}') + buttons.remove(name) + buttons.remove(button) + + # Remove early access dungeons + if not allow_early_access: + DUNGEON_LIST.cur_buttons = buttons + # From super.load_rows(), re-calculate indexes + indexes = [self.keyword2index(row.matched_keyword) + for row in self.cur_buttons] + indexes = [index for index in indexes if index] + self.cur_min = min(indexes) + self.cur_max = max(indexes) + logger.attr(self.name, f'{self.cur_min} - {self.cur_max}') + # Replace dungeon.button with teleport self.teleports = list(split_and_pair_button_attr( DUNGEON_LIST.cur_buttons, split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Teleport and x != KEYWORDS_DUNGEON_ENTRANCE.Enter, - relative_area=(0, 0, 1280, 120) + relative_area=relative_area )) self.navigates = list(split_and_pair_button_attr( DUNGEON_LIST.cur_buttons, split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Navigate, - relative_area=(0, 0, 1280, 120) + relative_area=relative_area )) From c6205d683a214830147af4861597ba9dc8e8935e Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 29 Jan 2024 23:41:11 +0800 Subject: [PATCH 12/65] Opt: Do double events in today as possible when stamina exhausted --- tasks/dungeon/state.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/tasks/dungeon/state.py b/tasks/dungeon/state.py index 6cd691d3b..3f1865690 100644 --- a/tasks/dungeon/state.py +++ b/tasks/dungeon/state.py @@ -4,7 +4,7 @@ from module.base.base import ModuleBase from module.base.timer import Timer from module.base.utils import crop from module.config.stored.classes import now -from module.config.utils import DEFAULT_TIME +from module.config.utils import DEFAULT_TIME, get_server_next_monday_update, get_server_next_update from module.logger import logger from module.ocr.ocr import DigitCounter from tasks.base.ui import UI @@ -139,12 +139,37 @@ class DungeonState(UI): limit = 30 else: limit = 60 + + # Double event is not yet finished, do it today as possible + diff = get_server_next_update('04:00') - now() + if self.config.stored.DungeonDouble.relic > 0: + if diff < timedelta(hours=4): + # 4h recover 40 stamina, run double relic at today + logger.info(f'Just less than 4h til the next day, ' + f'double relic event is not yet finished, wait until 40') + limit = 40 + if self.config.stored.DungeonDouble.calyx > 0: + if diff < timedelta(hours=3): + logger.info(f'Just less than 3h til the next day, ' + f'double calyx event is not yet finished, wait until 10') + limit = 10 + elif diff < timedelta(hours=6): + logger.info(f'Just less than 6h til the next day, ' + f'double calyx event is not yet finished, wait until 30') + limit = 30 + # Recover 1 trailbaze power each 6 minutes current = self.config.stored.TrailblazePower.value cover = max(limit - current, 0) * 6 future = now() + timedelta(minutes=cover) logger.info(f'Currently has {current} need {cover} minutes to reach {limit}') + # Save stamina for the next week + next_monday = get_server_next_monday_update('04:00') + if next_monday - future < timedelta(hours=4): + logger.info(f'Approaching next monday, delay to {next_monday} instead') + future = next_monday + tasks = ['Dungeon', 'Weekly'] with self.config.multi_set(): for task in tasks: From cfde77f7ef2364182756be4fa0467afeb7cc442d Mon Sep 17 00:00:00 2001 From: Zero <98764734+X-Zero-L@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:10:15 +0800 Subject: [PATCH 13/65] Upd: Character (#304) --- assets/character/BlackSwan.png | Bin 0 -> 20168 bytes assets/character/Misha.png | Bin 0 -> 17759 bytes dev_tools/keyword_extract.py | 3 ++- module/config/config_updater.py | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 assets/character/BlackSwan.png create mode 100644 assets/character/Misha.png diff --git a/assets/character/BlackSwan.png b/assets/character/BlackSwan.png new file mode 100644 index 0000000000000000000000000000000000000000..05778533cc5ae1e4098de67e2da355ed2c08b033 GIT binary patch literal 20168 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 z z9`zjFrw{y76e8}MFA*?d!qY@8WHsd0p!**d(n1S@a4GT*wNl9q??vdpJj|HTF=#Ev z2`>JeInqEbji9IQl@%h-df8*E%0?E9ip>*Q;M2XH+gt+^jfY1z9Q(oBbR{!Tnd3IK zxYJa34ULSNTa3}S>-A(FBW8U{um)@}MvK})VSV?_R2|BlrUmu%;$Cc-tT=8B@%IKx z!cmYc8t#xYx43vEeKS~C_2C0;m|uxb`NwpytyarGAaqM-U@kxxSH7a46z z!dKp6?Tw#tA^+=(LnkMvibc1D#vU^y?&{C|wJ!0~U8@AigQZY?%KxS_xTszhUi^G0 z1C#7V!%;G5_^Jd9JHow0=Nz+l^&irvZ(j^O=4g~@Tf%s@`ZaQ~qp7B5Z=yu_NlDuC zCNXhwCDME`uipvl5?Y*8(t_I+6^`(1zD6AfB-%6zV465)w7uos4CZp*PR zZ=A2PsfH=AMujbjhMU8QgO9JOxqg}B_K5vN52t5+O1@>B%1!=fV*k(Hq0p<*(4XzE z9@x`Pt+_a?)AQ_;e^t!EeaH6ZCtixZObVo|CbWMk-L@{=@o{gL?9NW7xYt>MuV&7J zhi#IjC->uLKJ=ncmJjYK*m|7j&pbPuE5_gO3;h+|=Jt3i^UZeeMm^CHvQHV#kg^Jg z-c+#5ScQ0TrHuHJ{Enk;zFa0yEW0V`BAqcU`{5jR#^Ke|`Go0CY{bayU{}6dnb<#L z=cV!%6-ghLE}wJ_Myy`Rg;VHjOZ0!=Z2z$KtK<9B)z$HfhGnFwAT3r(P$>k2g`2!E8W0wS){?gRnPrKkxA&)y?Os+^Z#yN6 zS-=1J^Cvm#j7uk3966(P_3tWQigl%)Ibe?(1d-n8G2g@ihf_J zt&x=w9j@#r-sZA)vzbc)CXULAy~{MF@(OBYN-IJ_1BM)$xSjciM^jjtnVB@^$)!m4 z_Y@nt%C$CvojnX_3T62QWz!6bbvm(@I{y%lzVHEOq04^*uZS=ak;fY){`?K@$DWuG z95@!f1Ul6MZapOW!{_jtEZ7XT_Vm{UEqr3CwUebmOlr)0rQoJ&<+5G%rU6wHhOMF> z(lK7&(BQ**Xcs7PC-q{twdU*MWfWY`-meF?#t6eEh23wPt{Vf=c7EQtcs#{c)MhjO ztqp(n^71k$y5JEP7dJkxt@?L*TEE%U+|Y1#aS;t~Y-l(>J+)2{7ZU?_xN<6uNkyB| zC^M2_Ujnq_rB=U{0E|tLco>|7>~!NWV1*!EC&7ciJUJl&SN4l2Styvr%pTIwUC;JO z`QBWe8$1hXXlXFDL=2$~K#` zeCm^)&87{;k4cKl$}o)!u9H5Jg`?I9AuG>JOeO`@XO7`Hc(PjMy1#$_?(Zt51F|Kb z`?)dKYmNSj3KTtIFg315yY9&S?{%D~EK=?(MP#vop~d4cM=A(noZ`8p=W1wbx@&Y_ z>t|kNMTJ5UL(+Z<!~&EQV7AA{*fovcA~twfMwZjnxYa zs(4#d{UP+|YqFZA=Kc7s@^^C;XQu9P#FgWwxy^i{q7K9`sY-a ztDjnVn%p1x*w)I6Nu8I41{`p7W}F;hg`RKE;Gu-aoy)uAWUMdNI}2Kj!KU zN_|h+FCFgAGcQnJvTQmjPL<#;^d^2 z3_Ln&_?wzaF6s!dn8kZ990fP3BEIqyA7Y}a!meC8V-~IP`t7W!0 zjY;;ypB8R^Vr$b{g<8W;J=D;b`ggPOr%5~Xy%v`|aE9AhP zweUd@!`>{0e`r`O=wg5@-lwB;#g6PGH#w%gwIIx z)5NK*|Ne;! zY_#sSY`N!}vrRQe$eynxP6S(q(^K%Q7>K?^wl%TK$ayMgqx{G!lWi8Y{|wK3e@;oUV&^ ze!i|_?-6cbP!Lw)561?e#Ey@TZJar&6FaUZvQtx2{di2Xb8;r`0l?7UW^Z9<#~fPR z@#z!pk&T<%-qq_2 zy)HT5{325Z=R(6F7)qq`}wOD8A>dtr4uqU!p*@L{~2gKD~9^(9qD_+#J{r z{zmGwIXPrMGN|i9oB5Tf`|6h>xvp9SOp03ik^?=Fi5tyHkThsOaJKjvp=KXP)&i#>Yu zXv*<8j-}vphP*2uKN8UX1OMQ@BszeP6BUc+oEg!ebAbj*+jo9G8cK>x=&=IAeR6U# zKR+K?*17RMA&>f+d6Bq_N6@+NQ&0K~v&-v;B0LCYdeo z@O&e&sOUvRWXfNUkxJXLaeMcbIC)0QsJZ`6!;G)Sjvi$RN7nym!~8yaeM*Js&pPFK zfj65kc{*liRzw8_f7q)G4i3i0XJuyU$lX0%3GJ-m$n%orEzvDa@!|$A@r@K=#OlbY znUSHPq4CnaL`BKYGxoTOxAl~w}u$*nRKQ;sdG?{wMudJ(_Z zGL~m&Q&LcDJtCzQ>^}s7%uHY{8PL6|Zrv4gH=#y;Y|uX2;0bMZnvraD;b@syCjG`9 zv3J>HRofYqt^>C+0&l0m_&BiLxT-YGENNYr{ocqW9z_8rN|-%6;YphAh}-gK4{Lw_ zvws_dg*QiT-BvO(?%T7qECpf>ZEe9vjSB<>1b(+)E!xd_C};S3!HGtv9Nu51r=@Lc zYYANMO-!myWq=_fAP6N0vou_~1OBvsSa@ryH>K7`2aMm$WO~WK^Nm5I;>#YZo{gWY zt8X5j!I0VgFywE7?yuMsL%hy`CnGm}Q3z~sI^{AW;HU(I^<$@?(Sk0eJ%QHNr%+%` z$Ax3Pqi0S*8<#JTXdmWi;;=~ZAX?N~K+;>Q8K0=I>a9l)XBxLEY(8-s@M`iVLk)RN zb#(Y}Wtsb^{s*0b$IhXyXZ@+CgtKqnXjt7Vt$>NdWABE3Y|p0*1v9xzv ze7hxZy3{=Swu>-0h>2oc)aqD2ZSp0LROsJ^rwM$LR^RK|%*|;Lh}nP{0GV`}dPMj7 zuVMh3{7_Xe*BKhhAU40SP{XqOi7rNqRb`2TdLID}x^;nApzFwG@`ebQY zSu(9Cf0Kwh>>#AHqJo@{tt7I`jDR%ZG@1+@@c^GeoJyq#iz!QElV z__yBP-isbe3xG2g25y!|5|F*P-g+h-@bA~r0&&v%pR^y&LIiy*plCe7LyyJElXQKI znCR{8ow%#{xq2`sPe(Q6JEBX+($SHqGM3Nx>g?bZizfef;DOJR&a`SV^uRk<8gcFs z+E9-_*)yN>vrmDe1ZN!^wlirG6|}fGh@55~nFMwX{-HRCJvEygOh+ zA(Nv~hIdyMjvF4sS3R?ZRBic7K>60Zh8W2?s9K`aU|coltg-!C9uQkyR!YRg1*H?G<|@PLrjUU%uA z-IFw%LQ&{xnR%(NRlC+pM?x%l=4HK6f=_aa6zi1JL2<-IGn zlgXnJ7eIq=M|$f|Y-IW_{BfPcz0Ym>C2yLDW+r|`;Jo2d>IMUv1oqp@m1d9i z-t(>dG11Y?0?oqJZFKTuV`~T9YvDA)u4+k|&Mq$P=Vym^Dy6(Gs#0U86O z|NFATMPQ_vNv;>so8m=}3xXQPIAL&fie3GHXjuXk5gv$`s1#thxVU5&7M7P!9NG*y zOBa3)+r9GCsuD`HhoJYm?9rCEvhaxX)YRq9%el~?jSK^CSm@sAi@oEf`$SQw3NEkx zRapf>_KbMz$Arjrxn?!ySHpJq6q;)d!E`)sf7GA)C~j(2GxTDTEcoi>u-)MROX2qJ zu4^HJmYzP-wz;ZmxY1=&uySe>P$@;xfs&+<8K^*i5-P_ySVHu_V~rb#CY(l z!sGy9wHKo&*Qi`{#)kZM=6&`Xe~gW#?1%w-$DL-tkaK!ciLP(X(51nc3&z9_!DF?< zu}DlARARk)A6V#Gyf@MlCr=clxp|r_>G5;cqtDz~kea4mM<=TQ4wQ2k3D%P$? z?LgD#RuZQwzvB?)9`qbufe=4RYi<@o56TY+9s&#Lx8KdLjjWaHFCks|`H4cmY)#Ll zZ{O^XC%-uAxT~aDAi?%&_~c#YpWW*X9?VvWa{Zi*FK;@{+27HdB`_)UW}IBS&7jem zKi1%Q|ExWb&i_MGQ;_e@cSrN#+Wd-l*lK|>`2WuRcu07G2@W}p)=DN!_?tc*wSjl6NpMq`;=H62=vD~+ zNX|t8TNngIQdWVk)G1F$PR@EF(cKM4sYWt@P{?W?4=3kYhueZLfA+6D%;9;`&98x1 zqqke3*EJ<08t^9~Tz(c77Phwky&3>wFw;zfi2@vP;mN;(WxkB5V}f^3tSS@Z#Y!u| z;L2AqqSFR`jrzFN+dB;*w02g;H~L^Mpzd`_a8W<^0sE}lti6tq0e8WvXLxw{*!I4)!zk9H9PETh zN9%fhH{c|Yr_kdUsr9xbbHg`ant*IfizS?mMy__<5*6z6x zztsY??wSD}lqVG;#a@r zIW`18{9H|QQ364w4#1aTfKkNZB7beq)q`>!L-x@8*|X4HV7>+X&epFyK3h-r8u8m* zJU^P$R4N|VDL*>UT&~<&)vv``bnXdj(xurqKgGdZB?>Rkc81<^>9_*_WC|$pQU~T& z1N$_LXq4#AkMgG+930V>YT%)v5#4ax)1#oE&7=aptn+GvXX`kye>*5J@Y~&hwW#~b zVQnl0fj@tZ&ah_?Maq`zQa_Xq{?(s4UbMTmCdeSA^sAH^?o0dyxHrn*u#QCtU|3%> z8uV8BVXbSqEkos+pHZLr>jQ2CPJ^SL1*|XDk9HVwySlk)9xqEio()=w>;o0?{L6K+ z^L=*Qx4T6}fmM{VyEHZJkNNnD9QiS{a-?`lVRCRQ!8nf?FK+B|^P1a#8*|q|QW1Cx zGO%dLg@*4*wnn^TxyKg;#b$11L7Wdn?G_qo00EWKIc&VAutqY>Wo9njnWD_Z^k6W7 zSDN>6{=ZTu1I^BptL|=jzZv@X(u?_%C&t{;! z*4BL0acEI!IEDn(kH@Pn(3WUr@ZQ^Pi!{nhzfkEqTLs>XQj&Z@F11P!O4G4jvK> zYd`;;`=kC&7wf$$&t?h!Kw4a}-qT?%)kp}0P7;!Qt7>WrXY=o(e&ib0 z8VWA7JXVjCp{AuZUDV*>;Q@8pUJ$Sl&cQc$-@bRBA7WnOh5GyZgHf`k{e(IqrTZ;e zd3;lIEmd+~=%F=P-?|4$`vKjKBN_$c%lZucKi5IwO9sKntE1faPLY zts><4-&;e$+1X_=8$!RXiywto)q9sgy}cb5;?J%sYi>_h&So!97DLzzM;}UD#5CvO z%L**3^Qx<+p>63>sDHs^hm_x!f}kQ504_Kyx2+gHQby09XTBA6y}_>n&0l)$@|jnL z%g;w@`AD3O`D^@?i3}$)#)cUsH<7(_yfes~AQF~Po7C~=Vqs9uY^eaFEvsjwkhl2j zR|F4NVWr8-J#o*@4~jT50G15a?Y8c9jE3GErYg&)y~82s{g1G127&(~#Hqn}P3&H2 zq`w5nYORZ;Pw14}7*UmY-`-qrcm@EH>gy|1I2yz8?b*%7Gt%wFb6_F^6;%D<1HkpB z-1iG!6pw#F#O&~`w$oRd=;xb=7oHEfX{f8;d)d?6EIN7!BoM5$v9S^5W!PX$_uv6x zR*lx=+MY|%jOd5r@`}KfkkflaQHGpU9q%d}Un|P_DOKr*ZFqa1 zDqR$YfJ18XxZ` zEh7wz0;Fp2zV1ny%Ty$2Fij2smRI#;FRyB5D|P4(fW_Ts1@=SE_yyU@HkXgd++kyj zn-d#OD_;;nFDlE*%ETqbfYFDios5sys^cou;<@BSd>G_q4G}Yuhml7c!ent}U`A7V zMwxuQzrc-2>RT`R=~ww4*A1gkUv}PPdTH!7p>CE zG{*)paT6L^+9A98T0_om>Swp}k3g#D1_&$fJ~}_z&=rmPs>EW3wssIF@`wV!3~R6l zSRG_nw=Tkx;^;rovUNrZ+Me0hiHhsTUc^DCyZ1~h^eZL1B5`ooM*ddCzU*7CmZ&c#F-c?#J(26>?_@daKIu8@`OZQ zEAkibg>%E0VBv5G6~=oP#W_4RnlIjWg$r4DSe~aU(X03g6^7oNCk^S=8me_KNQ^$B z09i#fR*r^aW2?f*l|_=C=9^?PsZeRn_>>3}L+)-u zlUOh$g|Nas7&1l~79Q0tdP;lJ_3(zbeAj@o#MCVbJa*MA60$*RP`C1@+s$t``kkY zkkj67$4`D@5%KYW0tLf`VN+Y(840MLYja;i!Etesqlak&HcByq^`B?w=8R_9`Fl-g zdJsVc_07!#^6izCPGDrWw6t{e{L_$SE_StcDd%ATLq5@Y-A2-7Kj7I|Iao8jVMrq5 z&ry6GxJ;Og?gR~sr7*Zo-(j=GoRbQm%%GslUpDunMuy3sc~GT)4dyRZc*^U|7T5MRBTg#e znLOYQIUiM4a5@OWu-Qd=&pNNmCV{O+!MAyQ!GY<>R$~Se*8Su@>jPR0tug}Q759>b z$;L_u3gW_RIR}q(KsH?z4JX2d;0z2!Dt%gsxl|6^nORv+%hN3p$AM-rA#w56#>QU6 zD=leEFqnyw#CL%UMTvru->ETs{v6|L$suvaY-TBQuVr_t(ka>!6fhtzlpcn7pYAT9 ze*~{I<=j-8wZfS#->atmiXtV#!h&$uOkBQ^?3>7XZ!JgjdlhK`{Dy|3Ynj5wzVeiR z&voknZ||PMSLJwl#=hi-(jgZ|b{~x@r${DWDi+6=194)*-`w8LrSkpfPb;xWdiFbO z>S1vH?{E~>omHODy78r@axg~9Fv+qhXaycm&3rehWq^grfFKx%7A5L0*L?sP5XT&5 z4-i@&`f_?bm%&k4SqToUo}ONp_Cn)RMScl6RW^NFG@KGd^8#toCt{?;9TAEUAsQ~n zcJvtw$=Y$wibON4Lr|X=N{Jb*#V{gDfWn79hTZ&8lFp&M0L&?sk)n6DdRlFAku{_9 zw0&>bO7aDVNad2=b9C08R z?O6wpH3$hZ-xK7Ycn}9AV4;K;ma!nem5`(ExFsNf1r_q8L(S9PISbL$nGe=|+x!+q zeBZNq@qWjCc1`dGhovMj^u}Sn{An2=-w`sCpWN^5OSm~X5nBhJF8Nhf5Rp@$&>wU8 zsHD2qS^~C^>{KtM&j&Pldo53UtByGqwe>RKZ?`J8S~6_|3i?Drk-_Nc(E+wMKhKDk zFV-Fj07I*$rlwRO4@lo|6Q_E#n?FP#v?!za8i8}&)<&E5`D6Mw#O3wMZ3rX$E=+)& z0nN|@Rw-!1v_6@M9_(AZXw4a2FOc=TxytRB(b3b>PAkCRNeyjyl7)ERc7!%F zdue695?W8`5bAIT-yS}@(1GJ(TVUZ)!XF|2O?)}j)60ONWf;~B_0@4VK`UQox3z!T zsomU-%(@rx-}2;=dF2%8_N4{iEr}jx%k_>?cSAhCiW_&8IrH25xZ0oCX zi^9Rs5^C4XR7NqPKb92}S5{yy^SsVFhhDv(+3MIMMoNszA;7vyQlpwwAz4KK(b3Vb zq$NP!9VI3l8$4URKsMSV=z6x+dbC4I9mbY52mppwx^shZyMJv2oZ|ggQE(S?O3y!} z4BOpq>;<2P>`nfz<{?iK0m~qSvN8ZMuBv?l>oiPpKb&?2MkOX4wk3J%8R-aLu?dR7dA39^4a!SnEv8h*3EwS=!=v34`GSw zBC{1TL}X+7v-jM?u0Na(D!oSUs2?FU`8LoH7BeH&qd0jQo&8cKAEuzejk@ZO#sTWu zThY;GHGf44aN*?N?sn|p#%sK|Z0h{CDwo~dd=7?9Hp)`XUIgan^iwXheZw|ja-o~$ zWoS4M1ltO%R4-fo_I7vFqkBLwdHr(%21F6%CIwZnSI$TL0I4>c0Wmb7>`<_kQ#o-f z6O)C?nhqi+LRKPJj9Xh)Bsj85J~JRy?&{9FJdH0xMqq_jjD7a(Bgz1H5lQP{lK}d% zz3mLgopNk2<;Hk6yZ;86`Jzic81{_Moh}45^~KP0saIgoP$4>2?BXTq0_zrF^a4>V z{&I);nU0f&^*+B0)eY&(dg&lwiIJ~|d4%!duG)PPt{5pfoGA!C%I|qV(;})zqVgq7 z*CE{VotfB$%)|KU&yTP)Q{OW?o3fvUDW(4X+~4dGO}BL1bN^Y;kGnlRiN76}r^2|k zvpojLQm8_2rGrl^crD&|;xepaGxkPlqIqo|`2J^vx&yP|r@*%2^w2<3zJ4@B?mx;$ z2!)}bk$nCv?BdVEiX$5x zeiyz$CEwualG;%5$%rq}M(CB((|4HAlUJ9?Ni#yi9VZWON_7~dZ(~9kiyTU{IMIrw zAUr!XT17@m%1klf*_D9Wp+bNX4!R&k6z(t){QDMwU zl{>88ZtfJ`uxg<#}P4%xPD^-B)Kll_+qrp)sOz&RitvptEx8ABjTn*FNz zcV(&xk#LGjvTeG#Evp`8Q%u5LJV81WgE*PR!~eLw|A3P{h+Pt#G}$|wZ7{m%ds-A& z?7CnynVt=Ykl{ns1qX9|%Tn(jD$}W9^+)ZC5)-lBh@d|S zbgv5wle=3c{~lTNeYQ2K82W$0bKX6>n*99H!>h4>6ThujZr3VnKBR+w{^Y zYRtp2^OLWhG~vKx0i8@3KxC+v@C2`6jbNn?qF@Y=H3@RyG(;5(J=VAbLI?(1US3{Z z?SDO+omu|@P;bua^0x(;;h&sls=p93psTmQ#QNTI7jVOE>dWot(v|NWS667QDDjCq z*$&$JY+cpyE*gGB@=g1MAPYw~JabBc1wF`z?Ed|`wA8_MRY&#V&5y1gEA6Qto4nSITN?UUl@B*`a zlviJmL1aI8bAmlB(!T9Hb;bY9GV4W0p@0qw*6Z=*H9K;}~^jH3jZDc<`-J>@9G4qpCg{=x@Lu_%`0Mc9j z<{j;3d-Sn79mB7~;7=j8^^^$J4mFd{O-=VVUGltmzJQEvbuJ$CMaBZ@zuHg{kY_KK zt!4+nt7n~)jl6*#9uh(V)n{sK3<$rp@Am7h3()hyg^`7$S#eMZ_Bz1KEz340CUp8) z!0ZdhZFGro&4FFFQmRG;>=Y=T+%7z$ziD+SjvWc1p)x7*EG z|GmRuj)USMe(5&_&xVB6B&Vo$$~PpH&##UWsw=`Vk1M%;d(OBH;JV$Xs{M7Ikm;oN zyX&X#JzjHeN*^mY_uPwK!n&>lP4ztH%F80oQJQRsg{g|T{Qd}oq}7t`X%zAt+u{@ z*}p~4!|pz`RSu=>SJ5sw>b>@2opH_W)p+PdS!m1Y&E5ZR@|{$JwUCnE64pb!_Y|~$ zGWcBQZ#CbLk?tVw+YxW-RQ@#mOBiQCRdP^5q#{F zbJ4p=gw}$hd0|&FkAJ8!tD__We-CA+{G)u?L+~(o%;Pg#K=O}|kS_D0jdx>izB8jRu( zcH1?3ZEr8~AKtz@{|E?=bl#qZUfy3h!|&D+c|wfxzc|_&l{{U{?ex#nxo8T#Y$B67 zTRjptP@D8t%hw?yf5Jp@N_XCWu-=CgpsStE{0XF8MneydSftNYRItG!R*`pyQzO-w3HHbO2>6s*dw&+2wOx=5u4(>pt>Bz^D!^u zq1wp2f90dgr+%SFt@#~$nDV2aFM0SYJ6c*=xCiBD_$HsViB&03aOpL;6oXZsmFmkr z;OE!+6MutR@3p?TSu9a3_P9DD?8QCALXB16BNS~2iFO~(`n~ULsu{?nbNky(P?|Gr zS3c$}7-2f|tK<4nO=qx*-qdb2)`Kl&OL^De zxXoJ92RFjDIxjXWxwIE%XQ33S+pEJgE8ucmtX)b2Hh_{&id#>g(68JOAw~Yp&dxUO z0xN3iI(;6xajfy*uxt~e9xcOVlh)zkBAAl8d$?Gs;VugxwKr~mwf>X`ROk}jo;ptW z%EGP zx3|RgQT@YWR%G>{Nqj+@9=y07;hRBrpvF2v#E_7MBs2UxJP|KYpw8P4f+z_ zWn|+WYw*|C>^K}0$RgfKW0%!y3>K|E*;#Hk>GcDnJ#iv@!Y(K0!vn{@#l(&5xhEho zb!bv!nQ%Ki?$*1(z2M6HN(CtaOEoBFPRf_^3b40VwhG=m>wcoyadSQ@{YkIN;0aY! z0$92Z0PZvHrX9b$sa>8~;3;;%-;ykZHNy}d?0a3_;KoRSWNVP8AM2Q9f(wCx{eJfBnV(scekHiL%E~P0Gk|9+aBaW_^Law8 z)%a6Ng=z3#0^suI^?+QU+2P1k5d9tB}Q`f8E~?vz`tK9D|m!9G&2LqIWp-hUWat=ZoLGie#@n0u)Li8EE~!6 z9b197%Hfj3$%L!S-{-=6Qd~|KpYI#uznu4T&Ldos^e=m;wTs<&tCY?*H#bK#V)!GX?!H{zn|Eu8KQ~S{72|a#6d9%J*iPn=KxP6~$>wq_i7L)&(wC#~*I#vx-`d zV_hko$oY_&iQh9-bF6{1x}L1Budh`2Y*g>-NnZYVXewlj^ntLohsH?^0-_3^ap^Yow^cJh@bFphFsdMAEMVJ1`- zUz)a*p~>==hGu!Q|6qNzuWG#yB_!lIPkdu%5N~korOL|j%%%(5#kX=xTUT2fwk9%r zF7|$AbM0sbyJD|s&@Kyns!V5XEsQmv8(E9Iyzt79`%|C%<88#D1|~{a1*HZU0<_rGvpo5tV2~d8Nkih} zub=Rm`L~tImlM36XI=D-<>-kZUdtT^!N2^T@#E1t0vLtTQfQ3G%UfTWC2h|1K`7sf zEAF!YGd#TGhUPWM(TCtRsa?!bhov2z-SwB_>NipGHXr_cZue_9BdnJM{U)lgqx-A* zQGl*81eEiNN?@JIb_|9%c?tt^=1L9vv(@*!N+GaiFb1c~tYJt9d_qNcd0t-8iJ5XY zTmlurn7+uo<3wEkWJX$xPJr=F1WB-1$QuMihCfnAtNM1C*BSv34R%qpQBOjV*)<;i z7Rzmp@i>1^Ngr|tX$@OZFcJ7v-8z&mZ*aHu(x^TPsM;FbhCcwDU41)6y*GK`{Q+$T zDTKFJt2XZuqy$Om63JTkDZyJ-6Q7X5xhV>fDYuuFYH3wI}uC1N1 z^gQuM?-22C1{A3%GO^Ck^C29ZJ!@5@DlDDkAsgk0?gw5B3yO!6!ls`<4tE^SZO<-Q zDlMR?vBYRYO_zK^L)Vhe?UIs`66-&vG8X;tX@ysi47)$4)wS@!iS2-r&vb7Nz$W?# zIhrSeuz49wTKg7XyWW*6b(1+43h4s8#oZD|YRaMezK?_u*JPgMJ+$xy6(Zgau?>wd zhpsfg_kh`K;S3hKnGxyTMK7b=UYQf_4n4R*IVUo+xTwWFj}|fQ1*pNYqWY0JAxn~V zeZVVL0)?6)>=22#>W(IRc+Csrc=h}$SRfBWnTZh|W3t-WS)sP#F|=|$8)`^2>Y-F8 z^=Z$b?CjK3828n=>y-UPgI7wIW4V`#S98MG_0eRDL`VASn022Sgrje8WOtHz=snCo z2X*R?m_68rzcRKh2P6KqtIMoovLNIyY)(g>b}iWRO|FNa+r%DVj#fn*%-FRd^9qNj zB3qAYXw`B{yBtS-nj4}}#WXX}`86q>b^NJ1)1@&$-dXGFffQdWkmQv0G=(s=me7!~ zC5W-SDae3LNmAn^kH<4Mlg1NPzktzKv9xOXWLS)>(z(~i+ndu?x2)Zup)66<^HNdS zK^hK?(+GswotU_|(DbbiUoUIzDSVJW_03!!fsSqQt=lYf!7|aBk`vR@Y8XdIr)MXE z82R)bd3!rhUK^|2_2p@CeNEcXIn00asp=kwWkv4+=f>&p6T)K>|LZ;8&DhwS4Hp0l z$!jNVwp*8Z!9{%HsInc}OMnopnd}CSZlv>tS)Ba5)VE8;6^6Pi9kwU;zEVuFw)DS! z`fp85Q2ciHYry9S4_&t;?#7jSX4@z;CDz5Ac<;p3t8MOEfYx2$ENpC4N1MMHqK9R& z{3*#{K=_l9ZiNrL%@Jh&V9CP8N=ddno%1WBr|gy2H*cL6Zm|Jzc<4Q;DuJqsow3+GYIJI8wHc9nPvboyvI6<9a0g|3@OWKrIw=6V0ce1 z0M5L9H*!NmtCUsnOeTYjWL*85bKw>1P3=+_{7PP!TV+00=BF_xnz5I)@?6WStNVW> zfSq)+8So99f?gSfyK?Kj`}j>2?BX8I+S-*&8}qn8!09sRFGSCt_37+J(dYgRzy5dy zkdGXecUV{z#W&^Yb2b?qb&mhBNCM#+ zBWm{qf;YO{-%S3(&-PncHo2mR9~WRG>6eBS^2AwKN|C4|x({2&{gacM-I>lLnA=E; zA5NaXzjSXxyRWRRnm+^4QC<4NkgVImeggA-ES9XCt|6F139bozf~?C13giGY{>*k70Vf-0$XAErfWW{ezkDr0R*!eO6ALstvv?y%o%Yk7S_=hOLei5gD?H(L7d})`lAq zG#GiWNg5$tUYu>hl9oD()vM z`f*A&A;7(;gtr!{W>dBx(As^SogQUz+wi@TrUXe9j3=>eYWIL21Q2~U8`u&J=+Aa% zODidJG$-;hxO9PI!a&yzq$}+DbT&0Egco^$CR2B9)L8{NwWUNA{y@OX!sLW;KG`|)|EnCm^Z)<= literal 0 HcmV?d00001 diff --git a/assets/character/Misha.png b/assets/character/Misha.png new file mode 100644 index 0000000000000000000000000000000000000000..d12010ad1847ee380b95854d170bb42e2415b087 GIT binary patch literal 17759 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 R)tLYQ002ovPDHLkV1hCuy-)xE literal 0 HcmV?d00001 diff --git a/dev_tools/keyword_extract.py b/dev_tools/keyword_extract.py index a28fc07d6..64e1191a1 100644 --- a/dev_tools/keyword_extract.py +++ b/dev_tools/keyword_extract.py @@ -123,6 +123,7 @@ def replace_templates(text: str) -> str: text = re.sub(r'#4', '1', text) text = re.sub(r'', '', text) text = re.sub(r'', '', text) + text = re.sub(r'{.*?}', '', text) return text @@ -388,7 +389,7 @@ class KeywordExtract: gen.ObjectAttr(key='name', value=name) for lang in UI_LANGUAGES: character_names = ' / '.join([ - self.find_keyword(c[0], lang)[1] + replace_templates(self.find_keyword(c[0], lang)[1]) for c in characters ]) damage_type = self.find_keyword(characters[0][1], lang)[1] diff --git a/module/config/config_updater.py b/module/config/config_updater.py index d23cb8e28..3267a1baa 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -92,7 +92,7 @@ class ConfigGenerator: options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Echo_of_War]) # Insert characters from tasks.character.keywords import CharacterList - unsupported_characters = [] + unsupported_characters = ['Sparkle'] characters = [character.name for character in CharacterList.instances.values() if character.name not in unsupported_characters] option_add(keys='DungeonSupport.Character.option', options=characters) From f374e8fa69be12039806f28902d80d8886a15eed Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 15 Jan 2024 02:47:53 +0800 Subject: [PATCH 14/65] Fix: Copy raw attributes of the first frame to all --- dev_tools/button_extract.py | 36 +++++++++++++++++--------- module/exception.py | 7 +++++ tasks/base/assets/assets_base_popup.py | 2 +- tasks/map/minimap/minimap.py | 4 +-- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/dev_tools/button_extract.py b/dev_tools/button_extract.py index 0a928e29b..a45325055 100644 --- a/dev_tools/button_extract.py +++ b/dev_tools/button_extract.py @@ -108,6 +108,11 @@ class DataAssets: color: t.Tuple[int, int, int] = () button: t.Tuple[int, int, int, int] = () + has_raw_area = False + has_raw_search = False + has_raw_color = False + has_raw_button = False + @staticmethod def area_to_search(area): area = area_pad(area, pad=-20) @@ -131,12 +136,16 @@ class DataAssets: self.button = image.bbox elif image.attr == 'AREA': self.area = image.bbox + self.has_raw_area = True elif image.attr == 'SEARCH': self.search = image.bbox + self.has_raw_search = True elif image.attr == 'COLOR': self.color = image.mean + self.has_raw_color = True elif image.attr == 'BUTTON': self.button = image.bbox + self.has_raw_button = True else: logger.warning(f'Trying to load an image with unknown attribute: {image}') @@ -182,19 +191,22 @@ def iter_assets(): # Set `search` for path, frames in deep_iter(data, depth=3): print(path, frames) - # If `search` attribute is set in the first frame, apply to all - first = frames[1] - if first.search: - for frame in frames.values(): + for frame in frames.values(): + # Generate `search` from `area` + if not frame.has_raw_search: + frame.search = DataAssets.area_to_search(frame.area) + # If an attribute is set in the first frame, apply to all + first: DataAssets = frames[1] + for frame in frames.values(): + # frame: DataAssets = frame + if not frame.has_raw_area and first.has_raw_area: + frame.area = first.area + if not frame.has_raw_search and first.has_raw_search: frame.search = first.search - else: - for frame in frames.values(): - if frame.search: - # Follow frame specific `search` - pass - else: - # Generate `search` from `area` - frame.search = DataAssets.area_to_search(frame.area) + if not frame.has_raw_color and first.has_raw_color: + frame.color = first.color + if not frame.has_raw_button and first.has_raw_button: + frame.button = first.button return data diff --git a/module/exception.py b/module/exception.py index e9bf713c6..2d027bb99 100644 --- a/module/exception.py +++ b/module/exception.py @@ -29,6 +29,13 @@ class GamePageUnknownError(Exception): pass +class TaskError(Exception): + # An error occurred in task, + # task itself should have error handled before raising TaskError, + # then task will be re-scheduled + pass + + class RequestHumanTakeover(Exception): # Request human takeover # Alas is unable to handle such error, probably because of wrong settings. diff --git a/tasks/base/assets/assets_base_popup.py b/tasks/base/assets/assets_base_popup.py index 10967f3db..8dd647200 100644 --- a/tasks/base/assets/assets_base_popup.py +++ b/tasks/base/assets/assets_base_popup.py @@ -62,7 +62,7 @@ GET_REWARD = ButtonWrapper( area=(625, 144, 655, 168), search=(605, 124, 675, 188), color=(226, 0, 0), - button=(625, 144, 655, 168), + button=(741, 495, 1071, 644), ), ], ) diff --git a/tasks/map/minimap/minimap.py b/tasks/map/minimap/minimap.py index 86fd52f2f..ce6a78c16 100644 --- a/tasks/map/minimap/minimap.py +++ b/tasks/map/minimap/minimap.py @@ -438,13 +438,13 @@ if __name__ == '__main__': # MapResource.SRCMAP = '../srcmap/srcmap' self = Minimap() # Set plane, assume starting from Jarilo_AdministrativeDistrict - self.set_plane('Jarilo_BackwaterPass', floor='F1') + self.set_plane('Jarilo_SilvermaneGuardRestrictedZone', floor='F1') ui = UI('src') ui.device.disable_stuck_detection() # Set starter point. Starter point will be calculated if it's missing but may contain errors. # With starter point set, position is only searched around starter point and new position becomes new starter point. - # self.init_position((337, 480)) + self.init_position((227.7, 425.5), locked=True) while 1: ui.device.screenshot() self.update(ui.device.image) From d2fad6bd450b965ae14efe37d6a4716e4abbf655 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:13:00 +0800 Subject: [PATCH 15/65] Fix: Combat auto on cloud game --- tasks/combat/state.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tasks/combat/state.py b/tasks/combat/state.py index 9c21b3251..ed11c418f 100644 --- a/tasks/combat/state.py +++ b/tasks/combat/state.py @@ -54,6 +54,7 @@ class CombatState(UI): def combat_state_reset(self): self._combat_auto_checked = False self._combat_2x_checked = False + self._combat_click_interval.clear() def handle_combat_state(self, auto=True, speed_2x=True): """ @@ -65,6 +66,10 @@ class CombatState(UI): if self._combat_auto_checked and self._combat_2x_checked: return False if not self.is_combat_executing(): + if not self._combat_auto_checked and auto: + if self._combat_click_interval.started() and not self._combat_click_interval.reached(): + logger.info('Combat on going, _combat_auto_checked') + self._combat_auto_checked = True return False if not self._combat_2x_checked: From 6e7fd4eff934e3c961605f28e70e6db0807de317 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 15 Jan 2024 04:10:49 +0800 Subject: [PATCH 16/65] Upd: Battle pass tabs --- .../battle_pass/PERIOD_MISSION_CLICK.png | Bin 25099 -> 28384 bytes .../share/battle_pass/WEEK_MISSION_CLICK.png | Bin 24353 -> 29730 bytes .../battle_pass/assets/assets_battle_pass.py | 16 ++++++++-------- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/assets/share/battle_pass/PERIOD_MISSION_CLICK.png b/assets/share/battle_pass/PERIOD_MISSION_CLICK.png index 5d3af178d79ccb3cbfbf06237f93bafa6f7e6b44..76961d99f52975b9e3658f5a672d542bf4a924b0 100644 GIT binary patch delta 22702 zcmXtf2|QHm|9|(^jcy5Liz1UqS&}XLl@VEzWk?J~c1G5b?NrJx7g@&=S;v;08B4My z`!XiR*s?P-_Q5doKko1QKQFJBGv_?#InVh#pXal@Kkp~1{f`;qA77jP241o}f~uSN zO{^ay>u=&;PaiZ>o)tS&5)QpDG80*3j7~d#=6ieUG>>}ZqiSd>e|L@y?|8i3xb&VS zF}15UFl#eIiQ2H2NLJ=2q+NM*!}yZZ&B#lSBK|njdf`u@!5>BJyvym23ocX3(7Vml z*omc`l{eQT!;gY9`#M*GoXyVT%9?1e_luFG$cQS#^Q5y?&(E{|30S#*(%o2{2pDiL zMl)TG8{{C<)s6-j*zl)%5C}h1sL;M=wFZqAMoK?I@QW3rBT(4lB6N5?*3T2^g8=tgaA#0w&RG{uzQmi3W(q03+TrEF|lcU5A7Z?j~RjLl{nFp2aru=wF zWVi)SdVIL{S65)Hd8D!=DE5t+}!nb zBYL5Pcd~=1Qt$jVpPl`j$E!aVb7~zZs&vg$;31g>e7osaIvF{59TN3r(VVZ)+3^c8 z$Kh-Q!sB0y#?~u2?EPImzfH56fx0eu<68;;#j9O^hkOxNC45~z;_i3Y?5=BJ zK`$w9AGD>S>hK#T)%;Lv`2DOZgKloO5&CYl+u{f%Rr2*)5pMEdegT&XDA_?tlFH!g zH-72@mha3CF20XKr$kB2KRkC&;D9S9!TH}2n@>(`^6Z?OUIljU!0Z69Y)oUFI~>+J z?f9gk_7DwGpIi#NbYZm&GP{FW?s@)dr=!45(heGejauCf0pxmmBTF|5g(ugJn(-Zr0~CHDWgyszbA$smyyPX>~3CZ zm}<^PoQXpB)KqH4jm{#ajXgY)mmwkO@-!?HyO(u}#hu%bS~luLcWX8gpk;Nidu&W! zzwIo6$j`oZm$DdAS^4m?hnXR#iY!Y0OkWZcpNoZuo3sN$KH=a>3&e17z+4j`2Hown z(Dz}}Vp1Os3HMX-`Gq5D>O&`PMC$%KLo!FzxIfj*$>bey@`kF!J zCaMJna(=m@=PLdFssD?!;^0S+v(0vnXH#v~)c0RLtTuCVIqI-Qif9U3{U4`Jy-B|2 z^=A5w)xqk*+>HtI1bfmh7dhn%a31{jMnS_rf^p-|g-fe(59AX!<}Q1d9%rdBeDk;3 z`Z65qLi{^kZu&ZIeGVCY(DBU8!__UzU)1CH1DU<>cthlF*2GfL>ZX%%oam|3U~iIY zx4+%zJU?&|qxLDOBZ{UhN&b`NM8apDH@3#T1;=uV?ae0d1Cf{D8F0#7sP_*#dv6U1 z9@{bw(I}rg^BlZ>YCrq)pBMf+iTmd-9?9-)qG-3|{_S1k#Kl+s=f;IkoR z%W4Q#SM3?cnK{<$t5m7^YxWAOXt@;y!6@c8YTb4;8zhmuAN%dvYQ93g?VjMnrgF z5&G%J+vrQ92~pwog;;DIAzevG@)KZS-S`nL3>lDT@yotctWG={wU&(xFNz8$jCc8G zkNS6tHUtC=bo6mIy&Ae*PcGnUccWRX@uBYrl0ECvdabX3FFAE)M!tmYU3lS>qcbNz z|J>lCoqi%k%wTatX#GS{i$mwGk)@* z&Z&!KXy=f<9>}Gf`Y3JTT?GALl;{IEg|6~q|0D6k+oPQ z?phjQUQkDN4?`Tj&Gp6QDgdqngU;x4^lj4fB{tc#`4V1}t=R7>rxJ{Dc>GU4iYCtKVNNk$ez%C|JJFnTaZVVu-lw4)>ZZBxYd)Vz-c?? z(>qq#g$_P?v>m7 z@Uu2+FNEoJ4Y$n2=C4;b-$Z088d_T>IHV|o_UF{b;kRGUPP+OQd*=4H@_Pwvvf*+N z$R$l7Oa$sIenwp^+#~Vi{)~I<-~TDujMksvqD~FHyBu@y?N9p72et#FfpKqYeUUV^0S*QT`a!uMXywQvf4a(7grFmiupsr4E}>35B@ z1H5qK9cAcolNKw)#{cl_Pn+-H%fIz}{J+uu&w`!$gQr{(cFd>ppV@`T3jvvo4pcCd&J#N}4Rs*n(}|oQgJE z4!Hnn9SCfEVavEe@uvTso`9|EVMeiDka)(7e)ef0lC#G+a*^JTY_2-SSxoQMMoBc^ ze_#Kit+TG>_cb>%d>|9wTVXa zKHw1$KvH`ons#gjXiuXbLCKBVN_K{kKaednA{^@rgVng;y`~QrEAMFE1j!3gIsScP@$&?QY8wfOUt8RmZL>39ob*=I z@ban>eaPC{TR#Ez{mq39^a2E?PUwi&>!E`>l$_f$ETR-^ps!CFuhN2L5gWE6x&*9$ zeMSQlmk`WSwN488FOy)h9rdp^VY2OCUky5B1tB~=J^RvXS`Ld_6lG*A<@J@=(hk0X z-Gei^KUx2 zj!=(1>$Y@?qV|>Hl|@T8M=+W7uoe+zK>a^a)>mmJ)m5)hAAUSbvg3m~mV%3g* z+%PsC8Q|6j-Zc6@jG=yeds-?#E-o&eZ}`L({&T96kJ59QZb~SQ$W(=oh3qTr6-lh- zKvp3(5Z{M^K2?=sS`W2gZCiFd)0-cW(HCOFf6!0U2)PrZ$NA*CA#aZx%fMcVUWn7b zY;c0&Mgvx-PIJbqxz4H_Px74(SSxjt7C#vusE!{SGBWr9W~IO)J~f6qA)G++1@;^O zQ|QNQYQ8j5of+&V#0^JH^q6ap7&z*%-cUKQC(Pgc-p0=Cgw?72$_bM^Jg`%~jJw54 z_~4@-66T1`&%DV5)Lj=|bdxge#fh)Zlsn|wAf>_ZkL6O%`xH2_DjcVPiY$7GjGM_P z(bCHM(y-#~&%ikM(JQl_B%{dH7elzGHO@Hf^ln+Dn1e$BV}_N!{Qz3NssoLL)C8DH zaq^kOs}zQ{z9fF;9~BZ)Uc_^9#T|$fC&Hd`Nl_d3j{!^rDk?2J!^^kgg3ix^%EN6t zzyE#m;bhQ@9m<0ng#!QR4OKQYgmO=75K^3HKTG9d%6ckY1N6nsE1}Sj{3`xk_-0f2 z7%a|bB($6D!TqKpoC4M%Y@>0S@!`jzQF-jKTk+h>=U~4li&kc#_OIR!X?Tds2B?4P zum_wr$MUP&Ca~S3zcmbn98INIAkO^C&ZWoEvTq@;FSYPF}3@P6KY&7|BvDI~I z&s&pkXmO#u?Zm)bKlK~;^$9bH3efZudUC`fD@RsR7Qny`nf+$`;|u-^&rPrKpBxuS zmoVsY*OxEvzkdRQ(ePH~W_TY&T7H=qVii+{MwhMmy4#sQt94x@9|r@!J6Ra}0*v2r zv$I7-MIye+hPf~8r5>_7A$c@j)nU-9Xy-IbyuK22yq7!cRlss^3ouQguA!e5PNxy( z+_(ysKb(CQc;`e=cu~c%xoS4-zm!F<_2<_&e>^dR(!&^=W|JfX`hM|=X^1Y0`9zjb z^n0Cvx+R$R6b~ya?lXh$)2S_t>@a@%A-*N)4trcpPcr?xtc_UK z(Tv{f6JL7D1t?fVY7%9}IMBT9mZi~7zcsnZQ^=z(;D{(9Y#?SakvjgRflF7oOkcWy zx3aIdUq4Dt@O{P5tetN1#aIbKojaq~``SA>1&q@kk4cXS9(Jv*x6i%VV|+_i$ya%^ zw?9O*J^x%QvB?nkS)Y06rbBUFOlu}os6H}0!*^*JFcIPx5Kw!)C1fr1fBJ#1K4={% zP;pAaHD=tgfZ;0bbT!+1S1~%Gp-W+`V`vP@ zzh&e5c}eVgWp~jOH~p|YpeYmWPkhg2Rt{H{Q>^vG4TFZg?5Tn(c*xyTR#lyPdNeN( zyfvhiX~a^btxv4>SQ>rZr6mtZ%}}9~S1x_7aeMiQ#$6yqrR` zV#j>}@2tA0L^Quz@VdL=Yn~JTf8rQrU`Xn`Dt-;u@Qml~Reh)s9u_@>O69Q4%s}T0 z_go+H%HU(~&Oxu{+c${mB4e`|naGyy$iB6kkF7nse`XzZBYnPWM^-4MiKRcq`p!E9 zFKP^s6qWC#$yqlWK`U8`of8A>%yp7%nKBV*=Y!!qcYsD9*Z&5Jy+(|cvQ##wkLI*S zX*8+;+4ms>U>qLnCPlNv#(a#4fyHoY4!J0IK5a6-NO z-WgeTr2FZwekrM`nJFpEf)`n1npZmI;q@;x6SgO6)}|Qrnh)M6%-*jvI9#z=%Nm?A z70j?z%KSAnZ%-u?k&~N2xaZHTeQ+@MhJ(^3E6RK~knrWk4eNuSW}XP>OB@=;C-2G; zr^Wwzem~-JvZd#vaCKY9w8^#IUa=&NgoK2F^{Jq_{fMTp*lWt(%QI89G%Bfl?FpBi zv3!wsQYjiO>tf0P;hUp0Sr?*P$JPR4BblBp&#%ED3nQV-<#0U4_jJ9Qri=|3i&ISj zwt+zQnrSYF@!_sDYz1!!J1#u^Jv1QJYwqgUXe;x14*^YlFRA? zD5&wDk7qAcI*!cqobNNnTfJWSi@PK(Lt&HTt{k}aa#slm9@xCx70a(MHE-|l%)m|^ zlVj=o;sF=09x;w+YD&RJP{h0N_MBTiagYT?i#lV6H9T&#Glq}8(6Y}2^dy%%ra2E} zstmu9Ts-HlB4Y&)RR{?b(lHi8Hmp$iimvFhIix`)f_1Y{a(#~q`6rD z92T6{d=5(M#6#!DeEgVXx1tZ{5Pf>hb~qg>l>hbL9gGH%?Lk5UwxKvYT$5#0AyT_v zpI8`0`Bm}d>MHgCoPQAteX0p(nQGIxp7R2UN>2~mXk}VDJix4#8RK}qm|KAk_V7Gj z0$!^((a?oX63-u`P{Vq*LiybFq{x#E+v6EZVWDBFjDrEZkDIU$JlU>AUfzMM-w!$j zKfglbkFxr|Z==(yA4!dYK>{8@JgicqRoyX-UY}~h0=FW!`_&j}F6GC?V5D`L$sqR= zuQUwaV6!u3;T}XIxU~r zXt3?TRMLg~)((N7`5%n!=_3J=f_zOOY$#jFG#~$!19!%3fSmi()k;oC!>xd(DR;(L z78&?eVJmkrLYoAE6s`C7_xAS5E@ibmqm5+dS%g*&igTCKLHtVurbupn+2ILWxsY5D zotH0GrmjewiYB-U?Y6(Y0l6oqXzEnH z?0c4&vhA%6PkzZi8XsQRo}G>8Peh|N0hrtTJd@gfHY+fne^d9TQuDz^f$DBi&7A?7 zR?F5MfGXmSao*nNR;AU@$N`^?eG$zE`K*EaZrpJ1q0R1W14g$s9hXc_PcOmP78gIw zeZENYf3&n5vOp%(x&_RFZgv`oVVPRo)n`%6GOQWcn_W59mKQ&=NW##C$HVqhzg}Y;Y-PMo-oZ90L++{5r z530U|I^O-ly2O8r#9;i_OaEn*xll;q9NG zLY$fjUJ90IwC-IbP=1H~O7Byy2*EksQ z&kcXF#Gs~57^{FMHJxwqKYR>aE6ygcdCmMkitRXo2#Jix$dYv#ed7fMWb%t+oHf1Z zZsSgQ%f?D9FfXDxk3y>LfeF-hCP45B5O%l^w1dGDSeepNH=q8nLvY*RQZ%VyX4ukgErXPNb z4FdeShYi`0yQ7a*FK2u&J(ncjS%&k8M_1q8SyHsm>u-3CShNZEshypT6ShF;{r)9S zuBUd3WCrYwJM=w}zZfIdaY=;=5-Fe8o38yFEXO z?$U5?Pc!-ZXhFw5#uPe7cN6R2SRYqcnLKYQ5eY0xTYDgl1GWI1rchNrq{Qp8 z#Wi860;=Bi{r2_&RC4Ls>bvt2zc4;)yYiM^t$!_*!x0)9ZC*{|B1q*1&yL~ku?%F# zVjtrui&3Q^^3azw0qnLXC}q7~Og&~|U7F0TB!Fnkl2>`1@w+GpyyEqCD`=52m4_%) zrHsdjeg2cA2GpOQ-FqF8-_Qyv;e|}p!7LTujs>&E1vd-Xz2-xlmM@9CR7uGuFKn?g z_N&a`4KLPEWfMUg8`qGN*-4QcM49$q$b`>!}{CwT?a-7*-55zY41Zo~^{KkToY?mM* zx2+F`Anw8BrBE%AC=;kCR45#SC2VfvV~&uFWf5Cu1v~bNe6h$K5n!uhAlSF-342)! z{U>mz46_`%R&L$oZvyM+T3WORP5%^)pT0d1biCOm;I4OKZ(;*yGLqr`D|y`1@#IU-A{l_{=a!UI!}*-$HYBOEzi)DVa>!Oo+~R_ue5%5?6U*}lk7TRM zjr-;&F2T`pS*5PoVc};Y)5WWe!0(UcspdK#utlrc8ez@*9g_4N1I7-M>PBmZ5>j<@ zrz|^L5Lf?oH9q{MGz`ZE`idi;wJ|529tFJ5G|@O3jm{AjhOr3d=7fvpeb>wt>#1cc zMH_>O^N2KqJbjFfJ#LDHW9@>Xr8;Hg<&~PN2S4j4$`;Z-zbaMtA_CevWW;!hljq2& z4;;T68YOqUT26OHKGl4QApejaP~M*O65$VC&hGrKFHiK|?vpn#Fc47oo^Pg+v6O&m zWp^URr8XUC{fpc689+}1gXPQ?kL^S=e#J5V9?h47=kFAr)zAKQu-<>5#H^m>5dR-A z_2*qZC=_net`9(E>gCOIInF^OE=_j8379X(|C~FhewUjT9-fstqFfjyqb}yKN#BSk zPaka1Bw7MTvfFSijA>O_dAxPAt2q&bf$v?>=?I~c8vVD+O69HgN7S~b)aWCUYTLci zQWD(qSEAYFsxXfvGG5_Tu&Uds1EWgMV6;%bf(4<+9CK&hRQN`%^6iuPk?kvVZ z79%ybiPjp%f0RX^&Pvb7kV>4KXEW;8uj3gWd~Gu@#FROqq~P(2)6v^NuiZbWQKFmVT@m0bL;Ec+&sztr{BwaSvC=tIQIS*SKa#H>5c^oK zKXmAY2i5nL4`S;tF#kQ?l@DBrvQ~EU-Z>I~(_t3;LUi%Km7$z<@kHy7&Voi~E;>c+PfGaegqyr>@``KrjEp8-?{f=>vs z>6TF)A@TDfzlI@x_lbhZCp+d{cY3G0RbcChO2LBU*d|3>5=GNr9ws=R& zScja?`%Y$&AJvc`Vh~IvcTv~JjXR#?R^J+Q*6G;%Edtu3ayf-M5oMlh`s^n_KNu)= zH1T%)17m@V_x7#=6F)0yACZWLg(PuAhI{au1u}43iN7ZsQ5W7VUjHz{=Y|S(lSv@( zQ0*wp;AjLmG$@~_CtDvOTaGC7k%B!kQ7OIifwtQ2W%ma9;hL7xYq9s#mhDwk9bM9} z%d?+|7>~i#pd=5}=*RA=4NEia?e9Un$xO`rHbfn50&wX2m_SXwIQK%Df>rKegs^_L zt$EI?ot_FM-9owS$hv$nqb|>{!b0NWjzgsI@NgC%jPoUE$cG2RrIcWNz%Irg!5|OAxsxo;HEc!YU6!3k8$$Uk?MSDMf4g_F;JG3R#72}d+80WUVWF(qY(`z zc-NEw-^t#WPj+uoPvB$FvQP9Qda5_{l=RJdCy9MF7wRUrYU`#w-3B-IKVF-r?;%Y~ zpUEmJKKuDZNAx|9%?bMSGx1ImOS$Xn;(WKQHGL}?*g8$Qa^>1_hxHL?Xvtm%DqDK} z4G3ozMHLk=@+#J}9q)C9m7)%R#NBuVG>QwyUWl!yxgU?Y2W_KR=f%_)M1tpnS~j-T zR>&`cd0!z5EvWVy;iPm6mWdVb&`|7guo|i>B{VE_f_iE0`HV-LkrE%CShDwdqO30f zbg*i)^(uWYF;w2aU7Zir4lk>z%E|5RmJ>IB*~ZFdU$%*!^D(xlwLrWk_}~F+CGb#C zxMCYEiV0x84H0|@JFc;&wJ=b?wmTXP#*3g}K&a8BWBi=kY^tlUz0{e3*DL$O)D}vo z8=>|rE9)e6M&LNPWq-l?FfY$mD&NGM(^$t-`OzU3SQ1yG)7PTz8_Cz$6N9INvgmUp zwcVjutNO>lBBh!35vaL?z>;d+fu%SR->ZuL%QK*53YY>$j#(!ezciR6u{*=a7DlLK z;OzOZi@opJ9%2r+)u>)IENXSMrw)D%=ul_Og)fFmw>4|?Gqm|0Jc)p)-!wfIE=-Xf z%MuTf<5#9CRcPn5mb{7?rUUlM&dT zp@nuzs(SDI0_dY8CRYB9dYSg;HO1)VisIU4+4lY&y_Sj+srQy0JYxBBy*ZolIq1RQexa^8- zbXl5mgEJ28DhH~&ygXhm-xOEaT3M<@X>1F-h=(Qi+31iYxu)$t3tu?Ff524V`I#d$ zFf`xk-D>aT`p1IILo$`$yvBI}I1G`znzn(c+wYq`4jGTQ>|-3&IU5(pptKxo@$Mjl zsXeT!`)^)~_Y6CuGE-L!J_b>g21XBRS@_0)m8!aO%Z5tcQln_f>#i|YMia__KUs~@ zL&&G$>d2UYkK8{-Q7L>;Aq}+eC!lL*PmTL0yW})othNPWEe*?;t zfDp$soqm`!-tfE=StNLs5;&tlxxz0&*`I)0@6X|FEaQR5A+eg!89QRReZPf#^GhcY zc{y3x-$r4}b9oN3iH{wY^W}*<2LnKJ8A`6W&J6>u#uJIjpD!vuk|M%Qj16U){sZoc z(TWNywqI;@JHuiH)C~3YVLrGN6IfzZ2hYdHdRG-Zg|siAozxnhJ{+q%-e)Rbqtfb#do>h*5dhH`P@%0;7<3Awci>3RJW1eiFbvT++j+Um zU=j@ZZnU*o)LK@#t_^D=JC`8KCZAdFvC@rrv z569)}qv+#mGzU9#|7$P}_*xq)pt1wdmkj#*`^S8&p{6BP9-AH9EsQ34x5nih*D7nq zA)daGV7|mu#(F-+U2N|h%_mUhEh}%C`0sl_d=xu4QId=wOsYH@ zufg&MuqWxxeT5gC+a6C!+&pr+hgO0!^~Rm=e5*1%Y?Co zVuoe(6)Gz&I1JR}4>sCp?Q1-qNuG|5^Prn)1G4Bl1+pA&3Qg0Lu1{P>7<8>#I;QHn z+nw@Oz2~qDU~z|!?L_B5fby^9BgJnJqa-_vwhQQnZb-b5UePV%D;mlkbI{v=v#(tA zAvjfJJnj;+NYH#a-5k_pRZbw;R~2OXuYxJ0TA<%t%TY2Te)z}6;FCI~Pevt&rZ_PF zYHx22qCL(`!JI&I7_K;#fW7Eg$r>wT7>-C)J^Xf>HTRcj69CEp5#4O?|M*)b^^6t%%axK({t;N_5RP~=KZ{g z1kizknWaT7x-1qf+e{6^0N(1drO9K^6|*Yu&j>Jvl4Gx_$c@S^4?i*6b*m$e@fUW- zU|A=u#VxyEJv((`&^IQ2s)DR3Gjh%yDoFegFnDfVrs{ zLxrM17D-Oo_Yi@{Fm&3axl1f69B_UTpV?E5fb{DH4>u`+p|I&7J{46YWhp$X0U@z z$CutvsF9vNVzSW;=RL zWc4_4Plts6YPkIkOI=^EK0$alwzB^`dIn%`Y^K%UoF$VAiN@@T^610%kJq$f`TJnV z?)aPbrg)zK)`bQ*HVs4e4xPYvvORpL)muU!g|cCYWp>6s>_uyeoSGsmef|BU$p-26 z6eAr`pGX;LB?8$rFTrTtHwtt|`5y%@u&{!KNff6xy7~{nonXhGCm9DFIMVG z1`N;;$E0a`1||z8+i5Im$=pQxue5K4eH{f-8WpSlEIAZlEV#Ek<9rTM|H!J-NOVTb zRcJ06{mBM4(81$%!_FL#YiQojiOLEhkMlf$;m{LF8pL+}HhEgDAZO(ni=x-FwL95Fy&skY&#&OYkZT}YZ#S&-ZW-CED=0{P9 z3ung;ZU!=iyoU{tSM0z<%E%RoGK#Y?!m-&z7QxTd--^t+H6hx?E0fP-94XqtX2Xo; zKC)DoqzNZY-$}%V)!3a-h#{xO%k?^Il-_F6SltUmg##r zu~N*dwy0=DOpcMi=+4q>_J-J$@o)wpE2?Ebe`Ttp

TBEKiU8UYePO@Pc$TBCP!} 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 DUr>Tb delta 20220 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 diff --git a/tasks/battle_pass/assets/assets_battle_pass.py b/tasks/battle_pass/assets/assets_battle_pass.py index 445a27524..48274cd48 100644 --- a/tasks/battle_pass/assets/assets_battle_pass.py +++ b/tasks/battle_pass/assets/assets_battle_pass.py @@ -97,10 +97,10 @@ PERIOD_MISSION_CLICK = ButtonWrapper( name='PERIOD_MISSION_CLICK', share=Button( file='./assets/share/battle_pass/PERIOD_MISSION_CLICK.png', - area=(128, 478, 323, 578), - search=(108, 458, 343, 598), - color=(72, 65, 45), - button=(128, 478, 323, 578), + area=(128, 412, 303, 561), + search=(108, 392, 323, 581), + color=(75, 67, 50), + button=(128, 412, 303, 561), ), ) REWARDS_CHECK = ButtonWrapper( @@ -164,9 +164,9 @@ WEEK_MISSION_CLICK = ButtonWrapper( name='WEEK_MISSION_CLICK', share=Button( file='./assets/share/battle_pass/WEEK_MISSION_CLICK.png', - area=(128, 336, 323, 477), - search=(108, 316, 343, 497), - color=(68, 62, 42), - button=(128, 336, 323, 477), + area=(128, 197, 302, 344), + search=(108, 177, 322, 364), + color=(76, 68, 51), + button=(128, 197, 302, 344), ), ) From c7b54e4939f069aa42b2560669e414c7fad37404 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 15 Jan 2024 04:17:25 +0800 Subject: [PATCH 17/65] Upd: Move MENU_CHECK as no exit on cloud --- assets/share/base/page/MENU_CHECK.png | Bin 6696 -> 6286 bytes tasks/base/assets/assets_base_page.py | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/share/base/page/MENU_CHECK.png b/assets/share/base/page/MENU_CHECK.png index eda73bbf82b6cb0594ce304bff53bea3061ac6f4..6cd5845e4e9391411cbce846bcc7037422ed0969 100644 GIT binary patch delta 988 zcmV<210(#XG>$Q_y$V|myGcYrRCwC#-Oq{~*A)lgb8c15A8Tdu7%>4Q*=V7SHrhKL zB_J_I0nKZ8WyLni8w4*BY%n1&CE1pi5ynoW?t4!b;*6-BpW2-PMnC z|3tGv3snSv>|1&T0002&=J4poPyVUunK`0HRaIr?!O`K#$;sWjckiFv+i$hA0RsR4 z;PP5#MD&V?nC3Zq&&-IpfB*iSJ9mEg{)fF+C;$Th0Pz1Ysw$(`SYq1tesFYnc6N5_ z)~#2sUj6mc&jerq004dowrk5bV_B9O?J-hKC1e}4GzcfbGbcQ3#D_@j?rym-DW%YOu500024yUd(gTQ|OX=f;gk zj~?B;dGniZo;`W;rXy@{PokP$MezgeAL?h`>&2c0ssJDNB{ilU(-B|KB}s<)_dQMn&x?ms;YUJ zdf)c{zFwAPO!>jd2m7s72N(bVfL$YHYom{dnC7YX9udcf$E{*o4twQx(`)46@jE%q zQTvad)&K(l0I;KV@2k_(({+h&Yi*3EQEi!jMpcd;5m^xtbp_@h>i`1)0I+)i&dl|q zwf1`RIwG>=*z_FLqk2@&wtn_rtqw2%0028$({HxSk=b&d<{FhP+teZ=*KMcjs#Gfg z0{{SUsQ|n#10H>3X0(imUKMe^?Q)Jc*L!6OGynhqy9VHv7fE=Y=P^dET3+0`I&^@4 z0RRBl(c1N0R|0P~n~3=6%l_r`NMvz)d2b004m918`>cZJ*{Tdsfwh2M;c8trxAew|@%200017KWkri zny1mnw)d79nQ!0v$&&&w0002jH~{y5ZQu6o)TVqZ0Ix0@zdFDG008_F%+nkZ(>(p{ z^UtSgiiozJkW{r!la7dcC+`cu00017OCuv9s%1n})fL}nSpWtA0ANQ|HJ$HqRaKkq z_Vo1hV!7`+?Roua3N!!!0M|PJUmSN7?af(7SrHML>p8$9BCfz5SOPEr005Uy2*5uk z-pt6WUTrgA0002&7=Xu!h{~wE2Gt6{00017B2{Kymr~Pc0RRB7n=iloYF?I$_V1e+ z(La8Vw;%rFy^}p>bpr+f0Knz-F}wt`K?}MC9)1@80{{U3{{sLp&smo%%DD>w0000< KMNUMnLSTaD*x9-O delta 1416 zcmX9;do+GtLx2n3zf&@G4dF~j0(*%X4oD6`=0atoX`1uzTfZXn{EBfwx;C}sDVbnfAUTo z{W2bf%O{@Xh$b)eUWoR>S781B;MBvqN-B&lS=t;5+wXsGD)sS0-4$*~SV!V%g7qmB z!qd~&2Fubx`X~I^ml@rt{klh!sqAADs&-{DHS6%b>~|i^i%clj?Wu|1aFtlcrKnI_ zUMSuKrKY{*czT}cJ^*;}`bee93oF$}%HS0H2ZSj@io3ynvdEdJRVLY2W2`$ZwFsjx z^}YiDj$Bzu4FFOBMGfp!0N#gg!Ea>}CcZEklQwwC;3D-zS8T~X9R*6R&Ou^hG$q2ejJ9(K} z)RmuKe9e3Z_G39_wMqG}k;; z2>^5+AU_xI8%0`(izhW*>WLWHf|xNmma?%)H(a);Al|~fSn4>vt1{R&G-g%OYwHG= zbHMj>(wbAN{4I(0b$uH`0yp46WZ4i8Rn0ukQMf(&AQv~s_)9p*<7QA?Y6}yma(>5B z#bS(e?9_V^ESZg4y5xMT#q>&A!`ys-IddSMO=fk0*oC4>KA)7twRFYGmK zh(m*~rrT??lT(_NlBZ`!Kt0)ZXMK=DMJ6&nv@l9v z&F?Wrs;feRVMXA4U)b*QH5Xt+QKFwa+~1)x?9SGvDD(Oa7x`%9c}+rdC1YmXbr(gD zj=W~yrS#`^7f|(BBi7FQxnX&h_V)J+LaNk`?rGWn^)Uomh;z7OXEbDc_WGo^q2_}3 z8K*|=;F1ZJ031-)8ya+PQ?0DlPuj+BDPLAxew(_&V<4`d8AtSz-*#r#5(p-F6}NoX zSITLn+_*V01j10AqWJP_reu>F$tDQ*Hm{{ga9t{)=;-oxW5PLbjH5}YSnd91?qj*} zw%gOBA?Ra#DR*-#&RrOB$PUpT#dpXW5x*Gibnd`*1RfT>PY|6dy6)BfngVVuCmmrWurW9=p;( zE#PluEm{<$)EiTExx%{!pfsup6m66&S>%}-rJ`;r5)NSVisb_4&G^tINo6?^7gbhf zW|2I=;}4H+f0C-o=NI%SloeKPB&w>6<}%Z%!gt!zaE$rddH`H=^I0BqR~M%59l;5X zis7S_Rg?xhcI?fkxz^8;@VhU`TT3zrXu_7zYcHr8Qombzr5BEMy;dh%W zK1_yxBs^|S!tUddHoDVlQ9}B~#0tUul{B9lWGf}Lyi=+z2F=jzg8(3xD+6b(ld|>4 RLw0@_fN;GEueucY+yBahzB2#- diff --git a/tasks/base/assets/assets_base_page.py b/tasks/base/assets/assets_base_page.py index dfe395f08..90684c6e7 100644 --- a/tasks/base/assets/assets_base_page.py +++ b/tasks/base/assets/assets_base_page.py @@ -286,10 +286,10 @@ MENU_CHECK = ButtonWrapper( name='MENU_CHECK', share=Button( file='./assets/share/base/page/MENU_CHECK.png', - area=(1222, 638, 1252, 669), - search=(1202, 618, 1272, 689), - color=(57, 50, 39), - button=(1222, 638, 1252, 669), + area=(1222, 298, 1237, 326), + search=(1202, 278, 1257, 346), + color=(65, 65, 68), + button=(1222, 298, 1237, 326), ), ) MENU_GOTO_ASSIGNMENT = ButtonWrapper( From dc917c553c5fde977fffbc45102197fb7ac56296 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:45:20 +0800 Subject: [PATCH 18/65] Add: [ALAS] Method set_search_offset() to be compatible with Alas --- module/base/button.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/module/base/button.py b/module/base/button.py index 0f9671a32..b0e057ee5 100644 --- a/module/base/button.py +++ b/module/base/button.py @@ -306,6 +306,34 @@ class ButtonWrapper(Resource): for b in self.iter_buttons(): b.search = area + def set_search_offset(self, offset): + """ + Compatible with Alas’ `offset` attribute + In ALAS: + if self.appear(BUTTON, offset=(20, 20)): + pass + In SRC: + BUTTON.set_search_offset((20, 20)) + if self.appear(BUTTON): + pass + Note that `search` attribute will be set, and it's irreversible. + + Args: + offset (tuple): (x, y) or (left, up, right, bottom) + """ + if len(offset) == 2: + left, up, right, bottom = -offset[0], -offset[1], offset[0], offset[1] + else: + left, up, right, bottom = offset + for b in self.iter_buttons(): + upper_left_x, upper_left_y, bottom_right_x, bottom_right_y = b.area + b.search = ( + upper_left_x + left, + upper_left_y + up, + bottom_right_x + right, + bottom_right_y + bottom, + ) + class ClickButton: def __init__(self, area, button=None, name='CLICK_BUTTON'): From e9d700bd53fc654d3fd3f409678c2ba44c6ef640 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:58:34 +0800 Subject: [PATCH 19/65] Upd: UI navigation to forgotten hall --- .../dungeon/ui/TREASURES_LIGHTWARD_LOADED.png | Bin 6241 -> 8185 bytes ...RCH.png => TREASURES_LIGHTWARD_LOCKED.png} | Bin 6820 -> 6030 bytes assets/share/forgotten_hall/ui/TELEPORT.png | Bin 6168 -> 6314 bytes tasks/dungeon/assets/assets_dungeon_ui.py | 18 ++++++++++++++---- tasks/dungeon/ui.py | 7 ++++++- .../assets/assets_forgotten_hall_ui.py | 6 +++--- 6 files changed, 23 insertions(+), 8 deletions(-) rename assets/share/dungeon/ui/{TREASURES_LIGHTWARD_LOADED.SEARCH.png => TREASURES_LIGHTWARD_LOCKED.png} (74%) diff --git a/assets/share/dungeon/ui/TREASURES_LIGHTWARD_LOADED.png b/assets/share/dungeon/ui/TREASURES_LIGHTWARD_LOADED.png index 89f5d74fbfc15b51467f65ddf9958cacef1c223b..7eb9ec3327241276179e67e29d8f98f178becb73 100644 GIT binary patch literal 8185 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 diff --git a/assets/share/dungeon/ui/TREASURES_LIGHTWARD_LOADED.SEARCH.png b/assets/share/dungeon/ui/TREASURES_LIGHTWARD_LOCKED.png similarity index 74% rename from assets/share/dungeon/ui/TREASURES_LIGHTWARD_LOADED.SEARCH.png rename to assets/share/dungeon/ui/TREASURES_LIGHTWARD_LOCKED.png index 818234f75a62415a406d1a69711c3df726513562..70b03718e6a2ed6ce3bb2a8f5e517000edf493be 100644 GIT binary patch delta 754 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 Date: Tue, 6 Feb 2024 22:42:44 +0800 Subject: [PATCH 20/65] Upd: Forgotten hall nav assets --- .../{ui => nav}/LAST_VASTIGES_CHECK.2.png | Bin .../nav/LAST_VASTIGES_CHECK.3.png | Bin 0 -> 6266 bytes .../LAST_VASTIGES_CHECK.SEARCH.png | Bin .../{ui => nav}/LAST_VASTIGES_CHECK.png | Bin .../{ui => nav}/LAST_VASTIGES_CLICK.2.png | Bin .../nav/LAST_VASTIGES_CLICK.3.png | Bin 0 -> 5908 bytes .../LAST_VASTIGES_CLICK.SEARCH.png | Bin .../{ui => nav}/LAST_VASTIGES_CLICK.png | Bin .../nav/MEMORY_OF_CHAOS_CHECK.2.png | Bin 0 -> 13816 bytes .../{ui => nav}/MEMORY_OF_CHAOS_CHECK.png | Bin .../nav/MEMORY_OF_CHAOS_CLICK.2.png | Bin 0 -> 10292 bytes .../nav/MEMORY_OF_CHAOS_CLICK.png | Bin 0 -> 10364 bytes .../ui/MEMORY_OF_CHAOS_CLICK.png | Bin 12138 -> 0 bytes .../assets/assets_forgotten_hall_nav.py | 95 ++++++++++++++++++ .../assets/assets_forgotten_hall_ui.py | 58 ----------- tasks/forgotten_hall/ui.py | 1 + 16 files changed, 96 insertions(+), 58 deletions(-) rename assets/share/forgotten_hall/{ui => nav}/LAST_VASTIGES_CHECK.2.png (100%) create mode 100644 assets/share/forgotten_hall/nav/LAST_VASTIGES_CHECK.3.png rename assets/share/forgotten_hall/{ui => nav}/LAST_VASTIGES_CHECK.SEARCH.png (100%) rename assets/share/forgotten_hall/{ui => nav}/LAST_VASTIGES_CHECK.png (100%) rename assets/share/forgotten_hall/{ui => nav}/LAST_VASTIGES_CLICK.2.png (100%) create mode 100644 assets/share/forgotten_hall/nav/LAST_VASTIGES_CLICK.3.png rename assets/share/forgotten_hall/{ui => nav}/LAST_VASTIGES_CLICK.SEARCH.png (100%) rename assets/share/forgotten_hall/{ui => nav}/LAST_VASTIGES_CLICK.png (100%) create mode 100644 assets/share/forgotten_hall/nav/MEMORY_OF_CHAOS_CHECK.2.png rename assets/share/forgotten_hall/{ui => nav}/MEMORY_OF_CHAOS_CHECK.png (100%) create mode 100644 assets/share/forgotten_hall/nav/MEMORY_OF_CHAOS_CLICK.2.png create mode 100644 assets/share/forgotten_hall/nav/MEMORY_OF_CHAOS_CLICK.png delete mode 100644 assets/share/forgotten_hall/ui/MEMORY_OF_CHAOS_CLICK.png create mode 100644 tasks/forgotten_hall/assets/assets_forgotten_hall_nav.py diff --git a/assets/share/forgotten_hall/ui/LAST_VASTIGES_CHECK.2.png b/assets/share/forgotten_hall/nav/LAST_VASTIGES_CHECK.2.png similarity index 100% rename from assets/share/forgotten_hall/ui/LAST_VASTIGES_CHECK.2.png rename to assets/share/forgotten_hall/nav/LAST_VASTIGES_CHECK.2.png diff --git a/assets/share/forgotten_hall/nav/LAST_VASTIGES_CHECK.3.png b/assets/share/forgotten_hall/nav/LAST_VASTIGES_CHECK.3.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf56e9f10c315528ae0bdb8748c6cfa3ce05c86 GIT binary patch literal 6266 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 qe+m30@Rz{wU5|eC&(AY&7 zvYTv;r7_vx`TlZhK8Y`i_-f+AkVRhCNCGd0R?!} zEyZzxL<3kyPcxE|6E;gN$hwUE;!M*Cz$O(UDBQ1F<&ff?7oY^*qY@X{y5>$I8x2Lx zfM7D1g|gupDU#rzTf(@T19WqPYNPiL89*uk9*9tND0s^R*8k`z(|~bQ$`k~Q7hXWo zfp`j#by@o&rRpbOYw`pxPTBSa6rfe164Y%~6iADDX>CemGYtqxFi&DpwFSs5b@5&x zC{GDA_}TlY1a+wjt`E1)qHMgQFfa0rP88<}i z-!xxeh*Lh1ne&>B3*RNr9^-;H!Q*Vztje~c$fL)0j{>UT33x2Ey3`{QUii2xD&i>N z%Fw)Q&3$ps7hC4fF@{jRF2qN8vZhc^+C1Azg!Gm``VoCfAQM1G8?@=y(|*8uw1xks zpp0WS9}WPj;XBt}@-QX?R%cmh1POqY*1bekF$&O^QM>>^(=YD(<*5+euXF%t7CgCH ztwwwHGY7hjIrlSPQyYZR?u@4D*^6zrSk=!gA}=t!;Z9dOZ``IhPW_>pil^XQ_8e>7 zXDN9m{4Cr3Cu`o2Gq&9MU$~p1>8aJa>DcXr6l2fXCyYb;=^$AN)KEK^>?>rk;7TmV zJ!ogQPcbD*-7VP~CcJ&kheIL$zUqDwu3J$0#o>!4ZK>2JwfCsLQ~IlZEEnK;@wLEr z$WNBV8kt_`KEzYUuY{~GEE~G}%ij-#y-09C4oNXPy_~SS|1w6)_PIHaXcw2mlDV8| zqMQSt`9A@iylwe*1iFiqaY*)cx(Cl#zj!=NO42shHPA~$^152^tTYdP`=26OU X@#oJ+Bt^8H7ZVq;(i|++jG_wPK@U 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 literal 0 HcmV?d00001 diff --git a/assets/share/forgotten_hall/ui/MEMORY_OF_CHAOS_CHECK.png b/assets/share/forgotten_hall/nav/MEMORY_OF_CHAOS_CHECK.png similarity index 100% rename from assets/share/forgotten_hall/ui/MEMORY_OF_CHAOS_CHECK.png rename to assets/share/forgotten_hall/nav/MEMORY_OF_CHAOS_CHECK.png diff --git a/assets/share/forgotten_hall/nav/MEMORY_OF_CHAOS_CLICK.2.png b/assets/share/forgotten_hall/nav/MEMORY_OF_CHAOS_CLICK.2.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbeb0ef3782e070313399e0708632df0a779e1f GIT binary patch literal 10292 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 Lf0t-Kdhve%b0o=U literal 0 HcmV?d00001 diff --git a/assets/share/forgotten_hall/nav/MEMORY_OF_CHAOS_CLICK.png b/assets/share/forgotten_hall/nav/MEMORY_OF_CHAOS_CLICK.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5c2e4b8035ea7ca21c10a57b79135cc1d64db5 GIT binary patch literal 10364 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 t2>ge@e+c}Cz<&t*e?VaO4H-iZm@J5QJ&R Date: Tue, 6 Feb 2024 22:49:10 +0800 Subject: [PATCH 21/65] Upd: TECHNIQUE_POINT_* --- .../share/map/control/TECHNIQUE_POINT_1.png | Bin 6130 -> 6129 bytes .../share/map/control/TECHNIQUE_POINT_2.png | Bin 6182 -> 6186 bytes .../share/map/control/TECHNIQUE_POINT_3.png | Bin 6217 -> 6216 bytes .../share/map/control/TECHNIQUE_POINT_4.png | Bin 6198 -> 6196 bytes .../share/map/control/TECHNIQUE_POINT_5.png | Bin 6097 -> 6097 bytes tasks/map/assets/assets_map_control.py | 30 +++++++++--------- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/assets/share/map/control/TECHNIQUE_POINT_1.png b/assets/share/map/control/TECHNIQUE_POINT_1.png index 30479efbec543048c5ebb998c86e11d7c03d825d..ea6201eaadf6fee823a6f9bf01860db7e1d942c7 100644 GIT binary patch delta 703 zcmV;w0zm!pFYzz1z6t>zlfMd0A$kS0wW$3o_S)XPcfHriLEXIJQuFz&&-R_3-}^q# z6N$4i3!Vs*Knn$b|6No9004@#=9W#dXd)I#EQ^)j+1Rx6_11iPd8B-*eb=E}5Crq{ zGt-l~eD>_%7g_-&6q5h|fMWNQu|zDIh?kW&HQl!7?Y8$jzV1GD#n9>12jAIVedSf@ zbZ#*pjYP_X0t~Ay8tz!vO$Ltku`uasLC&+g^CQ>%&X)ztlbTa=h-Qctg`-SLb3bh&}qus?^Zv z5f!Juta{do~Di;a_I|SlIvELRV)xl}c^d+#wWDS`MNB z08p%-Q)8!pK1xoGR&CuIud4dnQYMo*`bM($)=d3|v4)15wE{}W9bft|_;+V=Pw&1w&^y2Ptz-GkF~$pk*th1Kbgv9^Q|xC&i{CE-;p243rPR~002ovPDHLkV1o4dWat0@ delta 705 zcmV;y0zUomFY+(2z6t>!lfMd0A=(1kTGaj(d%fPhcfHriL5+)B?>?XP*}l{Bd*A1I zA`!DO3!eyo0002s|BFfh08nby+_EVaO~fLJWwG)*8=H2%-kMJ>kCach?>dwVf*_rq zotetzvu6jt&+WM$44qzm@SW||S6-D$ z z4`YrB0>#FMJph1`v--L_?th?p+Y66(eRwJTOWjj1$Lns2H#9AFbuQ+D*rU&^8Xg*( znwg!LIHwf=002wa^UoeQ`^|-;2d4IK&jvv*{L9=Q3;Um2=;}-j4-aqI+#wWDWSndP z04OmD^-Z~-en?bQR0stafB^tl+GeKb?`m26>O}VY)8RjsdXMM&dm@{*r26{4 z6$&Ua9>D?tC^;8K!+STbxp7_D$DO~fTv@$;qBa(dM#3=c`8;*~Vy0w>29H|`Xi+^_}_w??|1HI|JZyn1=CkusV z?BwKmt$f$tgq@qlvk6e!Ts~j$~!D`N`p2HsAVE?);Az_Z@jNh+d2Y*)X3K z3MexE00RJ&oNKPGi$tPfSeTz*=00000NkvXXu0mjfw%b&w diff --git a/assets/share/map/control/TECHNIQUE_POINT_2.png b/assets/share/map/control/TECHNIQUE_POINT_2.png index 76f3d7197b369ae0ff68995535dd37ecb6072daa..1c8b28ae6eaef5cd9a8d9e421d211ff85d25cb1d 100644 GIT binary patch delta 759 zcmVJOWghQ{_pYXo;^7-)n!Z!%B zF$-k~e*ggZODF*V02R`?=$4u!RTHMeASzF0+plVS?xn7Le)RRtKMs|T1#uiDVe7o6 z=Gim$?0Z8lpwen2005v;vt|<2gz1_voeJx&X`lbv+mB5Rch1Qyd-a{JY^EWd&dzO~ zJ*%m4e0)MH;0lN&005vuT3R}zur?@7TiDUDe|g86zN7U$UxgR?8d}??-*#umv2Uls zx_qHf7#SWpH*j1opwip`0{~F5Su;sRL3+Xbj!j!1=s!{S%h!#oH#FX{HtF6Q75|v` z^fN0{nauFTvB_dtE5HH_06-NB!?3-*ZOhL4P8}OP^6AWnUZ`tZkiK?t?Sq?=?)U4< ze{pKVhSjN5t)UbE0D$VYV#O1ud;0djd*S6Zg`r$2`G@oU6I&lH{Lnpq=+M#Ymv(6d z002N0`|d!`!Owr%wzhcuNb+xIelG5MGXDOv@qPO~(F(W%QW5|FP$5wiMd5#V-W>Xy z6SyLWk^}$%RLJ01?d`YT9AtxUK8P0Gf0)!a{5^c;&K34-50?C9X@RmZ#|Q4ZXGz_(_=~+$eLdM_U8QK|*)7k1I6QhfiA!-@ z8XW4C3$OqK08p)3S{8;un5~b}QS#-1lXu_0c*cy(f+b;XbMN}~JI6}Dhvlg_DJH?x z;LvY!0hQ*@aR2}+D69!v=QTyCAozUl?BkEV88-boaH;#LNA?#c$KrV6ax$4D#W*es p1+y^=+yNi(zxO8q009600|3NWA-MqKFVg@3002ovPDHLkV1h=hc}@TT delta 755 zcmV@1taiDrEh~p>;=gn-^W=er#f}eRgiytM7E=b5pa~{G6s) zGaDO5N5`}R(kPMu0Dwu&&FxWG8&sw&Y-`)Re`8J0(fY2h!V5i9=e10`?asDi-%f;e z#Zsv>G&ppw@3>q*>bL<00O0S@Fv&zgcES9%OD(KY|Csyq zGb=N>+~CEL@p4rwzyb^aK#GN7*xK5%W#@gTjtw9AbjCw3)U_P)8A3<&@LK)S71@x z=P4%v005KvM`~}s_2wWSeDguH=*Faef9jQ4v2d=mXM3=0MWuFD_r{Go3WXDL0Ty5Y z0Me>1({lLmnN@3+2KnBPch6jMQ#O|m!Z7IVzO?Jv%JNmk`Z*WYt$U?9UM}>Xlnbx` z0|1a#bDG+V#jzs?`&Qn2L;bYzk9Oy-zAhOmTz+qRvV2uBu8zLA?X8Q$L*eC0e_`OX zTz~}_0D!cbJ-aOo!lA*DQ^))6x@SqgaNI*BWBTXH4W@sT(lyPS+CNjZ+oLIJZe l3)}%7@PGRg009600{~`bA-Q&+b@l)N002ovPDHLkV1k=2faU-I diff --git a/assets/share/map/control/TECHNIQUE_POINT_3.png b/assets/share/map/control/TECHNIQUE_POINT_3.png index 0e2c7fa35d9247c5dc567551858b8adbf7a97079..d388277abf9898e0c0e72d46e3bfb55491951022 100644 GIT binary patch delta 869 zcmV-r1DgEFFvu{lz6xx0Nklz~rwsFBoVnw@ zZ_A>kLtF-)XZ!ActM|`2ZxjKuF$*&YlRygwf587OmH+^N>KZv_avY^elue>c9Hr&% z{9{d%$K5-u{p7EoZ2rC+^+c6QRIWsE+;;49xqzFNN&o;rb;Tjg#MvauCUGu}^D~~9 zx?s_ipAXeOx9oZ)&Tanmn>dt1T#llOR)7Hv06;&MiE~Mm#vz|Zg{jlWFIe=*)(sc) zf8E2|4`mlWKeOjb?u#wEqvTR0+|UZ>i$nqd0IDlgLKHGd7&vM2gk>w{ef3`LfYLqB zzS29ekX!#^ZsDQ_XH1)xt;shGt=9_Zi;M&S0902){itl3pFQ{CCCg{M_EK|gwsGOA zv{=lJeJC7g?)|YjGk-;0E}Q8%bMDmXe*1~32s{ng-Mqn>`UY0lh9+cy?#vyDqv zC&fW=6h%oAPk1!#JexnUKi{Gddt@bA-YAC>of8JbpJKGfQx70?&n00RI} zWkc&nwH`TDTQ_L>{JPB>cV7K%#OV8yB#A-@AHR9|;EvLQ7q0DX`C;v=TYforP%gj# z1^}SHYG@c)sHtf`)>$ajJhgP}f8ibJxzp*LjlJJ}7WRGB{rJi&dv_gM`}X_2;nMl@ z$K?VHU;qI6t8sTv99&;4->B@{d1CnOwf9fYwR~MV(p>B~(euoztGl+JdS~6%khvH_ z?}ZB|9Z*`by614)Lr?2ISYOGX zjmo8{+@lrH7rp=k08nKk?il;W#Xq~QcZE<6p|a=O>>`WpZM|NjF3b{`Gqipi3a00000NkvXXu0mjfc$=^Y delta 869 zcmV-r1DgEEFv&2mz6xx1Nkl11(jl<0gbK7%MOFxA9nu0V*UJB^nd@rmqOMV?TZZ{(-JNyj z=~#4|Logek&-J-|PtT9{eWD1nF$*#XlRygyfBtK+1ONb3W#pL2ag?N@Oe#vpQBv;7 zJ=Q#V+`Yp(PW|%9=I_c;Z&ay7w{ZGW#gpmfi( zuk;PfXV<@&UAXAM8Pld^>T-=k8?*vyN?HN{0IJg1Fe;PeX3u?i$?{pRz0^|7G%Z|} z6bhNK4~2s*eLu9M=dY;GX40K!&!0YXe^4&K00sb{zZyJj)YDHk&zU=E$Hqc2)3kJT zsxT;yq9~P$Cp?;Toy(m(kZWFiYwwk0+m20g0ky*~&;S5bXUyokX3uz_ZD%$rWFwc&z{f7yy8NEJ>13ib~z#mim8RCgV6xl4S60f1zB; zX3`n000S5RfPSp~SjV0N?GtClXHS$iy&i=S{&~9Xqw?M_L-Wcjhud1U0&0pkzyJVL zXK2Hywxg$u^@FC*uiw0J*R@|qjJ_|GN<|@rkKepBo|-+ z0|3xpH8zgS*VT0#@5<-vo?1Hgf5^_{{F&s=roL}K3;VbCJihYkzTL;yzWsh*xP0Nl z3Aq3R7yy9&YTVru2R9VTH!J&hog999@&4)A)~`xOTMC^gd!Jc#ZTF7T@2uMz(w9Q$ zyLj=GTtMyc1{eT<>I@lDDE0OHdA+L?b-ne*hGT7=bC#Er0i`9YdylmLL%8mP^_ASY zs9cK5y;=b^#TQ@z0IDIcrJ4<8v00000NkvXXu0mjf-7m1r diff --git a/assets/share/map/control/TECHNIQUE_POINT_4.png b/assets/share/map/control/TECHNIQUE_POINT_4.png index 1adda0efa65a8db18945891a509291d67bee0d48..d6d9e5bf356bdcbb8887a7863744616f155481ae 100644 GIT binary patch delta 790 zcmV+x1L^#>FtjkRz6t?hlfMcp0fm$63K=BoG;LvK^WU_xoSQS}(Czo<`~7ya;i+Rk zcs#D3+w=C~%_ju2F$)+7lRygyfB4TL2><}7F4Lz!8HIct)x;r}Cbdm>Ha*(aJ~A?L zwEJQ)yP9T|kS1v;r&)6P)OT_Lx8x-N0HC@=Q7#TOxu`Z5)i%^k+pzJ)`a)}Aa<*gF z?#-Kb$DtCH${|D{l(YiI%SiwLKy_(pnx2bla-q;r*SKNhsw|Da-cozMf2V%&ihCLx z>yI2c6D3g;Wg!cLL+9iI3}65Ns@2ry8TqI%A#Pp&_R7l5x_uwDE_k7krtzLnD+`v? z-7!3;=fa^Z%AzbAxN=4=zyJmSpjx%I%xtJ{TL0FH8zV{gwzm083$vfdcXWoKOJUC^ z(V~~)d`zF$_ZPuS#w{F)87|$PI0062?VPaeHW;XBH=HuPh zfBkWC=i_k{g%HB!i^a{ah4$IS2f79~tlQRms<;2LKfu7hTz~-ps4{6e*|BT?H+zmP zTpo}8J+|qUv|P%Df3KFdydI|9HQYY8f6bZ?drlsU(nKp@JQrX90IEz=!+m38#bXD4 z%h%LC^IS{sp~CU+qwc-g{j*AQ=3jYr+0hF_2eVKPX{mqUtXzNr3;;m2n%dMJLYk{B zpE=!EDb_Ap-uy>zcxZ0a(KWbc?FYYKI}%sQAuVO0(m&8AFc)x3UIG9Bs!JM@5V8=G zv|Rb(^Sw0_!h*$*jE>%XW9`nqzVm5T4xy5UQWnZu0kbg+BLW`(6aN4J0RR630QPbv UyZ#*qdjJ3c07*qoM6N<$g3KR>(EtDd delta 792 zcmV+z1Lyp-Ft#wTz6t?jlfMcp0fUq43K=ElG;LvK^WU_xoSQS}&~3lp@B96B4NqOZ zhsEP@{oJ0n7jHfxvoQ-72$Mhy34g$U7D)gAK(1!ad^`%pII4+5Ax&zVZf|~nF0RRBGilRasY6?+pA*yYto3U}z3-zVe($s9{ z?mb(!?1@7)Dpx{?LMUqmB_qr z8|#l8ITIyO6lEa`gG1-!0t{dP04A#G&9jP8X;R#};jLBGn|1p?Y+dwxDNW-P_w1K2w_eSh1rs3|$I) zKaQ5X7#C}bCw@5_CF#JGQ-5*+1~32s6IJJfPp(_DJWE@;ceFjRtfp&09LFJ!6^SpVFO@4w7$k*4XVZzS)%RPDbs z^!7U+X$9memH+^NTs1eg{B`cew5gM3J#y<)6h(_yk42$y@?fcLMt_@DfB_5uzy$Wi z{%`J|eP>)6-T7{kB+0*@u3sD9yr$4Ge{{y2Keuh$p%suTe}Dl1$X97{+xX3F!PCvh zyRZNHAvcC?UEJEfAoe2=0_b}gKO8l|NFHgakUcCau%xn12KJa0r@FP002O)(vXCZ zg^;9`>gS*BtCMOzOKR2FG*Q|qEiw(Aw3Q4^CALj^j|Eljqsq-MhNK+WXbiD%yjz&a8PNg(*;`nEmFFaQrJUQ~_LSy-l?d=>nrHF|3Z;xyR0vG@QIyr!c zk41_|F>>PgL~ZQ)_3N{+9>~a_>ZK{QmO8r%#`@AFtX91TX*qbg;8$&re+Z;Kq#`tE;P}QYods z?tg+UiehDDrCJ^OaP0Kr;;)ZZmTU!GtYiWJ0J`2MAAdACIoWEp{`n~9JTo)%VEKOi z^G^*00vG@QI$OKl-r3nHm&-jpfBOZpD2k#ewzjsWr>84}1BL+8FE_3Gy46GK6Fa|RdyfbQ3BZ-1W|9~&GPSX*1$+uM6~16D+oN~KDrQm@w^ zHdpT6z1wIk*a`$N004Bb0|$?MH}k{9#ae%Vf3w-lIX?^FN~Ln`+O>Q0jW52uy}9}O z+L~LSK>z~)KqotVa5h;fN22=qI z005mHz{et@DE1Z__fMZ1tyYINHa6<@`usxUtFP}w%8?^dS{J||fB^uYqYWQ^AtFb_ z_RjX=;?n5oJ0l|}fBxm(oo~L4lp;q&iiq{KmaVfP3nKy_fd9jv00030{{sNEF!Ckd S$FjNr0000MOz+hEn$kSOi+4>Ap%w3Q4^ZETzL9v8SVx~RKO@;uwS`>yUM_ns30 zvmpx~2!8;3mP`Nuz<%?}tMBGqM5IVLB3^&(LSZ#28e0+L(x~J#pXl>|+pYHGO7Jm^DIoeMIFd%>d0O;rdKK^1#`TW3J zmoL44((Aj#Qf2sfNH%3O@yLIbU ztJO*=rId2ctE;Q!@`171(EQ?~&CSjBlVw{00vG^*4mLb|X>9a^n>TMRFE5u$rIh}@ zx_`AOilwEcYPILX!3%S9zdc@BuobX(B@+Muu-|<0@kbLA6RlS3-;Z+6Q&Uq97w79= zd}b&>00RKf+1l;)_V#wUT<+@n#~+JDQ4~e7v9WRQ-o46^!-fI`FaQ9Z?ZAO@tyU|Q z{`+P1(4j-uu3cMSe`+Y;e{lvF0Dyg`-GAP?I5c?V@Zpt}mEGOlXE$I)M5$D&R4Vm) z{ZVsia&ofKn6(ukfB^vLV8@Q1{C?`kvC&$0cXzYd%sD>`;7X-({rdF>GmS65y0gCi z$I6OZpaB6406-@@aq?6|{5*YsWcXrVU*Fo=+Rn~SrBb z0|3zJ0em_lieh)RF@NFwK(*SlwzgKU*JoxMUw?BqQjQ#v(y9Ok1TX*q9j*7o3lTXY zwzjwC<`xD9-s$f@_sg#j?tc4Sq!c+KQbeq-v}^^lAqyh{9(07i00030{{sL^V)7-6 S%#At#0000 Date: Tue, 6 Feb 2024 22:59:01 +0800 Subject: [PATCH 22/65] Upd: Add BlackSwan into character list --- tasks/character/keywords/__init__.py | 2 + tasks/character/keywords/character_list.py | 103 +++++++++++++-------- 2 files changed, 67 insertions(+), 38 deletions(-) diff --git a/tasks/character/keywords/__init__.py b/tasks/character/keywords/__init__.py index 3e2442cc4..733d30451 100644 --- a/tasks/character/keywords/__init__.py +++ b/tasks/character/keywords/__init__.py @@ -8,6 +8,8 @@ DICT_SORTED_RANGES = { DanHengImbibitorLunae, Welt, FuXuan, + # Longer precast + BlackSwan, ], # Mage, but character moved after attack 'MageSecondary': [ diff --git a/tasks/character/keywords/character_list.py b/tasks/character/keywords/character_list.py index 4c58396b5..3470b79e4 100644 --- a/tasks/character/keywords/character_list.py +++ b/tasks/character/keywords/character_list.py @@ -39,8 +39,17 @@ Bailu = CharacterList( jp='白露', es='Bailu', ) -Blade = CharacterList( +BlackSwan = CharacterList( id=5, + name='BlackSwan', + cn='黑天鹅', + cht='黑天鵝', + en='Black Swan', + jp='ブラックスワン', + es='Cisne Negro', +) +Blade = CharacterList( + id=6, name='Blade', cn='刃', cht='刃', @@ -49,7 +58,7 @@ Blade = CharacterList( es='Blade', ) Bronya = CharacterList( - id=6, + id=7, name='Bronya', cn='布洛妮娅', cht='布洛妮婭', @@ -58,7 +67,7 @@ Bronya = CharacterList( es='Bronya', ) Clara = CharacterList( - id=7, + id=8, name='Clara', cn='克拉拉', cht='克拉拉', @@ -67,7 +76,7 @@ Clara = CharacterList( es='Clara', ) DanHeng = CharacterList( - id=8, + id=9, name='DanHeng', cn='丹恒', cht='丹恆', @@ -76,7 +85,7 @@ DanHeng = CharacterList( es='Dan Heng', ) DanHengImbibitorLunae = CharacterList( - id=9, + id=10, name='DanHengImbibitorLunae', cn='丹恒•饮月', cht='丹恆•飲月', @@ -85,7 +94,7 @@ DanHengImbibitorLunae = CharacterList( es='Dan Heng - Imbibitor Lunae', ) DrRatio = CharacterList( - id=10, + id=11, name='DrRatio', cn='真理医生', cht='真理醫生', @@ -94,7 +103,7 @@ DrRatio = CharacterList( es='Dr. Ratio', ) FuXuan = CharacterList( - id=11, + id=12, name='FuXuan', cn='符玄', cht='符玄', @@ -103,7 +112,7 @@ FuXuan = CharacterList( es='Fu Xuan', ) Gepard = CharacterList( - id=12, + id=13, name='Gepard', cn='杰帕德', cht='傑帕德', @@ -112,7 +121,7 @@ Gepard = CharacterList( es='Gepard', ) Guinaifen = CharacterList( - id=13, + id=14, name='Guinaifen', cn='桂乃芬', cht='桂乃芬', @@ -121,7 +130,7 @@ Guinaifen = CharacterList( es='Guinaifen', ) Hanya = CharacterList( - id=14, + id=15, name='Hanya', cn='寒鸦', cht='寒鴉', @@ -130,7 +139,7 @@ Hanya = CharacterList( es='Hanya', ) Herta = CharacterList( - id=15, + id=16, name='Herta', cn='黑塔', cht='黑塔', @@ -139,7 +148,7 @@ Herta = CharacterList( es='Herta', ) Himeko = CharacterList( - id=16, + id=17, name='Himeko', cn='姬子', cht='姬子', @@ -148,7 +157,7 @@ Himeko = CharacterList( es='Himeko', ) Hook = CharacterList( - id=17, + id=18, name='Hook', cn='虎克', cht='虎克', @@ -157,7 +166,7 @@ Hook = CharacterList( es='Hook', ) Huohuo = CharacterList( - id=18, + id=19, name='Huohuo', cn='藿藿', cht='藿藿', @@ -166,7 +175,7 @@ Huohuo = CharacterList( es='Huohuo', ) JingYuan = CharacterList( - id=19, + id=20, name='JingYuan', cn='景元', cht='景元', @@ -175,7 +184,7 @@ JingYuan = CharacterList( es='Jing Yuan', ) Jingliu = CharacterList( - id=20, + id=21, name='Jingliu', cn='镜流', cht='鏡流', @@ -184,7 +193,7 @@ Jingliu = CharacterList( es='Jingliu', ) Kafka = CharacterList( - id=21, + id=22, name='Kafka', cn='卡芙卡', cht='卡芙卡', @@ -193,7 +202,7 @@ Kafka = CharacterList( es='Kafka', ) Luka = CharacterList( - id=22, + id=23, name='Luka', cn='卢卡', cht='盧卡', @@ -202,7 +211,7 @@ Luka = CharacterList( es='Luka', ) Luocha = CharacterList( - id=23, + id=24, name='Luocha', cn='罗刹', cht='羅剎', @@ -211,7 +220,7 @@ Luocha = CharacterList( es='Luocha', ) Lynx = CharacterList( - id=24, + id=25, name='Lynx', cn='玲可', cht='玲可', @@ -220,7 +229,7 @@ Lynx = CharacterList( es='Lynx', ) March7th = CharacterList( - id=25, + id=26, name='March7th', cn='三月七', cht='三月七', @@ -228,8 +237,17 @@ March7th = CharacterList( jp='三月なのか', es='Siete de Marzo', ) +Misha = CharacterList( + id=27, + name='Misha', + cn='米沙', + cht='米沙', + en='Misha', + jp='ミーシャ', + es='Misha', +) Natasha = CharacterList( - id=26, + id=28, name='Natasha', cn='娜塔莎', cht='娜塔莎', @@ -238,7 +256,7 @@ Natasha = CharacterList( es='Natasha', ) Pela = CharacterList( - id=27, + id=29, name='Pela', cn='佩拉', cht='佩拉', @@ -247,7 +265,7 @@ Pela = CharacterList( es='Pela', ) Qingque = CharacterList( - id=28, + id=30, name='Qingque', cn='青雀', cht='青雀', @@ -256,7 +274,7 @@ Qingque = CharacterList( es='Qingque', ) RuanMei = CharacterList( - id=29, + id=31, name='RuanMei', cn='阮•梅', cht='阮•梅', @@ -265,7 +283,7 @@ RuanMei = CharacterList( es='Ruan Mei', ) Sampo = CharacterList( - id=30, + id=32, name='Sampo', cn='桑博', cht='桑博', @@ -274,7 +292,7 @@ Sampo = CharacterList( es='Sampo', ) Seele = CharacterList( - id=31, + id=33, name='Seele', cn='希儿', cht='希兒', @@ -283,7 +301,7 @@ Seele = CharacterList( es='Seele', ) Serval = CharacterList( - id=32, + id=34, name='Serval', cn='希露瓦', cht='希露瓦', @@ -292,7 +310,7 @@ Serval = CharacterList( es='Serval', ) SilverWolf = CharacterList( - id=33, + id=35, name='SilverWolf', cn='银狼', cht='銀狼', @@ -300,8 +318,17 @@ SilverWolf = CharacterList( jp='銀狼', es='Silver Wolf', ) +Sparkle = CharacterList( + id=36, + name='Sparkle', + cn='花火', + cht='花火', + en='Sparkle', + jp='花火', + es='Sparkle', +) Sushang = CharacterList( - id=34, + id=37, name='Sushang', cn='素裳', cht='素裳', @@ -310,7 +337,7 @@ Sushang = CharacterList( es='Sushang', ) Tingyun = CharacterList( - id=35, + id=38, name='Tingyun', cn='停云', cht='停雲', @@ -319,7 +346,7 @@ Tingyun = CharacterList( es='Tingyun', ) TopazNumby = CharacterList( - id=36, + id=39, name='TopazNumby', cn='托帕&账账', cht='托帕&帳帳', @@ -328,7 +355,7 @@ TopazNumby = CharacterList( es='Topaz y Conti', ) TrailblazerDestruction = CharacterList( - id=37, + id=40, name='TrailblazerDestruction', cn='Trailblazer•毁灭', cht='Trailblazer•毀滅', @@ -337,7 +364,7 @@ TrailblazerDestruction = CharacterList( es='Trailblazer: Destrucción', ) TrailblazerPreservation = CharacterList( - id=38, + id=41, name='TrailblazerPreservation', cn='Trailblazer•存护', cht='Trailblazer•存護', @@ -346,7 +373,7 @@ TrailblazerPreservation = CharacterList( es='Trailblazer: Conservación', ) Welt = CharacterList( - id=39, + id=42, name='Welt', cn='瓦尔特', cht='瓦爾特', @@ -355,7 +382,7 @@ Welt = CharacterList( es='Welt', ) Xueyi = CharacterList( - id=40, + id=43, name='Xueyi', cn='雪衣', cht='雪衣', @@ -364,7 +391,7 @@ Xueyi = CharacterList( es='Xueyi', ) Yanqing = CharacterList( - id=41, + id=44, name='Yanqing', cn='彦卿', cht='彥卿', @@ -373,7 +400,7 @@ Yanqing = CharacterList( es='Yanqing', ) Yukong = CharacterList( - id=42, + id=45, name='Yukong', cn='驭空', cht='馭空', From 19342eae7e2642bd5237e2a3a5cd0fc39e218fbf Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 6 Feb 2024 22:59:41 +0800 Subject: [PATCH 23/65] Upd: Rogue events in 2.0 --- tasks/rogue/keywords/curio.py | 2 +- tasks/rogue/keywords/event_option.py | 14 +++++++------- tasks/rogue/keywords/event_title.py | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tasks/rogue/keywords/curio.py b/tasks/rogue/keywords/curio.py index bfd7fedf3..87407f3d2 100644 --- a/tasks/rogue/keywords/curio.py +++ b/tasks/rogue/keywords/curio.py @@ -486,7 +486,7 @@ Fissured_Cuckoo_Clock = RogueCurio( cn='分裂咕咕钟', cht='分裂咕咕鐘', en='Fissured Cuckoo Clock', - jp='分裂鳩時計', + jp='機械式鳩時計', es='Reloj de cuco agrietado', ) Typical_Genius_Society_Gossip = RogueCurio( diff --git a/tasks/rogue/keywords/event_option.py b/tasks/rogue/keywords/event_option.py index c11560faa..f18d18677 100644 --- a/tasks/rogue/keywords/event_option.py +++ b/tasks/rogue/keywords/event_option.py @@ -441,8 +441,8 @@ You_re_not_a_reliable_investment_manager = RogueEventOption( cn='你不是一个值得信任的*投资经理*。', cht='你不是一個值得信任的*投資經理*。', en='You\'re not a reliable "investment manager."', - jp='{F#あんた}{M#お前}は信頼できる※ファンドマネージャー※ではない', - es='No eres {F#una}{M#un} "{F#gestora}{M#gestor} de inversiones" fiable.', + jp='は信頼できる※ファンドマネージャー※ではない', + es='No eres " de inversiones" fiable.', ) I_hate_this_era = RogueEventOption( id=50, @@ -1765,7 +1765,7 @@ Hide_under_the_boat_together = RogueEventOption( cht='一起躲在船底。', en='Hide under the boat together.', jp='一緒に船底に隠れる', - es='Escóndanse junt{F#as}{M#os} debajo del bote.', + es='Escóndanse junt debajo del bote.', ) Bottoms_up = RogueEventOption( id=197, @@ -2179,7 +2179,7 @@ Release_them_together_from_the_pain = RogueEventOption( cht='將牠們一併從「痛苦」中釋放。', en='Release them together from the "pain."', jp='彼らをまとめて「苦痛」から解放する', - es='Libéral{F#as}{M#os} junt{F#as}{M#os} del "dolor".', + es='Libéral junt del "dolor".', ) Give_the_adult_beast_a_send_off = RogueEventOption( id=243, @@ -2988,7 +2988,7 @@ Adjust_Intra_Cognition_I_am_organic = RogueEventOption( cn='调整「自我认知」-我是有机。', cht='調整「自我認知」-我是有機。', en='Adjust Intra-Cognition — I am organic.', - jp='「自己認識」を調整-{F#私}{M#俺}は有機生命体', + jp='「自己認識」を調整-は有機生命体', es='Ajusta tu autopercepción: soy orgánico.', ) Adjust_Intra_Cognition_I_am_inorganic = RogueEventOption( @@ -2997,7 +2997,7 @@ Adjust_Intra_Cognition_I_am_inorganic = RogueEventOption( cn='调整「自我认知」-我是无机。', cht='調整「自我認知」-我是無機。', en='Adjust Intra-Cognition — I am inorganic.', - jp='「自己認識」を調整-{F#私}{M#俺}は無機生命体', + jp='「自己認識」を調整-は無機生命体', es='Ajusta tu autopercepción: soy inorgánico.', ) Pick_a_family_element = RogueEventOption( @@ -3214,5 +3214,5 @@ Forced_to_fight = RogueEventOption( cht='被迫戰鬥。', en='Forced to fight.', jp='戦闘を強いられる', - es='Obligad{F#a}{M#o} a combatir.', + es='Obligad a combatir.', ) diff --git a/tasks/rogue/keywords/event_title.py b/tasks/rogue/keywords/event_title.py index 6b03050d9..86490d346 100644 --- a/tasks/rogue/keywords/event_title.py +++ b/tasks/rogue/keywords/event_title.py @@ -199,7 +199,7 @@ Cosmic_Altruist_Part_3 = RogueEventTitle( cn='银河好人(其三)', cht='銀河好人(其三)', en='Cosmic Altruist (Part 3)', - jp='銀河のお人好し(その3)', + jp='銀河のお人よし(その3)', es='Altruismo galáctico (III)', option_ids=[81, 82, 83, 84, 85], ) @@ -269,7 +269,7 @@ We_Are_Cowboys = RogueEventTitle( cn='我们是牛仔', cht='我們是牛仔', en='We Are Cowboys', - jp='俺たちカウボーイ', + jp='僕たちカウボーイ', es='Somos vaqueros', option_ids=[104, 105, 106, 107, 108], ) @@ -879,7 +879,7 @@ The_Perfect_Grand_Challenge = RogueEventTitle( cn='*完美*大挑战!', cht='*完美*大挑戰!', en='The *Perfect* Grand Challenge!', - jp='※完璧※大挑戦!', + jp='「完璧」大挑戦!', es='¡El gran desafío perfecto!', option_ids=[142, 258, 259, 260, 261], ) From 18666ce8172153ea3746fb9f3531c81cea33a8c4 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 6 Feb 2024 23:03:42 +0800 Subject: [PATCH 24/65] Upd: Add assignments in 2.0 --- tasks/assignment/keywords/__init__.py | 4 ++ tasks/assignment/keywords/entry.py | 54 ++++++++++++++++++++++----- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/tasks/assignment/keywords/__init__.py b/tasks/assignment/keywords/__init__.py index 9112ad297..9d3e39402 100644 --- a/tasks/assignment/keywords/__init__.py +++ b/tasks/assignment/keywords/__init__.py @@ -11,6 +11,8 @@ KEYWORDS_ASSIGNMENT_GROUP.Character_Materials.entries = ( KEYWORDS_ASSIGNMENT_ENTRY.Born_to_Obey, KEYWORDS_ASSIGNMENT_ENTRY.Root_Out_the_Turpitude, KEYWORDS_ASSIGNMENT_ENTRY.Fire_Lord_Inflames_Blades_of_War, + KEYWORDS_ASSIGNMENT_ENTRY.A_Startling_Night_Terror, + KEYWORDS_ASSIGNMENT_ENTRY.Tranquility_of_Vimala_bhumi, ) KEYWORDS_ASSIGNMENT_GROUP.EXP_Materials_Credits.entries = ( KEYWORDS_ASSIGNMENT_ENTRY.Nameless_Land_Nameless_People, @@ -24,6 +26,8 @@ KEYWORDS_ASSIGNMENT_GROUP.Synthesis_Materials.entries = ( KEYWORDS_ASSIGNMENT_ENTRY.The_Blossom_in_the_Storm, KEYWORDS_ASSIGNMENT_ENTRY.Legend_of_the_Puppet_Master, KEYWORDS_ASSIGNMENT_ENTRY.The_Wages_of_Humanity, + KEYWORDS_ASSIGNMENT_ENTRY.Fragments_of_Illusory_Dreams, + KEYWORDS_ASSIGNMENT_ENTRY.Scalpel_and_Screwdriver, ) KEYWORDS_ASSIGNMENT_EVENT_GROUP.Space_Station_Task_Force.entries = ( KEYWORDS_ASSIGNMENT_EVENT_ENTRY.Repulsion_Bridge_Errors, diff --git a/tasks/assignment/keywords/entry.py b/tasks/assignment/keywords/entry.py index 65325ad22..cab71c000 100644 --- a/tasks/assignment/keywords/entry.py +++ b/tasks/assignment/keywords/entry.py @@ -57,8 +57,26 @@ Fire_Lord_Inflames_Blades_of_War = AssignmentEntry( jp='剣戟を焼却する火帝炉', es='Prendan los fuelles, fundan las armas', ) -Nameless_Land_Nameless_People = AssignmentEntry( +A_Startling_Night_Terror = AssignmentEntry( id=7, + name='A_Startling_Night_Terror', + cn='劫梦惊魂', + cht='劫夢驚魂', + en='A Startling Night Terror', + jp='魂震える悪夢', + es='Pesadilla aterradora', +) +Tranquility_of_Vimala_bhumi = AssignmentEntry( + id=8, + name='Tranquility_of_Vimala_bhumi', + cn='离垢清净', + cht='離垢清淨', + en='Tranquility of Vimala-bhumi', + jp='離垢清浄', + es='Limpieza y purificación', +) +Nameless_Land_Nameless_People = AssignmentEntry( + id=9, name='Nameless_Land_Nameless_People', cn='无名之地,无名之人', cht='無名之地,無名之人', @@ -67,7 +85,7 @@ Nameless_Land_Nameless_People = AssignmentEntry( es='Lugar anónimo, personas anónimas', ) Akashic_Records = AssignmentEntry( - id=8, + id=10, name='Akashic_Records', cn='阿卡夏记录', cht='阿卡夏紀錄', @@ -76,7 +94,7 @@ Akashic_Records = AssignmentEntry( es='Los Registros de Akasha', ) The_Invisible_Hand = AssignmentEntry( - id=9, + id=11, name='The_Invisible_Hand', cn='看不见的手', cht='看不見的手', @@ -85,7 +103,7 @@ The_Invisible_Hand = AssignmentEntry( es='La mano invisible', ) Abandoned_and_Insulted = AssignmentEntry( - id=10, + id=12, name='Abandoned_and_Insulted', cn='被废弃与损害的', cht='被廢棄與損害的', @@ -94,7 +112,7 @@ Abandoned_and_Insulted = AssignmentEntry( es='Abandonado e insultado', ) Spring_of_Life = AssignmentEntry( - id=11, + id=13, name='Spring_of_Life', cn='生命之泉', cht='生命之泉', @@ -103,7 +121,7 @@ Spring_of_Life = AssignmentEntry( es='La fuente de la vida', ) The_Land_of_Gold = AssignmentEntry( - id=12, + id=14, name='The_Land_of_Gold', cn='黄金大地', cht='黃金大地', @@ -112,7 +130,7 @@ The_Land_of_Gold = AssignmentEntry( es='Tierra de oportunidades', ) The_Blossom_in_the_Storm = AssignmentEntry( - id=13, + id=15, name='The_Blossom_in_the_Storm', cn='风暴中怒放的花', cht='風暴中怒放的花', @@ -121,7 +139,7 @@ The_Blossom_in_the_Storm = AssignmentEntry( es='Flores en la tormenta', ) Legend_of_the_Puppet_Master = AssignmentEntry( - id=14, + id=16, name='Legend_of_the_Puppet_Master', cn='偃师传说', cht='偃師傳說', @@ -130,7 +148,7 @@ Legend_of_the_Puppet_Master = AssignmentEntry( es='La leyenda del titiritero', ) The_Wages_of_Humanity = AssignmentEntry( - id=15, + id=17, name='The_Wages_of_Humanity', cn='赡养人类', cht='贍養人類', @@ -138,3 +156,21 @@ The_Wages_of_Humanity = AssignmentEntry( jp='人類扶養', es='La paga de la humanidad', ) +Fragments_of_Illusory_Dreams = AssignmentEntry( + id=18, + name='Fragments_of_Illusory_Dreams', + cn='幻梦的残片', + cht='幻夢的殘片', + en='Fragments of Illusory Dreams', + jp='幻夢の残片', + es='Fragmentos de sueños ilusorios', +) +Scalpel_and_Screwdriver = AssignmentEntry( + id=19, + name='Scalpel_and_Screwdriver', + cn='手术刀与螺丝刀', + cht='手術刀與螺絲起子', + en='Scalpel and Screwdriver', + jp='メスとスクリュードライバー', + es='Bisturí y destornillador', +) From 94b7bc4566c3d880c745c1e4a1bf8507cc6da7f9 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 6 Feb 2024 23:11:12 +0800 Subject: [PATCH 25/65] Upd: Support reward assets --- .../support_reward/CAN_GET_REWARD.png | Bin 10875 -> 6845 bytes .../support_reward/CLICKING_REWARD.png | Bin 8928 -> 0 bytes .../freebies/support_reward/IN_PROFILE.png | Bin 7386 -> 6899 bytes .../assets/assets_freebies_support_reward.py | 26 ++++++------------ 4 files changed, 8 insertions(+), 18 deletions(-) delete mode 100644 assets/share/freebies/support_reward/CLICKING_REWARD.png diff --git a/assets/share/freebies/support_reward/CAN_GET_REWARD.png b/assets/share/freebies/support_reward/CAN_GET_REWARD.png index 3a8c3074a825d4d67ab98538b065f03077961f19..afaf00938738b46dd44003cc2bf6fd66a93a2063 100644 GIT binary patch literal 6845 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 literal 10875 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 diff --git a/assets/share/freebies/support_reward/CLICKING_REWARD.png b/assets/share/freebies/support_reward/CLICKING_REWARD.png deleted file mode 100644 index e0b3c597a55dad4047f737c1d3eccf31956069f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8928 zcmeHNdr;HYwvI}xwrW)FtrjG)?J3;$D53)4$Rpa?YpD=wE1*D#_<#}!;b906l5oTW z^*WNyO%=*3tyWY51jG_xTQQs(e<9-eFX{uXtA=Nt=z?`*qQQj@KL4 zf3bD*sRut?4!N?wuIrbGnh^w^!>Ms}evp!5ly~$*-}!n~qRU#|cCmGgiI>dGTx?*t zN6ev#l1<+ELF;b-BMVCd_4({wFslMV%e`iA$g=ed-7~8z7R>rMkdN0?99zD1q3h!d zTIMxd>p-g(x`RtYmyT)aNi2EJ5=tx~;u3NEZh3@BMBedmKPJ+$qrU02v^Fx;uF`h9|y>Mw1>yCM(^;w7!Ji z|BhSK3ANuyaVMr_#4Q~kJ(TyC7L_*$q+d>?2G?qYYQK*aGk)oKmmOdiXojq|hqG*3 zx%(&B3FM2Q0 z#bX4UBaARLuP=Wxn!VfSLZT>;*j|5Xd(I)MZitTMw8o;SGR9MwTLDHJhnn`Ji&|6T z=mra&?>Zb{fHCvX{bPCQR1zaoFr0*p#uX<4qp3KLh=n#OswEu{VaX>pe41R#SrA3N zp;fE78TSmW7~RCg@0K8{eG3fRKrN#&X(PMVQpti_icQzdN%X`32&Cp95k)XC z%Nzz)j%`Y)(a&2fy2n=zXnt3Pn383m4!DY+V6CNOKuAu5vmLJ^G9sdS8bZ&~zgbjO z!58jM9mVN!Od@Ir+?*T0ou%lybELXkM0A?)nNc3FBIEn>Iw_Iq>SQU~>@D=n?$y+5T_sMbp{19h-p0smSxIj{R+S9@mh5jvWVY?9n+l0Glu zCxb`Gi7BU{wxtWQ08vpw&s8?uxR8b<@(e_+yIB#iaMy>c zLgw8LBjq5m`W#Q~*J7=T?ax@A-&>_k>#vICs{M|uLewmRJbx{4!$A zCALOaZ9!Q9>os1g9M|@WD?34VGnWjj*?qw|s0`<47 z*b^XGx7YRdE=ojD-Z-`7sQ$>v!K1Py*C$Q6xEXtKOPS$Wu@;B zM%y6G#1Mpa?FM5dIOe+M?g7ouDvpsC7871>)KK6ZDB@iA&S&zz(r!h$S!6%ydSUIZ z(uT`U@dPJPd`08uQB9Z+4j=*zRu_qYp3Uv~<=+|ub_{VrwCs+)e@^(SW@L!!LIDv##60(74Z$-Nm_| zHrqwnf&)UZPQfKm<{?{JR^W$-AP#99mR}N_miX3z$N3HlYb7oYwh|ZGFdIGv2cOYM zsrNR!FY&Df(dE|8W=A_e)y2#KVvDkzBxT-lb?_@DasCdpK!F&Fb|WBi1`O(C*_&(} znK2Fm&$7A<L{)pT41(`yqp{227x*%EPXJD>NP8q< z3GedNe`Cs1^Sgzp$e8fy-4S>0oTri_HHVLhYYv{J)IivOx(i*~SazzU5u<#P`I)hd zR~SkcqpW`+uUc z-DF6d!{ikL#uWRMK^bvf^7vfC*}ooq3+3{YsBYwc$s~ajVX}P#a;e}3PrxhJ@JQ5q zB?il?Eiu>@nToZx!cgX2FyHM=*b_yr+Y%LF)vbsLhcgO_@?S2-k^@(}oZV#p(c7{a z3uv6zo!Mo3W}rZ89HeqZYhE{rtf*18crFBzzjp-xun zYtA%9Z#zI~Z6?}HsKHqRerG`mP8rI~&CJ`_vF$C>R#ira_f(V0KLh1`p;&LL`Vsca zcA@XzDK#}Zr?Y>I)O~4w`ZPgj+_d}{j>Z6*Mzmqi>FiQ-=613GHE`GWM|JClgfritMpK5(eG-p+1X6x%@a>{&+qb-kX!Rs!1-CZ+zwcx06<`G3c z#iwWbg0wPW!VDJ$EuY;N&GFKhoXvKd_wNc9wmc{CkbB1Cf`?HXoY2Jxv*O?h{Kv-p zPGQL4e1sDa2O)Hr2G`ElVP;#&H%7Hu-CK*2Zi!MH=nVE5IMqHBJNOZ39bsiK6mw}g zm`0YY9zZ<}wJe{|ZG5xr6B0nPO9@1j!s0*{%9qE)m}@4xNQ0D0+5VPgx%$)G4i~^i z)W6hB@%>h)0%vex?P4)bWS2}1{G{HhZmHUK#9&n>>%&*Bla6mZ*6~LF_J$7mmREln zF(&dk1~gn{bx%3Zv7X_nJLhomyAiX7j^9Qv4CY66vEHv>BKJh;VJpkG)ef8fCOE9R zd(3*r_{t$X_;>Z^Z?-&q;+X?GUW5%Njc;F;z70Q|&muUOiFzJ`XFwzAI@zS@mSS=& zZW;h4)X?)SP?#;17IVF{DY>0fU}q>1eluxNb0>cM2YtwAYqAuZKC#Zre6yZEl%W^q z8>THL2m2bZZskA9k(%_%z-4{6-)g&|m@gTLDdD87s3bBW{pNuAOGOn0^D04D>D5>$?g;?v9BZ6lLqe!gApH+O!LzaDB=@H zBaKF3$YnA|3LhH$iOp|8EQHqc{24mdV29`U1KG^lXE4bcY8jIAe4e39BX&oxIVqj% zA-LP^X46%9S)DmGIqdvzbFK^7zc)QV%eU(v-^&((*XgGsM;4I!%_)0O&ke?8PXqUz zY9p9>X82`cqnkr?^ms94*k`ME(){c;FHqV2k{=mR@=S@1u;afI zolHTBli=lwgrOBNF|<-Ns|#yhVVRWb<|g*xTt}IrpS}vz?1K`OQHr4a{!zVGrMNeH z^2U1)8AP=UJRSJfgI}Chc(!kvxBGWU(7@Hz0~s{FTn!bt$$~*>R#q0yFvc|bsIq9p zQ7<^3TE37V?2SqqMssjsqRI6&K;G#o(*z0w4?l5>Q2yfqhwa?pCT-K0TX4UIwb~zjaE@d1@)Gx^MEfCvUlGQ;=hb z-W(-i-H@MEPMD_n4WHgdDLhz~PsxvDK~Xc=ZDW&MW!%^I{|XG=`!g25yyDeW*8kiN zMhIDwCrF#5?hGJ7-VP>P2L8!e zL+hs$rP?ODp2DDrO9X|gv3Cd5dL*c=#lIE=mtt>^6O3FKZzi|&g!4oFJ-4qf2`LhC zT`j|!lx-j2@Zp3Pl&Co8+Jj_hbXh3G-bF4svV&)R5#hoY7Ji5AH&y+Ka|Efdq18Mr z3>$5`)I+c)c9%JU^*%xJ%w3)O1YIsJ>HL&>vzeVi<_A68m`zV=xOm6a&%hO7qSl~D1>Ge`#pSz_k@5g|Kg}(qxb@>1D ze-38(V_hp2qQbNLED0D2__$XW*DYp&Dngbm{)@<143R*$7sEKv+0}a&B=aiYiUqTN nG3WwqeG>%!e;D{HTDI(R-3!sqpO<+Sb`bj&Vt>aM$Iko@dNdon diff --git a/assets/share/freebies/support_reward/IN_PROFILE.png b/assets/share/freebies/support_reward/IN_PROFILE.png index 2e0aadee801f88ad57cddebe65becf53626b78fe..b6392d7fddc90d944f434ade5bde0e83389641e0 100644 GIT binary patch literal 6899 zcmeI1hcn#4-^ag*^&a^>&;Rhu{3biI^Vyl5+5Nm<`<~sM-M6~hYP8gB)Bpg`szV>b0D$tm zN&W*wejb##HOS5bl`GW50|02Q{;gy{N*XHwP;0?eRCIOi5uOMSdxR^Gx{3;qt2@FL z?qmZ1z7y&CKE`oG7KK@&4ZWfA*j9Ox(@TJtuL#t|V3N%c3s{CSFemTSSh$AOLCJs?TtaWs<3S0gx`ZEWK08};^N{&g zr*dUW@C^oAszu(kq*T7E&=m^JzRLi>b~y0$Oj;txOS42d0`z3Oo0hQz<&17Tw;nZgQzrzTm^obHz#z);Q zIZh608k!9OtB;u53lRz=iC>7hh`@vM-m^)+Ex;{BDY>{MC*;)4(#5+37PW%Ape*h} zT;V(G3=2Aqx-l>>S#Bo6{BGO$ZJjQ!RwuF^7V{ADJz<`4HR#SZcj75koDVHf^jfDy zyXI0g&Z#AElZ-rq&UnxpPzv0=^`4C;24Jw0yn`eHKpgfEtt3na^d{vl06^1kRzH&CTfXOW{K2*BQ-y+ALd~q?DgZd+D;)82XT4cs9 zRF_e(WnD@6#ZdKCT$*-ej?wHT-W7cDIcr8MYtw703lF+LS1lnjZ?0HHjq&z@z{yb; zcrBrlvB9}Kt8bX}c-y<&bIA*o9b(L(d^@+?neIoLDIG;mcJbVKck-@DO+5Z(g&xIE zaxbO&&)jV9I6toI#mLGjE8N$Rx;($#*c~wHz8b*41s6Y>8@JDLHX&v$1ZA9Lj

ZK*yHct7HgSg+TYA;Qf2eQ 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

U z5$0aNsy2Ju?H-%DD7as2=J=aMlvc0kBgkWA4z=xsa^b%oJtV&j^qzZE71CYt0uDzW zCw}EaG&eP4y?0vwv~PbOKU~sKbByI*f=?Hz z;o+0N!ZIX613C9v7C@m?$ud`>@uosDqExFdQ%lvVNnuYYdP zxK^_%`&OvhFjc_Hbyw{vmpVf}90kTH;$aBGZOw%7yg5Z-K9!UtZ z%(Po9?m45Mk~ZbLDnzJF5-BNJfo4H5a=>0t4`c#@&{*zG{Omb_iDr^|`{|M%hlzE% z?3WaK*3?#2#Se;1N{)G~w}nahOw>C4zJK&phv{No^nBX~JO>0LH> zVwg~Og$Rua%Mzz22$;P+^zN_wx<+F7;h~bf=Q|__^6;+{mgZ4Rv67tExYqF{+EXc* z`<2FpRnr-!8nOH*2v?9E(>w~2nP-ynsgLa9f9YZJPu4#I{|Nje@Q=Vh0{;m7e-KFN g3OfI{B9SP75-E{Rk%O74zgeiOYCkMde*Wrz02oeOL;wH) literal 7386 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 r>?Y0K7X Date: Wed, 7 Feb 2024 02:32:40 +0800 Subject: [PATCH 26/65] Dev: Extract map worlds and planes, add extract framework --- dev_tools/keyword_extract.py | 111 ++----------------- dev_tools/keywords/base.py | 184 ++++++++++++++++++++++++++++++++ dev_tools/keywords/map_plane.py | 70 ++++++++++++ dev_tools/keywords/map_world.py | 33 ++++++ tasks/map/bigmap/plane.py | 6 +- tasks/map/keywords/classes.py | 80 ++++++++++---- tasks/map/keywords/plane.py | 129 ++++++++++++++++++++++ tasks/map/keywords/world.py | 17 +++ tasks/map/resource/resource.py | 4 +- 9 files changed, 501 insertions(+), 133 deletions(-) create mode 100644 dev_tools/keywords/base.py create mode 100644 dev_tools/keywords/map_plane.py create mode 100644 dev_tools/keywords/map_world.py diff --git a/dev_tools/keyword_extract.py b/dev_tools/keyword_extract.py index 64e1191a1..e82f5073c 100644 --- a/dev_tools/keyword_extract.py +++ b/dev_tools/keyword_extract.py @@ -3,26 +3,15 @@ import os import re import typing as t from collections import defaultdict -from functools import cache, cached_property +from functools import cache from hashlib import md5 +from dev_tools.keywords.base import TextMap, UI_LANGUAGES, replace_templates, text_to_variable from module.base.code_generator import CodeGenerator from module.config.utils import deep_get, read_file from module.exception import ScriptError from module.logger import logger -UI_LANGUAGES = ['cn', 'cht', 'en', 'jp', 'es'] - - -def text_to_variable(text): - text = re.sub("'s |s' ", '_', text) - text = re.sub('[ \-—:\'/•.]+', '_', text) - text = re.sub(r'[(),#"?!&%*]|', '', text) - # text = re.sub(r'[#_]?\d+(_times?)?', '', text) - text = re.sub(r'', '', text) - text = text.replace('é', 'e') - return text.strip('_') - def dungeon_name(name: str) -> str: name = text_to_variable(name) @@ -61,72 +50,6 @@ def convert_inner_character_to_keyword(name): return convert_dict.get(name, name) -class TextMap: - DATA_FOLDER = '' - - def __init__(self, lang: str): - self.lang = lang - - def __contains__(self, name: t.Union[int, str]) -> bool: - if isinstance(name, int) or (isinstance(name, str) and name.isdigit()): - return int(name) in self.data - return False - - @cached_property - def data(self) -> dict[int, str]: - if not os.path.exists(TextMap.DATA_FOLDER): - logger.critical('`TextMap.DATA_FOLDER` does not exist, please set it to your path to StarRailData') - exit(1) - file = os.path.join(TextMap.DATA_FOLDER, 'TextMap', f'TextMap{self.lang.upper()}.json') - data = {} - for id_, text in read_file(file).items(): - text = text.replace('\u00A0', '') - text = text.replace(r'{NICKNAME}', 'Trailblazer') - data[int(id_)] = text - return data - - def find(self, name: t.Union[int, str]) -> tuple[int, str]: - """ - Args: - name: - - Returns: - text id (hash in TextMap) - text - """ - if isinstance(name, int) or (isinstance(name, str) and name.isdigit()): - name = int(name) - try: - return name, self.data[name] - except KeyError: - pass - - name = str(name) - for row_id, row_name in self.data.items(): - if row_id >= 0 and row_name == name: - return row_id, row_name - for row_id, row_name in self.data.items(): - if row_name == name: - return row_id, row_name - logger.error(f'Cannot find name: "{name}" in language {self.lang}') - return 0, '' - - -def replace_templates(text: str) -> str: - """ - Replace templates in data to make sure it equals to what is shown in game - - Examples: - replace_templates("Complete Echo of War #4 time(s)") - == "Complete Echo of War 1 time(s)" - """ - text = re.sub(r'#4', '1', text) - text = re.sub(r'', '', text) - text = re.sub(r'', '', text) - text = re.sub(r'{.*?}', '', text) - return text - - class KeywordExtract: def __init__(self): self.text_map: dict[str, TextMap] = {lang: TextMap(lang) for lang in UI_LANGUAGES} @@ -438,32 +361,10 @@ class KeywordExtract: self.write_keywords(keyword_class=class_name, output_file=output_file) def generate_map_planes(self): - planes = { - 'Special': ['黑塔的办公室', '锋芒崭露'], - 'Rogue': [ '区域-战斗', '区域-事件', '区域-遭遇', '区域-休整', '区域-精英', '区域-首领', '区域-交易'], - 'Herta': ['观景车厢', '主控舱段', '基座舱段', '收容舱段', '支援舱段', '禁闭舱段'], - 'Jarilo': ['行政区', '城郊雪原', '边缘通路', '铁卫禁区', '残响回廊', '永冬岭', - '造物之柱', '旧武器试验场', '磐岩镇', '大矿区', '铆钉镇', '机械聚落'], - 'Luofu': ['星槎海中枢', '流云渡', '迴星港', '长乐天', '金人巷', '太卜司', - '工造司', '绥园', '丹鼎司', '鳞渊境'], - } - - def text_convert(world_): - def text_convert_wrapper(name): - name = text_to_variable(name).replace('_', '') - name = f'{world_}_{name}' - return name - - return text_convert_wrapper - - gen = None - for world, plane in planes.items(): - self.load_keywords(plane) - gen = self.write_keywords(keyword_class='MapPlane', output_file='', - text_convert=text_convert(world), generator=gen) - gen.write('./tasks/map/keywords/plane.py') - self.load_keywords(['Herta Space Station', 'Jarilo-VI', 'The Xianzhou Luofu'], lang='en') - self.write_keywords(keyword_class='MapWorld', output_file='./tasks/map/keywords/world.py') + from dev_tools.keywords.map_world import GenerateMapWorld + GenerateMapWorld()() + from dev_tools.keywords.map_plane import GenerateMapPlane + GenerateMapPlane()() def generate_character_keywords(self): self.load_character_name_keywords() diff --git a/dev_tools/keywords/base.py b/dev_tools/keywords/base.py new file mode 100644 index 000000000..cc71b7f55 --- /dev/null +++ b/dev_tools/keywords/base.py @@ -0,0 +1,184 @@ +import os +import re +import typing as t +from functools import cached_property + +from module.base.code_generator import CodeGenerator +from module.config.utils import read_file +from module.logger import logger + +UI_LANGUAGES = ['cn', 'cht', 'en', 'jp', 'es'] + + +class TextMap: + DATA_FOLDER = '' + + def __init__(self, lang: str): + self.lang = lang + + def __contains__(self, name: t.Union[int, str]) -> bool: + if isinstance(name, int) or (isinstance(name, str) and name.isdigit()): + return int(name) in self.data + return False + + @cached_property + def data(self) -> dict[int, str]: + if not os.path.exists(TextMap.DATA_FOLDER): + logger.critical('`TextMap.DATA_FOLDER` does not exist, please set it to your path to StarRailData') + exit(1) + file = os.path.join(TextMap.DATA_FOLDER, 'TextMap', f'TextMap{self.lang.upper()}.json') + data = {} + for id_, text in read_file(file).items(): + text = text.replace('\u00A0', '') + text = text.replace(r'{NICKNAME}', 'Trailblazer') + data[int(id_)] = text + return data + + def find(self, name: t.Union[int, str]) -> tuple[int, str]: + """ + Args: + name: + + Returns: + text id (hash in TextMap) + text + """ + if isinstance(name, int) or (isinstance(name, str) and name.isdigit()): + name = int(name) + try: + return name, self.data[name] + except KeyError: + pass + + name = str(name) + for row_id, row_name in self.data.items(): + if row_id >= 0 and row_name == name: + return row_id, row_name + for row_id, row_name in self.data.items(): + if row_name == name: + return row_id, row_name + logger.error(f'Cannot find name: "{name}" in language {self.lang}') + return 0, '' + + +def text_to_variable(text): + text = re.sub("'s |s' ", '_', text) + text = re.sub(r'[ \-—:\'/•.]+', '_', text) + text = re.sub(r'[(),#"?!&%*]|', '', text) + # text = re.sub(r'[#_]?\d+(_times?)?', '', text) + text = re.sub(r'', '', text) + text = text.replace('é', 'e') + return text.strip('_') + + +def replace_templates(text: str) -> str: + """ + Replace templates in data to make sure it equals to what is shown in game + + Examples: + replace_templates("Complete Echo of War #4 time(s)") + == "Complete Echo of War 1 time(s)" + """ + text = re.sub(r'#4', '1', text) + text = re.sub(r'', '', text) + text = re.sub(r'', '', text) + text = re.sub(r'{.*?}', '', text) + return text + + +class GenerateKeyword: + text_map: dict[str, TextMap] = {lang: TextMap(lang) for lang in UI_LANGUAGES} + text_map['cn'] = TextMap('chs') + + @staticmethod + def read_file(file: str) -> dict: + """ + Args: + file: ./ExcelOutput/GameplayGuideData.json + + Returns: + dict: + """ + file = os.path.join(TextMap.DATA_FOLDER, file) + return read_file(file) + + @classmethod + def find_keyword(cls, keyword, lang) -> tuple[int, str]: + """ + Args: + keyword: text string or text id + lang: Language to find + + Returns: + text id (hash in TextMap) + text + """ + text_map = cls.text_map[lang] + return text_map.find(keyword) + + output_file = '' + + def __init__(self): + self.gen = CodeGenerator() + self.keyword_class = self.__class__.__name__.removeprefix('Generate') + self.keyword_index = 0 + self.keyword_format = { + 'id': 0, + 'name': 'Unnamed_Keyword' + } + for lang in UI_LANGUAGES: + self.keyword_format[lang] = '' + + def gen_import(self): + self.gen.Import( + f""" + from .classes import {self.keyword_class} + """ + ) + + def iter_keywords(self) -> t.Iterable[dict]: + """ + Yields + dict: {'text_id': 123456, 'any_attr': 1} + """ + pass + + def convert_name(self, text: str, keyword: dict) -> str: + return text_to_variable(text) + + def format_keywords(self, keyword: dict) -> dict | None: + base = self.keyword_format.copy() + text_id = keyword.pop('text_id') + if text_id is None: + return + # id + self.keyword_index += 1 + base['id'] = self.keyword_index + # Attrs + base.update(keyword) + # Name + _, name = self.find_keyword(text_id, lang='en') + name = self.convert_name(replace_templates(name), keyword=base) + base['name'] = name + # Translations + for lang in UI_LANGUAGES: + value = replace_templates(self.find_keyword(text_id, lang=lang)[1]) + base[lang] = value + return base + + def generate(self): + self.gen_import() + self.gen.CommentAutoGenerage('dev_tools.keyword_extract') + + for keyword in self.iter_keywords(): + keyword = self.format_keywords(keyword) + with self.gen.Object(key=keyword['name'], object_class=self.keyword_class): + for key, value in keyword.items(): + self.gen.ObjectAttr(key, value) + + if self.output_file: + print(f'Write {self.output_file}') + self.gen.write(self.output_file) + + def __call__(self, *args, **kwargs): + self.generate() diff --git a/dev_tools/keywords/map_plane.py b/dev_tools/keywords/map_plane.py new file mode 100644 index 000000000..dec382cff --- /dev/null +++ b/dev_tools/keywords/map_plane.py @@ -0,0 +1,70 @@ +import typing as t + +from dev_tools.keywords.base import GenerateKeyword +from module.base.decorator import cached_property +from module.config.utils import deep_get + + +class GenerateMapPlane(GenerateKeyword): + output_file = './tasks/map/keywords/plane.py' + + @cached_property + def data(self): + return self.read_file('./ExcelOutput/AreaMapConfig.json') + + def iter_planes(self) -> t.Iterable[dict]: + for plane_id, data in self.data.items(): + plane_id = int(plane_id) + world_id = int(str(plane_id)[-5]) + sort_id = int(deep_get(data, 'MenuSortID', 0)) + text_id = deep_get(data, 'Name.Hash') + yield dict( + text_id=text_id, + world_id=world_id, + plane_id=plane_id, + sort_id=sort_id, + ) + + def iter_keywords(self) -> t.Iterable[dict]: + """ + 1010201 + ^^ floor + ^^ plane + ^ world + """ + def to_id(name): + return self.find_keyword(name, lang='cn')[0] + + domains = ['黑塔的办公室', '锋芒崭露'] + for index, domain in enumerate(domains): + yield dict( + text_id=to_id(domain), + world_id=-1, + plane_id=index + 1, + ) + domains = ['区域-战斗', '区域-事件', '区域-遭遇', '区域-休整', '区域-精英', '区域-首领', '区域-交易'] + for index, domain in enumerate(domains): + yield dict( + text_id=to_id(domain), + world_id=-2, + plane_id=index + 1, + ) + + keywords = sorted(self.iter_planes(), key=lambda x: (x['world_id'], x['sort_id'])) + for keyword in keywords: + keyword.pop('sort_id') + yield keyword + + def convert_name(self, text: str, keyword: dict) -> str: + text = super().convert_name(text, keyword=keyword) + text = text.replace('_', '') + + from tasks.map.keywords import MapWorld + world = MapWorld.find_world_id(keyword['world_id']) + if world is None: + if text.startswith('Domain'): + return f'Rogue_{text}' + else: + return f'Special_{text}' + else: + return f'{world.short_name}_{text}' diff --git a/dev_tools/keywords/map_world.py b/dev_tools/keywords/map_world.py new file mode 100644 index 000000000..2adde7341 --- /dev/null +++ b/dev_tools/keywords/map_world.py @@ -0,0 +1,33 @@ +import typing as t + +from dev_tools.keywords.base import GenerateKeyword + + +class GenerateMapWorld(GenerateKeyword): + output_file = './tasks/map/keywords/world.py' + + def iter_keywords(self) -> t.Iterable[dict]: + + def to_id(name): + return self.find_keyword(name, lang='en')[0] + + yield dict( + text_id=to_id('Herta Space Station'), + world_id=0, + short_name='Herta' + ) + yield dict( + text_id=to_id('Jarilo-VI'), + world_id=1, + short_name='Jarilo' + ) + yield dict( + text_id=to_id('The Xianzhou Luofu'), + world_id=2, + short_name='Luofu' + ) + yield dict( + text_id=to_id('Penacony'), + world_id=3, + short_name='Penacony' + ) \ No newline at end of file diff --git a/tasks/map/bigmap/plane.py b/tasks/map/bigmap/plane.py index 32c6eb812..afc6caf52 100644 --- a/tasks/map/bigmap/plane.py +++ b/tasks/map/bigmap/plane.py @@ -17,11 +17,11 @@ FLOOR_BUTTONS = [FLOOR_1, FLOOR_2, FLOOR_3] def world_entrance(plane: MapPlane) -> ButtonWrapper: - if plane.is_HertaSpaceStation: + if plane.world.is_Herta: return WORLD_HERTA - if plane.is_JariloVI: + if plane.world.is_Jarilo: return WORLD_JARILO - if plane.is_Luofu: + if plane.world.is_Luofu: return WORLD_LUOFU raise ScriptError(f'world_entrance() got unknown plane: {plane}') diff --git a/tasks/map/keywords/classes.py b/tasks/map/keywords/classes.py index 2ac377ced..d94ca017d 100644 --- a/tasks/map/keywords/classes.py +++ b/tasks/map/keywords/classes.py @@ -10,6 +10,11 @@ from module.ocr.keyword import Keyword class MapPlane(Keyword): instances: ClassVar = {} + # 0, 1, 2, 3 + world_id: int + # 1010201 + plane_id: int + # Map floors, 'F1' by default # Example: ['B1', 'F1', 'F2'] floors = ['F1'] @@ -18,33 +23,27 @@ class MapPlane(Keyword): # 'top' or 'bottom' page = 'top' + @classmethod + def find_plane_id(cls, plane_id): + """ + Args: + plane_id: + + Returns: + MapPlane: MapPlane object or None + """ + for instance in cls.instances.values(): + if instance.plane_id == plane_id: + return instance + return None + @cached_property - def world(self) -> str: + def world(self) -> "MapWorld": """ Returns: - str: World name. Note that "Parlor Car" is considered as a plane of Herta. - "Herta" for Herta Space Station - "Jarilo" for Jarilo-VI - "Luofu" for The Xianzhou Luofu - "" for unknown + MapWorld: MapWorld object or None """ - for world in ['Herta', 'Jarilo', 'Luofu']: - if self.name.startswith(world): - return world - - return '' - - @cached_property - def is_HertaSpaceStation(self): - return self.world == 'Herta' - - @cached_property - def is_JariloVI(self): - return self.world == 'Jarilo' - - @cached_property - def is_Luofu(self): - return self.world == 'Luofu' + return MapWorld.find_world_id(self.world_id) @cached_property def has_multiple_floors(self): @@ -135,3 +134,38 @@ class MapPlane(Keyword): @dataclass(repr=False) class MapWorld(Keyword): instances: ClassVar = {} + + # 0, 1, 2, 3 + world_id: int + # Herta + short_name: str + + @classmethod + def find_world_id(cls, world_id): + """ + Args: + world_id: + + Returns: + MapWorld: MapWorld object or None + """ + for instance in cls.instances.values(): + if instance.world_id == world_id: + return instance + return None + + @cached_property + def is_Herta(self): + return self.short_name == 'Herta' + + @cached_property + def is_Jarilo(self): + return self.short_name == 'Jarilo' + + @cached_property + def is_Luofu(self): + return self.short_name == 'Luofu' + + @cached_property + def is_Penacony(self): + return self.short_name == 'Penacony' diff --git a/tasks/map/keywords/plane.py b/tasks/map/keywords/plane.py index 160450a02..7e2fc76c7 100644 --- a/tasks/map/keywords/plane.py +++ b/tasks/map/keywords/plane.py @@ -11,6 +11,8 @@ Special_HertaOffice = MapPlane( en="Herta's Office", jp='ヘルタのオフィス', es='Oficina de Herta', + world_id=-1, + plane_id=1, ) Special_AptitudeShowcase = MapPlane( id=2, @@ -20,6 +22,8 @@ Special_AptitudeShowcase = MapPlane( en='Aptitude Showcase', jp='躍進する新星', es='Demostración de aptitudes', + world_id=-1, + plane_id=2, ) Rogue_DomainCombat = MapPlane( id=3, @@ -29,6 +33,8 @@ Rogue_DomainCombat = MapPlane( en='Domain — Combat', jp='エリア-戦闘', es='Batalla', + world_id=-2, + plane_id=1, ) Rogue_DomainOccurrence = MapPlane( id=4, @@ -38,6 +44,8 @@ Rogue_DomainOccurrence = MapPlane( en='Domain — Occurrence', jp='エリア-イベント', es='Evento', + world_id=-2, + plane_id=2, ) Rogue_DomainEncounter = MapPlane( id=5, @@ -47,6 +55,8 @@ Rogue_DomainEncounter = MapPlane( en='Domain — Encounter', jp='エリア-遭遇', es='Encuentro', + world_id=-2, + plane_id=3, ) Rogue_DomainRespite = MapPlane( id=6, @@ -56,6 +66,8 @@ Rogue_DomainRespite = MapPlane( en='Domain — Respite', jp='エリア-休憩', es='Reposo', + world_id=-2, + plane_id=4, ) Rogue_DomainElite = MapPlane( id=7, @@ -65,6 +77,8 @@ Rogue_DomainElite = MapPlane( en='Domain — Elite', jp='エリア-精鋭', es='Élite', + world_id=-2, + plane_id=5, ) Rogue_DomainBoss = MapPlane( id=8, @@ -74,6 +88,8 @@ Rogue_DomainBoss = MapPlane( en='Domain — Boss', jp='エリア-ボス', es='Jefe', + world_id=-2, + plane_id=6, ) Rogue_DomainTransaction = MapPlane( id=9, @@ -83,6 +99,8 @@ Rogue_DomainTransaction = MapPlane( en='Domain — Transaction', jp='エリア-取引', es='Transacción', + world_id=-2, + plane_id=7, ) Herta_ParlorCar = MapPlane( id=10, @@ -92,6 +110,8 @@ Herta_ParlorCar = MapPlane( en='Parlor Car', jp='列車のラウンジ', es='Vagón panorámico', + world_id=0, + plane_id=1000001, ) Herta_MasterControlZone = MapPlane( id=11, @@ -101,6 +121,8 @@ Herta_MasterControlZone = MapPlane( en='Master Control Zone', jp='主制御部分', es='Zona de mando principal', + world_id=0, + plane_id=1000101, ) Herta_BaseZone = MapPlane( id=12, @@ -110,6 +132,8 @@ Herta_BaseZone = MapPlane( en='Base Zone', jp='ベース部分', es='Zona de la base', + world_id=0, + plane_id=2000101, ) Herta_StorageZone = MapPlane( id=13, @@ -119,6 +143,8 @@ Herta_StorageZone = MapPlane( en='Storage Zone', jp='収容部分', es='Zona de almacenamiento', + world_id=0, + plane_id=2000201, ) Herta_SupplyZone = MapPlane( id=14, @@ -128,6 +154,8 @@ Herta_SupplyZone = MapPlane( en='Supply Zone', jp='サポート部分', es='Zona de suministros', + world_id=0, + plane_id=2000301, ) Herta_SeclusionZone = MapPlane( id=15, @@ -137,6 +165,8 @@ Herta_SeclusionZone = MapPlane( en='Seclusion Zone', jp='封鎖部分', es='Zona de confinamiento', + world_id=0, + plane_id=2000401, ) Jarilo_AdministrativeDistrict = MapPlane( id=16, @@ -146,6 +176,8 @@ Jarilo_AdministrativeDistrict = MapPlane( en='Administrative District', jp='行政区', es='Distrito administrativo', + world_id=1, + plane_id=1010101, ) Jarilo_OutlyingSnowPlains = MapPlane( id=17, @@ -155,6 +187,8 @@ Jarilo_OutlyingSnowPlains = MapPlane( en='Outlying Snow Plains', jp='郊外雪原', es='Llanuras nevadas de las afueras', + world_id=1, + plane_id=2010101, ) Jarilo_BackwaterPass = MapPlane( id=18, @@ -164,6 +198,8 @@ Jarilo_BackwaterPass = MapPlane( en='Backwater Pass', jp='外縁通路', es='Paso del Remanso', + world_id=1, + plane_id=2011101, ) Jarilo_SilvermaneGuardRestrictedZone = MapPlane( id=19, @@ -173,6 +209,8 @@ Jarilo_SilvermaneGuardRestrictedZone = MapPlane( en='Silvermane Guard Restricted Zone', jp='シルバーメイン禁区', es='Zona restringida de la Guardia Crinargenta', + world_id=1, + plane_id=2013101, ) Jarilo_CorridorofFadingEchoes = MapPlane( id=20, @@ -182,6 +220,8 @@ Jarilo_CorridorofFadingEchoes = MapPlane( en='Corridor of Fading Echoes', jp='残響回廊', es='Pasadizo de los ecos apagados', + world_id=1, + plane_id=2013201, ) Jarilo_EverwinterHill = MapPlane( id=21, @@ -191,6 +231,8 @@ Jarilo_EverwinterHill = MapPlane( en='Everwinter Hill', jp='常冬峰', es='Colina del Siempreinvierno', + world_id=1, + plane_id=2013401, ) Jarilo_PillarsofCreation = MapPlane( id=22, @@ -200,6 +242,8 @@ Jarilo_PillarsofCreation = MapPlane( en='Pillars of Creation', jp='造物の柱', es='Pilares de la Creación', + world_id=1, + plane_id=2013501, ) Jarilo_OldWeaponTestingGround = MapPlane( id=23, @@ -209,6 +253,8 @@ Jarilo_OldWeaponTestingGround = MapPlane( en='Old Weapon Testing Ground', jp='旧武器実験場', es='Antiguo campo de prueba de armas', + world_id=1, + plane_id=2013601, ) Jarilo_BoulderTown = MapPlane( id=24, @@ -218,6 +264,8 @@ Jarilo_BoulderTown = MapPlane( en='Boulder Town', jp='ボルダータウン', es='Villarroca', + world_id=1, + plane_id=1010201, ) Jarilo_GreatMine = MapPlane( id=25, @@ -227,6 +275,8 @@ Jarilo_GreatMine = MapPlane( en='Great Mine', jp='大鉱区', es='Mina principal', + world_id=1, + plane_id=2012101, ) Jarilo_RivetTown = MapPlane( id=26, @@ -236,6 +286,8 @@ Jarilo_RivetTown = MapPlane( en='Rivet Town', jp='リベットタウン', es='Villarremache', + world_id=1, + plane_id=2012201, ) Jarilo_RobotSettlement = MapPlane( id=27, @@ -245,6 +297,8 @@ Jarilo_RobotSettlement = MapPlane( en='Robot Settlement', jp='機械集落', es='Asentamiento robot', + world_id=1, + plane_id=2012301, ) Luofu_CentralStarskiffHaven = MapPlane( id=28, @@ -254,6 +308,8 @@ Luofu_CentralStarskiffHaven = MapPlane( en='Central Starskiff Haven', jp='星槎海中枢', es='Zona central de la Dársena de astroesquifes', + world_id=2, + plane_id=1020101, ) Luofu_Cloudford = MapPlane( id=29, @@ -263,6 +319,8 @@ Luofu_Cloudford = MapPlane( en='Cloudford', jp='流雲渡し', es='Vado de las Nubes', + world_id=2, + plane_id=2021101, ) Luofu_StargazerNavalia = MapPlane( id=30, @@ -272,6 +330,8 @@ Luofu_StargazerNavalia = MapPlane( en='Stargazer Navalia', jp='廻星港', es='Puerto Miraestrellas', + world_id=2, + plane_id=2021201, ) Luofu_ExaltingSanctum = MapPlane( id=31, @@ -281,6 +341,8 @@ Luofu_ExaltingSanctum = MapPlane( en='Exalting Sanctum', jp='長楽天', es='Sánctum de la Exaltación', + world_id=2, + plane_id=1020201, ) Luofu_AurumAlley = MapPlane( id=32, @@ -290,6 +352,8 @@ Luofu_AurumAlley = MapPlane( en='Aurum Alley', jp='金人巷', es='Callejón Aurum', + world_id=2, + plane_id=1020204, ) Luofu_DivinationCommission = MapPlane( id=33, @@ -299,6 +363,8 @@ Luofu_DivinationCommission = MapPlane( en='Divination Commission', jp='太卜司', es='Comisión de Adivinación', + world_id=2, + plane_id=2022101, ) Luofu_ArtisanshipCommission = MapPlane( id=34, @@ -308,6 +374,8 @@ Luofu_ArtisanshipCommission = MapPlane( en='Artisanship Commission', jp='工造司', es='Comisión de Artesanía', + world_id=2, + plane_id=2022201, ) Luofu_FyxestrollGarden = MapPlane( id=35, @@ -317,6 +385,8 @@ Luofu_FyxestrollGarden = MapPlane( en='Fyxestroll Garden', jp='綏園', es='Jardín del Sosiego', + world_id=2, + plane_id=2022301, ) Luofu_AlchemyCommission = MapPlane( id=36, @@ -326,6 +396,8 @@ Luofu_AlchemyCommission = MapPlane( en='Alchemy Commission', jp='丹鼎司', es='Comisión de Alquimia', + world_id=2, + plane_id=2023101, ) Luofu_ScalegorgeWaterscape = MapPlane( id=37, @@ -335,4 +407,61 @@ Luofu_ScalegorgeWaterscape = MapPlane( en='Scalegorge Waterscape', jp='鱗淵境', es='Desfiladero de Escamas', + world_id=2, + plane_id=2023201, +) +Penacony_TheReverieReality = MapPlane( + id=38, + name='Penacony_TheReverieReality', + cn='「白日梦」酒店-现实', + cht='「白日夢」飯店-現實', + en='The Reverie (Reality)', + jp='ホテル・レバリー-現実', + es='Hotel Fantasía (realidad)', + world_id=3, + plane_id=1030501, +) +Penacony_GoldenHour = MapPlane( + id=39, + name='Penacony_GoldenHour', + cn='黄金的时刻', + cht='黃金的時刻', + en='Golden Hour', + jp='黄金の刻', + es='Momento Dorado', + world_id=3, + plane_id=1030101, +) +Penacony_DreamEdge = MapPlane( + id=40, + name='Penacony_DreamEdge', + cn='筑梦边境', + cht='築夢邊境', + en="Dream's Edge", + jp='ドリームボーダー', + es='Frontera de los Sueños', + world_id=3, + plane_id=2031301, +) +Penacony_AChildDream = MapPlane( + id=41, + name='Penacony_AChildDream', + cn='稚子的梦', + cht='稚子的夢', + en="A Child's Dream", + jp='稚児の夢', + es='Sueño infantil', + world_id=3, + plane_id=2031201, +) +Penacony_TheReverieDreamscape = MapPlane( + id=42, + name='Penacony_TheReverieDreamscape', + cn='「白日梦」酒店-梦境', + cht='「白日夢」飯店-夢境', + en='The Reverie (Dreamscape)', + jp='ホテル・レバリー-夢境', + es='Hotel Fantasía (paisaje onírico)', + world_id=3, + plane_id=2031101, ) diff --git a/tasks/map/keywords/world.py b/tasks/map/keywords/world.py index 3cb773450..76b8939b9 100644 --- a/tasks/map/keywords/world.py +++ b/tasks/map/keywords/world.py @@ -11,6 +11,8 @@ Herta_Space_Station = MapWorld( en='Herta Space Station', jp='宇宙ステーション「ヘルタ」', es='Estación Espacial Herta', + world_id=0, + short_name='Herta', ) Jarilo_VI = MapWorld( id=2, @@ -20,6 +22,8 @@ Jarilo_VI = MapWorld( en='Jarilo-VI', jp='ヤリーロ-VI', es='Jarilo-VI', + world_id=1, + short_name='Jarilo', ) The_Xianzhou_Luofu = MapWorld( id=3, @@ -29,4 +33,17 @@ The_Xianzhou_Luofu = MapWorld( en='The Xianzhou Luofu', jp='仙舟「羅浮」', es='El Luofu de Xianzhou', + world_id=2, + short_name='Luofu', +) +Penacony = MapWorld( + id=4, + name='Penacony', + cn='匹诺康尼', + cht='匹諾康尼', + en='Penacony', + jp='ピノコニー', + es='Colonipenal', + world_id=3, + short_name='Penacony', ) diff --git a/tasks/map/resource/resource.py b/tasks/map/resource/resource.py index 3e9001997..2411e00e3 100644 --- a/tasks/map/resource/resource.py +++ b/tasks/map/resource/resource.py @@ -79,9 +79,9 @@ class MapResource(ResourceConst): @cached_property def assets_file_basename(self): if self.plane.has_multiple_floors or self.is_special_plane: - return f'./position/{self.plane.world}/{self.plane.name}_{self.floor}' + return f'./position/{self.plane.world.short_name}/{self.plane.name}_{self.floor}' else: - return f'./position/{self.plane.world}/{self.plane.name}' + return f'./position/{self.plane.world.short_name}/{self.plane.name}' @cached_property def assets_floor(self): From 39ac8831df20894adb155b95053b3c14cb126242 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 03:05:46 +0800 Subject: [PATCH 27/65] Dev: Extract dungeons with plane_id --- dev_tools/keyword_extract.py | 44 +-- dev_tools/keywords/dungeon_list.py | 74 +++++ module/config/config_updater.py | 14 +- tasks/dungeon/keywords/classes.py | 11 + tasks/dungeon/keywords/dungeon.py | 314 ++++++++++++++++----- tasks/dungeon/keywords/dungeon_detailed.py | 28 +- 6 files changed, 361 insertions(+), 124 deletions(-) create mode 100644 dev_tools/keywords/dungeon_list.py diff --git a/dev_tools/keyword_extract.py b/dev_tools/keyword_extract.py index e82f5073c..f325ce06a 100644 --- a/dev_tools/keyword_extract.py +++ b/dev_tools/keyword_extract.py @@ -1,7 +1,6 @@ import itertools import os import re -import typing as t from collections import defaultdict from functools import cache from hashlib import md5 @@ -13,19 +12,6 @@ from module.exception import ScriptError from module.logger import logger -def dungeon_name(name: str) -> str: - name = text_to_variable(name) - name = re.sub('Bud_of_(Memories|Aether|Treasures)', r'Calyx_Golden_\1', name) - name = re.sub('Bud_of_(.*)', r'Calyx_Crimson_\1', name).replace('Calyx_Crimson_Calyx_Crimson_', 'Calyx_Crimson_') - name = re.sub('Shape_of_(.*)', r'Stagnant_Shadow_\1', name) - name = re.sub('Path_of_(.*)', r'Cavern_of_Corrosion_Path_of_\1', name) - if name in ['Destruction_Beginning', 'End_of_the_Eternal_Freeze', 'Divine_Seed', 'Borehole_Planet_Old_Crater']: - name = f'Echo_of_War_{name}' - if name in ['The_Swarm_Disaster', 'Gold_and_Gears']: - name = f'Simulated_Universe_{name}' - return name - - def blessing_name(name: str) -> str: name = text_to_variable(name) name = re.sub(r'^\d', lambda match: f"_{match.group(0)}", name) @@ -56,31 +42,6 @@ class KeywordExtract: self.text_map['cn'] = TextMap('chs') self.keywords_id: list[int] = [] - def iter_guide(self) -> t.Iterable[int]: - file = os.path.join(TextMap.DATA_FOLDER, './ExcelOutput/GameplayGuideData.json') - # visited = set() - temp_save = "" - for data in read_file(file).values(): - hash_ = deep_get(data, keys='Name.Hash') - _, name = self.find_keyword(hash_, lang='cn') - if '永屹之城遗秘' in name: # load after all forgotten hall to make sure the same order in Game UI - temp_save = hash_ - continue - if '忘却之庭' in name: - continue - # if name in visited: - # continue - # visited.add(name) - yield hash_ - yield temp_save - # Consider rogue DLC as a dungeon - yield '寰宇蝗灾' - yield '黄金与机械' - # 'Memory of Chaos' is not a real dungeon, but represents a group - yield '混沌回忆' - yield '天艟求仙迷航录' - yield '永屹之城遗秘' - def find_keyword(self, keyword, lang) -> tuple[int, str]: """ Args: @@ -602,9 +563,8 @@ class KeywordExtract: self.load_keywords(['领取', '追踪']) self.write_keywords(keyword_class='BattlePassQuestState', output_file='./tasks/battle_pass/keywords/quest_state.py') - self.load_keywords(list(self.iter_guide())) - self.write_keywords(keyword_class='DungeonList', output_file='./tasks/dungeon/keywords/dungeon.py', - text_convert=dungeon_name) + from dev_tools.keywords.dungeon_list import GenerateDungeonList + GenerateDungeonList()() self.load_keywords(['进入', '传送', '追踪']) self.write_keywords(keyword_class='DungeonEntrance', output_file='./tasks/dungeon/keywords/dungeon_entrance.py') self.generate_shadow_with_characters() diff --git a/dev_tools/keywords/dungeon_list.py b/dev_tools/keywords/dungeon_list.py new file mode 100644 index 000000000..5de6b45b2 --- /dev/null +++ b/dev_tools/keywords/dungeon_list.py @@ -0,0 +1,74 @@ +import re +import typing as t + +from dev_tools.keywords.base import GenerateKeyword, text_to_variable +from module.base.decorator import cached_property +from module.config.utils import deep_get + + +def dungeon_name(name: str) -> str: + name = text_to_variable(name) + name = re.sub('Bud_of_(Memories|Aether|Treasures)', r'Calyx_Golden_\1', name) + name = re.sub('Bud_of_(.*)', r'Calyx_Crimson_\1', name).replace('Calyx_Crimson_Calyx_Crimson_', 'Calyx_Crimson_') + name = re.sub('Shape_of_(.*)', r'Stagnant_Shadow_\1', name) + name = re.sub('Path_of_(.*)', r'Cavern_of_Corrosion_Path_of_\1', name) + if name in ['Destruction_Beginning', 'End_of_the_Eternal_Freeze', 'Divine_Seed', 'Borehole_Planet_Old_Crater']: + name = f'Echo_of_War_{name}' + if name in ['The_Swarm_Disaster', 'Gold_and_Gears']: + name = f'Simulated_Universe_{name}' + return name + + +class GenerateDungeonList(GenerateKeyword): + output_file = './tasks/dungeon/keywords/dungeon.py' + + @cached_property + def data(self): + return self.read_file('./ExcelOutput/GameplayGuideData.json') + + def iter_keywords(self) -> t.Iterable[dict]: + for keyword in self.iter_dungeon(): + if isinstance(keyword, str): + yield dict( + text_id=self.find_keyword(keyword, lang='cn')[0], + plane_id=-1, + ) + else: + yield keyword + + def iter_dungeon(self): + temp_save = "" + for data in self.data.values(): + text_id = deep_get(data, keys='Name.Hash') + plane_id = deep_get(data, 'MapEntranceID', 0) + _, name = self.find_keyword(text_id, lang='cn') + if '永屹之城遗秘' in name: # load after all forgotten hall to make sure the same order in Game UI + temp_save = text_id + continue + if '忘却之庭' in name: + continue + yield dict( + text_id=text_id, + plane_id=plane_id, + ) + if temp_save: + yield temp_save + # Consider rogue DLC as a dungeon + yield '寰宇蝗灾' + yield '黄金与机械' + # 'Memory of Chaos' is not a real dungeon, but represents a group + yield '混沌回忆' + yield '天艟求仙迷航录' + yield '永屹之城遗秘' + + def convert_name(self, text: str, keyword: dict) -> str: + text = super().convert_name(text, keyword=keyword) + text = dungeon_name(text) + + # Add plane suffix + from tasks.map.keywords import MapPlane + + if text.startswith('Calyx_Crimson'): + plane = MapPlane.find_plane_id(keyword['plane_id']) + text = f'{text}_{plane.name}' + return text diff --git a/module/config/config_updater.py b/module/config/config_updater.py index 3267a1baa..cba3f75c6 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -66,11 +66,17 @@ class ConfigGenerator: from tasks.dungeon.keywords import DungeonList option_add( keys='Dungeon.Name.option', - options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_daily_dungeon]) + options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Golden] \ + + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Crimson] \ + + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Stagnant_Shadow] \ + + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Cavern_of_Corrosion] + ) # Double events option_add( keys='Dungeon.NameAtDoubleCalyx.option', - options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx]) + options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Golden] \ + + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Crimson] + ) option_add( keys='Dungeon.NameAtDoubleRelic.option', options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Cavern_of_Corrosion]) @@ -407,9 +413,9 @@ class ConfigGenerator: deep_set(new, keys=['AchievableQuest', quest.name, option], value=value) # Echo of War - from tasks.map.keywords import MapWorld dungeons = [d for d in DungeonList.instances.values() if d.is_Echo_of_War] - for world, dungeon in zip(MapWorld.instances.values(), dungeons): + for dungeon in dungeons: + world = dungeon.plane.world world_name = world.__getattribute__(ingame_lang) dungeon_name = dungeon.__getattribute__(ingame_lang) value = f'{dungeon_name} ({world_name})' diff --git a/tasks/dungeon/keywords/classes.py b/tasks/dungeon/keywords/classes.py index c531cf4cb..e7fa1e9a4 100644 --- a/tasks/dungeon/keywords/classes.py +++ b/tasks/dungeon/keywords/classes.py @@ -20,6 +20,17 @@ class DungeonTab(Keyword): class DungeonList(Keyword): instances: ClassVar = {} + plane_id: int + + @cached_property + def plane(self): + """ + Returns: + MapPlane: MapPlane object or None + """ + from tasks.map.keywords import MapPlane + return MapPlane.find_plane_id(self.plane_id) + @cached_property def is_Calyx_Golden(self): return 'Calyx_Golden' in self.name diff --git a/tasks/dungeon/keywords/dungeon.py b/tasks/dungeon/keywords/dungeon.py index 4ff0259c4..5bb82d5d8 100644 --- a/tasks/dungeon/keywords/dungeon.py +++ b/tasks/dungeon/keywords/dungeon.py @@ -3,435 +3,603 @@ from .classes import DungeonList # This file was auto-generated, do not modify it manually. To generate: # ``` python -m dev_tools.keyword_extract ``` -Calyx_Golden_Memories = DungeonList( +Calyx_Golden_Memories_Jarilo_VI = DungeonList( id=1, - name='Calyx_Golden_Memories', - cn='回忆之蕾•拟造花萼(金)', - cht='回憶之蕾•擬造花萼(金)', - en='Bud of Memories', - jp='疑似花萼(金)・回憶の蕾', - es='Flor de los recuerdos', + name='Calyx_Golden_Memories_Jarilo_VI', + cn='回忆之蕾•雅利洛-Ⅵ', + cht='回憶之蕾•雅利洛-Ⅵ', + en='Bud of Memories (Jarilo-VI)', + jp='回憶の蕾・ヤリーロ-VI', + es='Flor de los recuerdos (Jarilo-VI)', + plane_id=2010101, ) -Calyx_Golden_Aether = DungeonList( +Calyx_Golden_Aether_Jarilo_VI = DungeonList( id=2, - name='Calyx_Golden_Aether', - cn='以太之蕾•拟造花萼(金)', - cht='乙太之蕾•擬造花萼(金)', - en='Bud of Aether', - jp='疑似花萼(金)・エーテルの蕾', - es='Flor de éter', + name='Calyx_Golden_Aether_Jarilo_VI', + cn='以太之蕾•雅利洛-Ⅵ', + cht='乙太之蕾•雅利洛-Ⅵ', + en='Bud of Aether (Jarilo-VI)', + jp='エーテルの蕾・ヤリーロ-VI', + es='Flor de éter (Jarilo-VI)', + plane_id=2011101, ) -Calyx_Golden_Treasures = DungeonList( +Calyx_Golden_Treasures_Jarilo_VI = DungeonList( id=3, - name='Calyx_Golden_Treasures', - cn='藏珍之蕾•拟造花萼(金)', - cht='藏珍之蕾•擬造花萼(金)', - en='Bud of Treasures', - jp='疑似花萼(金)・秘蔵の蕾', - es='Flor de tesoros', + name='Calyx_Golden_Treasures_Jarilo_VI', + cn='藏珍之蕾•雅利洛-Ⅵ', + cht='藏珍之蕾•雅利洛-Ⅵ', + en='Bud of Treasures (Jarilo-VI)', + jp='秘蔵の蕾・ヤリーロ-VI', + es='Flor de tesoros (Jarilo-VI)', + plane_id=2012101, ) -Calyx_Crimson_Destruction = DungeonList( +Calyx_Crimson_Destruction_Herta_StorageZone = DungeonList( id=4, - name='Calyx_Crimson_Destruction', + name='Calyx_Crimson_Destruction_Herta_StorageZone', cn='毁灭之蕾•拟造花萼(赤)', cht='毀滅之蕾•擬造花萼(赤)', en='Bud of Destruction', jp='疑似花萼(赤)・壊滅の蕾', es='Flor de la Destrucción', + plane_id=2000201, ) -Calyx_Crimson_Preservation = DungeonList( +Calyx_Crimson_Preservation_Herta_SupplyZone = DungeonList( id=5, - name='Calyx_Crimson_Preservation', + name='Calyx_Crimson_Preservation_Herta_SupplyZone', cn='存护之蕾•拟造花萼(赤)', cht='存護之蕾•擬造花萼(赤)', en='Bud of Preservation', jp='疑似花萼(赤)・存護の蕾', es='Flor de la Conservación', + plane_id=2000301, ) -Calyx_Crimson_The_Hunt = DungeonList( +Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains = DungeonList( id=6, - name='Calyx_Crimson_The_Hunt', + name='Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains', cn='巡猎之蕾•拟造花萼(赤)', cht='巡獵之蕾•擬造花萼(赤)', en='Bud of The Hunt', jp='疑似花萼(赤)・巡狩の蕾', es='Flor de la Cacería', + plane_id=2010101, ) -Calyx_Crimson_Abundance = DungeonList( +Calyx_Crimson_Abundance_Jarilo_BackwaterPass = DungeonList( id=7, - name='Calyx_Crimson_Abundance', + name='Calyx_Crimson_Abundance_Jarilo_BackwaterPass', cn='丰饶之蕾•拟造花萼(赤)', cht='豐饒之蕾•擬造花萼(赤)', en='Bud of Abundance', jp='疑似花萼(赤)・豊穣の蕾', es='Flor de la Abundancia', + plane_id=2011101, ) -Calyx_Crimson_Erudition = DungeonList( +Calyx_Crimson_Erudition_Jarilo_RivetTown = DungeonList( id=8, - name='Calyx_Crimson_Erudition', + name='Calyx_Crimson_Erudition_Jarilo_RivetTown', cn='智识之蕾•拟造花萼(赤)', cht='智識之蕾•擬造花萼(赤)', en='Bud of Erudition', jp='疑似花萼(赤)・知恵の蕾', es='Flor de la Erudición', + plane_id=2012201, ) -Calyx_Crimson_Harmony = DungeonList( +Calyx_Crimson_Harmony_Jarilo_RobotSettlement = DungeonList( id=9, - name='Calyx_Crimson_Harmony', + name='Calyx_Crimson_Harmony_Jarilo_RobotSettlement', cn='同谐之蕾•拟造花萼(赤)', cht='同諧之蕾•擬造花萼(赤)', en='Bud of Harmony', jp='疑似花萼(赤)・調和の蕾', es='Flor de la Armonía', + plane_id=2012301, ) -Calyx_Crimson_Nihility = DungeonList( +Calyx_Crimson_Nihility_Jarilo_GreatMine = DungeonList( id=10, - name='Calyx_Crimson_Nihility', + name='Calyx_Crimson_Nihility_Jarilo_GreatMine', cn='虚无之蕾•拟造花萼(赤)', cht='虛無之蕾•擬造花萼(赤)', en='Bud of Nihility', jp='疑似花萼(赤)・虚無の蕾', es='Flor de la Nihilidad', + plane_id=2012101, +) +Calyx_Golden_Memories_The_Xianzhou_Luofu = DungeonList( + id=11, + name='Calyx_Golden_Memories_The_Xianzhou_Luofu', + cn='回忆之蕾•仙舟「罗浮」', + cht='回憶之蕾•仙舟「羅浮」', + en='Bud of Memories (The Xianzhou Luofu)', + jp='回憶の蕾・仙舟「羅浮」', + es='Flor de los recuerdos (El Luofu de Xianzhou)', + plane_id=2021101, +) +Calyx_Golden_Aether_The_Xianzhou_Luofu = DungeonList( + id=12, + name='Calyx_Golden_Aether_The_Xianzhou_Luofu', + cn='以太之蕾•仙舟「罗浮」', + cht='乙太之蕾•仙舟「羅浮」', + en='Bud of Aether (The Xianzhou Luofu)', + jp='エーテルの蕾・仙舟「羅浮」', + es='Flor de éter (El Luofu de Xianzhou)', + plane_id=2022101, +) +Calyx_Golden_Treasures_The_Xianzhou_Luofu = DungeonList( + id=13, + name='Calyx_Golden_Treasures_The_Xianzhou_Luofu', + cn='藏珍之蕾•仙舟「罗浮」', + cht='藏珍之蕾•仙舟「羅浮」', + en='Bud of Treasures (The Xianzhou Luofu)', + jp='秘蔵の蕾・仙舟「羅浮」', + es='Flor de tesoros (El Luofu de Xianzhou)', + plane_id=2022201, +) +Calyx_Golden_Memories_Penacony = DungeonList( + id=14, + name='Calyx_Golden_Memories_Penacony', + cn='回忆之蕾•匹诺康尼', + cht='回憶之蕾•匹諾康尼', + en='Bud of Memories (Penacony)', + jp='回憶の蕾・ピノコニー', + es='Flor de los recuerdos (Colonipenal)', + plane_id=2031301, +) +Calyx_Golden_Aether_Penacony = DungeonList( + id=15, + name='Calyx_Golden_Aether_Penacony', + cn='以太之蕾•匹诺康尼', + cht='乙太之蕾•匹諾康尼', + en='Bud of Aether (Penacony)', + jp='エーテルの蕾・ピノコニー', + es='Flor de éter (Colonipenal)', + plane_id=2031201, +) +Calyx_Golden_Treasures_Penacony = DungeonList( + id=16, + name='Calyx_Golden_Treasures_Penacony', + cn='藏珍之蕾•匹诺康尼', + cht='藏珍之蕾•匹諾康尼', + en='Bud of Treasures (Penacony)', + jp='秘蔵の蕾・ピノコニー', + es='Flor de tesoros (Colonipenal)', + plane_id=2031101, +) +Calyx_Crimson_Nihility_Luofu_AlchemyCommission = DungeonList( + id=17, + name='Calyx_Crimson_Nihility_Luofu_AlchemyCommission', + cn='虚无之蕾•拟造花萼(赤)', + cht='虛無之蕾•擬造花萼(赤)', + en='Bud of Nihility', + jp='疑似花萼(赤)・虚無の蕾', + es='Flor de la Nihilidad', + plane_id=2023101, +) +Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape = DungeonList( + id=18, + name='Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape', + cn='毁灭之蕾•拟造花萼(赤)', + cht='毀滅之蕾•擬造花萼(赤)', + en='Bud of Destruction', + jp='疑似花萼(赤)・壊滅の蕾', + es='Flor de la Destrucción', + plane_id=2023201, +) +Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape = DungeonList( + id=19, + name='Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape', + cn='同谐之蕾•拟造花萼(赤)', + cht='同諧之蕾•擬造花萼(赤)', + en='Bud of Harmony', + jp='疑似花萼(赤)・調和の蕾', + es='Flor de la Armonía', + plane_id=2031101, ) Stagnant_Shadow_Quanta = DungeonList( - id=11, + id=20, name='Stagnant_Shadow_Quanta', cn='空海之形•凝滞虚影', cht='空海之形•凝滯虛影', en='Shape of Quanta', jp='凝結虚影・虚海の形', es='Forma del cuanto', + plane_id=2000101, ) Stagnant_Shadow_Gust = DungeonList( - id=12, + id=21, name='Stagnant_Shadow_Gust', cn='巽风之形•凝滞虚影', cht='巽風之形•凝滯虛影', en='Shape of Gust', jp='凝結虚影・薫風の形', es='Forma del aire', + plane_id=2012201, ) Stagnant_Shadow_Fulmination = DungeonList( - id=13, + id=22, name='Stagnant_Shadow_Fulmination', cn='鸣雷之形•凝滞虚影', cht='鳴雷之形•凝滯虛影', en='Shape of Fulmination', jp='凝結虚影・鳴雷の形', es='Forma del trueno', + plane_id=2013201, ) Stagnant_Shadow_Blaze = DungeonList( - id=14, + id=23, name='Stagnant_Shadow_Blaze', cn='炎华之形•凝滞虚影', cht='炎華之形•凝滯虛影', en='Shape of Blaze', jp='凝結虚影・炎華の形', es='Forma de las llamas', + plane_id=2013101, ) Stagnant_Shadow_Spike = DungeonList( - id=15, + id=24, name='Stagnant_Shadow_Spike', cn='锋芒之形•凝滞虚影', cht='鋒芒之形•凝滯虛影', en='Shape of Spike', jp='凝結虚影・切先の形', es='Forma afilada', + plane_id=2012101, ) Stagnant_Shadow_Rime = DungeonList( - id=16, + id=25, name='Stagnant_Shadow_Rime', cn='霜晶之形•凝滞虚影', cht='霜晶之形•凝滯虛影', en='Shape of Rime', jp='凝結虚影・霜晶の形', es='Forma de la escarcha', + plane_id=2013201, ) Stagnant_Shadow_Mirage = DungeonList( - id=17, + id=26, name='Stagnant_Shadow_Mirage', cn='幻光之形•凝滞虚影', cht='幻光之形•凝滯虛影', en='Shape of Mirage', jp='凝結虚影・幻光の形', es='Forma del espejismo', + plane_id=2011101, ) Stagnant_Shadow_Icicle = DungeonList( - id=18, + id=27, name='Stagnant_Shadow_Icicle', cn='冰棱之形•凝滞虚影', cht='冰稜之形•凝滯虛影', en='Shape of Icicle', jp='凝結虚影・氷柱の形', es='Forma del témpano', + plane_id=2021101, ) Stagnant_Shadow_Doom = DungeonList( - id=19, + id=28, name='Stagnant_Shadow_Doom', cn='震厄之形•凝滞虚影', cht='震厄之形•凝滯虛影', en='Shape of Doom', jp='凝結虚影・震厄の形', es='Forma de la perdición', + plane_id=2021201, ) Stagnant_Shadow_Puppetry = DungeonList( - id=20, + id=29, name='Stagnant_Shadow_Puppetry', cn='偃偶之形•凝滞虚影', cht='偃偶之形•凝滯虛影', en='Shape of Puppetry', jp='凝結虚影・傀儡の形', es='Forma de las marionetas', + plane_id=2022201, ) Stagnant_Shadow_Abomination = DungeonList( - id=21, + id=30, name='Stagnant_Shadow_Abomination', cn='孽兽之形•凝滞虚影', cht='孽獸之形•凝滯虛影', en='Shape of Abomination', jp='凝結虚影・厄獣の形', es='Forma de la abominación', + plane_id=2023201, ) Stagnant_Shadow_Scorch = DungeonList( - id=22, + id=31, name='Stagnant_Shadow_Scorch', cn='燔灼之形•凝滞虚影', cht='燔灼之形•凝滯虛影', en='Shape of Scorch', jp='凝結虚影・燔灼の形', es='Forma abrasada', + plane_id=2012101, ) Stagnant_Shadow_Celestial = DungeonList( - id=23, + id=32, name='Stagnant_Shadow_Celestial', cn='天人之形•凝滞虚影', cht='天人之形•凝滯虛影', en='Shape of Celestial', jp='凝結虚影・天人の形', es='Forma de lo celestial', + plane_id=2023101, ) Stagnant_Shadow_Perdition = DungeonList( - id=24, + id=33, name='Stagnant_Shadow_Perdition', cn='幽府之形•凝滞虚影', cht='幽府之形•凝滯虛影', en='Shape of Perdition', jp='凝結虚影・幽府の形', es='Forma del aislamiento', + plane_id=2022301, +) +Stagnant_Shadow_Nectar = DungeonList( + id=34, + name='Stagnant_Shadow_Nectar', + cn='冰酿之形•凝滞虚影', + cht='冰釀之形•凝滯虛影', + en='Shape of Nectar', + jp='凝結虚影・氷醸の形', + es='Forma del néctar', + plane_id=2031101, +) +Stagnant_Shadow_Roast = DungeonList( + id=35, + name='Stagnant_Shadow_Roast', + cn='焦炙之形•凝滞虚影', + cht='焦炙之形•凝滯虛影', + en='Shape of Roast', + jp='凝結虚影・焦灼の形', + es='Forma del agostamiento', + plane_id=2031301, ) Cavern_of_Corrosion_Path_of_Gelid_Wind = DungeonList( - id=25, + id=36, name='Cavern_of_Corrosion_Path_of_Gelid_Wind', cn='霜风之径•侵蚀隧洞', cht='霜風之徑•侵蝕隧洞', en='Path of Gelid Wind', jp='侵蝕トンネル・霜風の路', es='Senda del viento gélido', + plane_id=2000201, ) Cavern_of_Corrosion_Path_of_Jabbing_Punch = DungeonList( - id=26, + id=37, name='Cavern_of_Corrosion_Path_of_Jabbing_Punch', cn='迅拳之径•侵蚀隧洞', cht='迅拳之徑•侵蝕隧洞', en='Path of Jabbing Punch', jp='侵蝕トンネル・迅拳の路', es='Senda de los puños rápidos', + plane_id=2013101, ) Cavern_of_Corrosion_Path_of_Drifting = DungeonList( - id=27, + id=38, name='Cavern_of_Corrosion_Path_of_Drifting', cn='漂泊之径•侵蚀隧洞', cht='漂泊之徑•侵蝕隧洞', en='Path of Drifting', jp='侵蝕トンネル・漂泊の路', es='Senda de la deriva', + plane_id=2013201, ) Cavern_of_Corrosion_Path_of_Providence = DungeonList( - id=28, + id=39, name='Cavern_of_Corrosion_Path_of_Providence', cn='睿治之径•侵蚀隧洞', cht='睿治之徑•侵蝕隧洞', en='Path of Providence', jp='侵蝕トンネル・睿治の路', es='Senda de la providencia', + plane_id=2013401, ) Cavern_of_Corrosion_Path_of_Holy_Hymn = DungeonList( - id=29, + id=40, name='Cavern_of_Corrosion_Path_of_Holy_Hymn', cn='圣颂之径•侵蚀隧洞', cht='聖頌之徑•侵蝕隧洞', en='Path of Holy Hymn', jp='侵蝕トンネル・聖頌の路', es='Senda del himno sagrado', + plane_id=2021101, ) Cavern_of_Corrosion_Path_of_Conflagration = DungeonList( - id=30, + id=41, name='Cavern_of_Corrosion_Path_of_Conflagration', cn='野焰之径•侵蚀隧洞', cht='野焰之徑•侵蝕隧洞', en='Path of Conflagration', jp='侵蝕トンネル・野焔の路', es='Senda de la conflagración', + plane_id=2021201, ) Cavern_of_Corrosion_Path_of_Elixir_Seekers = DungeonList( - id=31, + id=42, name='Cavern_of_Corrosion_Path_of_Elixir_Seekers', cn='药使之径•侵蚀隧洞', cht='藥使之徑•侵蝕隧洞', en='Path of Elixir Seekers', jp='侵蝕トンネル・薬使の路', es='Senda de los elixires', + plane_id=2023101, ) Cavern_of_Corrosion_Path_of_Darkness = DungeonList( - id=32, + id=43, name='Cavern_of_Corrosion_Path_of_Darkness', cn='幽冥之径•侵蚀隧洞', cht='幽冥之徑•侵蝕隧洞', en='Path of Darkness', jp='侵蝕トンネル・幽冥の路', es='Senda de la oscuridad', + plane_id=2022301, +) +Cavern_of_Corrosion_Path_of_Dreamdive = DungeonList( + id=44, + name='Cavern_of_Corrosion_Path_of_Dreamdive', + cn='梦潜之径•侵蚀隧洞', + cht='夢潛之徑•侵蝕隧洞', + en='Path of Dreamdive', + jp='侵蝕トンネル・夢潜の路', + es='Senda de los sueños', + plane_id=2031101, ) Echo_of_War_Destruction_Beginning = DungeonList( - id=33, + id=45, name='Echo_of_War_Destruction_Beginning', cn='毁灭的开端•历战余响', cht='毀滅的開端•歷戰餘響', en="Destruction's Beginning", jp='歴戦余韻・壊滅の始まり', es='El principio de la Destrucción', + plane_id=2000301, ) Echo_of_War_End_of_the_Eternal_Freeze = DungeonList( - id=34, + id=46, name='Echo_of_War_End_of_the_Eternal_Freeze', cn='寒潮的落幕•历战余响', cht='寒潮的落幕•歷戰餘響', en='End of the Eternal Freeze', jp='歴戦余韻・寒波の幕切れ', es='El fin del Hielo Eterno', + plane_id=2013401, ) Echo_of_War_Divine_Seed = DungeonList( - id=35, + id=47, name='Echo_of_War_Divine_Seed', cn='不死的神实•历战余响', cht='不死的神實•歷戰餘響', en='Divine Seed', jp='歴戦余韻・不死の神実', es='Semilla divina', + plane_id=2023201, ) Echo_of_War_Borehole_Planet_Old_Crater = DungeonList( - id=36, + id=48, name='Echo_of_War_Borehole_Planet_Old_Crater', cn='蛀星的旧靥•历战余响', cht='蛀星的舊靨•歷戰餘響', en="Borehole Planet's Old Crater", jp='歴戦余韻・星を蝕む往日の面影', es='Cráter del planeta devorado', + plane_id=2000401, ) Simulated_Universe_World_1 = DungeonList( - id=37, + id=49, name='Simulated_Universe_World_1', cn='第一世界•模拟宇宙', cht='第一世界•模擬宇宙', en='Simulated Universe: World 1', jp='第一世界・模擬宇宙', es='Mundo 1', + plane_id=100000104, ) Simulated_Universe_World_3 = DungeonList( - id=38, + id=50, name='Simulated_Universe_World_3', cn='第三世界•模拟宇宙', cht='第三世界•模擬宇宙', en='Simulated Universe: World 3', jp='第三世界・模擬宇宙', es='Mundo 3', + plane_id=100000104, ) Simulated_Universe_World_4 = DungeonList( - id=39, + id=51, name='Simulated_Universe_World_4', cn='第四世界•模拟宇宙', cht='第四世界•模擬宇宙', en='Simulated Universe: World 4', jp='第四世界・模擬宇宙', es='Mundo 4', + plane_id=100000104, ) Simulated_Universe_World_5 = DungeonList( - id=40, + id=52, name='Simulated_Universe_World_5', cn='第五世界•模拟宇宙', cht='第五世界•模擬宇宙', en='Simulated Universe: World 5', jp='第五世界・模擬宇宙', es='Mundo 5', + plane_id=100000104, ) Simulated_Universe_World_6 = DungeonList( - id=41, + id=53, name='Simulated_Universe_World_6', cn='第六世界•模拟宇宙', cht='第六世界•模擬宇宙', en='Simulated Universe: World 6', jp='第六世界・模擬宇宙', es='Mundo 6', + plane_id=100000104, ) Simulated_Universe_World_7 = DungeonList( - id=42, + id=54, name='Simulated_Universe_World_7', cn='第七世界•模拟宇宙', cht='第七世界•模擬宇宙', en='Simulated Universe: World 7', jp='第七世界・模擬宇宙', es='Mundo 7', + plane_id=100000104, ) Simulated_Universe_World_8 = DungeonList( - id=43, + id=55, name='Simulated_Universe_World_8', cn='第八世界•模拟宇宙', cht='第八世界•模擬宇宙', en='Simulated Universe: World 8', jp='第八世界・模擬宇宙', es='Mundo 8', + plane_id=100000104, ) Simulated_Universe_The_Swarm_Disaster = DungeonList( - id=44, + id=56, name='Simulated_Universe_The_Swarm_Disaster', cn='寰宇蝗灾', cht='寰宇蝗災', en='The Swarm Disaster', jp='宇宙の蝗害', es='La Plaga', + plane_id=-1, ) Simulated_Universe_Gold_and_Gears = DungeonList( - id=45, + id=57, name='Simulated_Universe_Gold_and_Gears', cn='黄金与机械', cht='黃金與機械', en='Gold and Gears', jp='黄金と機械', es='Oro y maquinaria', + plane_id=-1, ) Memory_of_Chaos = DungeonList( - id=46, + id=58, name='Memory_of_Chaos', cn='混沌回忆', cht='混沌回憶', en='Memory of Chaos', jp='混沌の記憶', es='Evocación caótica', + plane_id=-1, ) The_Voyage_of_Navis_Astriger = DungeonList( - id=47, + id=59, name='The_Voyage_of_Navis_Astriger', cn='天艟求仙迷航录', cht='天艟求仙迷航錄', en='The Voyage of Navis Astriger', jp='天艟求仙放浪記', es='El viaje de las naves astriger', + plane_id=-1, ) The_Last_Vestiges_of_Towering_Citadel = DungeonList( - id=48, + id=60, name='The_Last_Vestiges_of_Towering_Citadel', cn='永屹之城遗秘', cht='永屹之城遺秘', en='The Last Vestiges of Towering Citadel', jp='永屹の城の秘密', es='Herencia de la Ciudadela Imponente', + plane_id=-1, ) diff --git a/tasks/dungeon/keywords/dungeon_detailed.py b/tasks/dungeon/keywords/dungeon_detailed.py index 6c752846d..89a905750 100644 --- a/tasks/dungeon/keywords/dungeon_detailed.py +++ b/tasks/dungeon/keywords/dungeon_detailed.py @@ -114,11 +114,11 @@ Stagnant_Shadow_Scorch = DungeonDetailed( Stagnant_Shadow_Celestial = DungeonDetailed( id=13, name='Stagnant_Shadow_Celestial', - cn='角色晋阶材料:风(刃 / 藿藿)', - cht='角色晉階材料:風(刃 / 藿藿)', - en='Ascension: Wind (Blade / Huohuo)', - jp='キャラクター昇格素材:風(刃 / フォフォ)', - es='Ascension: Viento (Blade / Huohuo)', + cn='角色晋阶材料:风(刃 / 藿藿 / 黑天鹅)', + cht='角色晉階材料:風(刃 / 藿藿 / 黑天鵝)', + en='Ascension: Wind (Blade / Huohuo / Black Swan)', + jp='キャラクター昇格素材:風(刃 / フォフォ / ブラックスワン)', + es='Ascension: Viento (Blade / Huohuo / Cisne Negro)', ) Stagnant_Shadow_Perdition = DungeonDetailed( id=14, @@ -129,3 +129,21 @@ Stagnant_Shadow_Perdition = DungeonDetailed( jp='キャラクター昇格素材:物理(寒鴉 / アルジェンティ)', es='Ascension: Físico (Hanya / Argenti)', ) +Stagnant_Shadow_Nectar = DungeonDetailed( + id=15, + name='Stagnant_Shadow_Nectar', + cn='角色晋阶材料:冰(米沙)', + cht='角色晉階材料:冰(米沙)', + en='Ascension: Ice (Misha)', + jp='キャラクター昇格素材:氷(ミーシャ)', + es='Ascension: Hielo (Misha)', +) +Stagnant_Shadow_Roast = DungeonDetailed( + id=16, + name='Stagnant_Shadow_Roast', + cn='角色晋阶材料:量子(花火)', + cht='角色晉階材料:量子(花火)', + en='Ascension: Quantum (Sparkle)', + jp='キャラクター昇格素材:量子(花火)', + es='Ascension: Cuántico (Sparkle)', +) From 8a85d9fae935ec1b957f04ccf73497c361be0e26 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 04:33:12 +0800 Subject: [PATCH 28/65] Add: Extract combat types --- dev_tools/keyword_extract.py | 3 ++ tasks/character/keywords/__init__.py | 3 +- tasks/character/keywords/classes.py | 8 +++ tasks/character/keywords/combat_type.py | 68 +++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 tasks/character/keywords/combat_type.py diff --git a/dev_tools/keyword_extract.py b/dev_tools/keyword_extract.py index f325ce06a..8a1cb3378 100644 --- a/dev_tools/keyword_extract.py +++ b/dev_tools/keyword_extract.py @@ -356,6 +356,9 @@ class KeywordExtract: gen.DictItem(key=character, value=height) gen.write('./tasks/character/keywords/height.py') + self.load_keywords(['物理', '火', '冰', '雷', '风', '量子', '虚数'], lang='cn') + self.write_keywords(keyword_class='CombatType', output_file='./tasks/character/keywords/combat_type.py') + def generate_battle_pass_quests(self): battle_pass_quests = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'BattlePassConfig.json')) latest_quests = list(battle_pass_quests.values())[-1] diff --git a/tasks/character/keywords/__init__.py b/tasks/character/keywords/__init__.py index 733d30451..3add0cd00 100644 --- a/tasks/character/keywords/__init__.py +++ b/tasks/character/keywords/__init__.py @@ -1,6 +1,7 @@ import tasks.character.keywords.character_list as KEYWORD_CHARACTER_LIST +import tasks.character.keywords.combat_type as KEYWORDS_COMBAT_TYPE from tasks.character.keywords.character_list import * -from tasks.character.keywords.classes import CharacterList +from tasks.character.keywords.classes import CharacterList, CombatType DICT_SORTED_RANGES = { # Mage, hit instantly, no trajectories diff --git a/tasks/character/keywords/classes.py b/tasks/character/keywords/classes.py index cc4b1a37d..69e0cfd95 100644 --- a/tasks/character/keywords/classes.py +++ b/tasks/character/keywords/classes.py @@ -25,3 +25,11 @@ class CharacterList(Keyword): """ from tasks.character.keywords.height import CHARACTER_HEIGHT return CHARACTER_HEIGHT.get(self.name, 'Unknown') + + +@dataclass(repr=False) +class CombatType(Keyword): + instances: ClassVar = {} + + def __hash__(self) -> int: + return super().__hash__() diff --git a/tasks/character/keywords/combat_type.py b/tasks/character/keywords/combat_type.py new file mode 100644 index 000000000..6aaa3d57e --- /dev/null +++ b/tasks/character/keywords/combat_type.py @@ -0,0 +1,68 @@ +from .classes import CombatType + +# This file was auto-generated, do not modify it manually. To generate: +# ``` python -m dev_tools.keyword_extract ``` + +Physical = CombatType( + id=1, + name='Physical', + cn='物理', + cht='物理', + en='Physical', + jp='物理', + es='Físico', +) +Fire = CombatType( + id=2, + name='Fire', + cn='火', + cht='火', + en='Fire', + jp='炎', + es='Fuego', +) +Ice = CombatType( + id=3, + name='Ice', + cn='冰', + cht='冰', + en='Ice', + jp='氷', + es='Hielo', +) +Lightning = CombatType( + id=4, + name='Lightning', + cn='雷', + cht='雷', + en='Lightning', + jp='雷', + es='Rayo', +) +Wind = CombatType( + id=5, + name='Wind', + cn='风', + cht='風', + en='Wind', + jp='風', + es='Viento', +) +Quantum = CombatType( + id=6, + name='Quantum', + cn='量子', + cht='量子', + en='Quantum', + jp='量子', + es='Cuántico', +) +Imaginary = CombatType( + id=7, + name='Imaginary', + cn='虚数', + cht='虛數', + en='Imaginary', + jp='虚数', + es='Imaginario', +) From 162132a0b056352d6c928463d927b751f829d4f7 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 04:36:17 +0800 Subject: [PATCH 29/65] Add: Sorted dungeon name treanslations --- module/config/argument/args.json | 172 ++++++++++++++++++----------- module/config/config_generated.py | 24 ++--- module/config/config_updater.py | 106 ++++++++++++------ module/config/i18n/en-US.json | 174 +++++++++++++++++++----------- module/config/i18n/es-ES.json | 174 +++++++++++++++++++----------- module/config/i18n/ja-JP.json | 174 +++++++++++++++++++----------- module/config/i18n/zh-CN.json | 174 +++++++++++++++++++----------- module/config/i18n/zh-TW.json | 174 +++++++++++++++++++----------- tasks/dungeon/keywords/classes.py | 46 ++++++++ 9 files changed, 811 insertions(+), 407 deletions(-) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 312487a4a..9ccf50ce5 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -193,30 +193,41 @@ "type": "select", "value": "Calyx_Golden_Treasures", "option": [ - "Calyx_Golden_Memories", - "Calyx_Golden_Aether", - "Calyx_Golden_Treasures", - "Calyx_Crimson_Destruction", - "Calyx_Crimson_Preservation", - "Calyx_Crimson_The_Hunt", - "Calyx_Crimson_Abundance", - "Calyx_Crimson_Erudition", - "Calyx_Crimson_Harmony", - "Calyx_Crimson_Nihility", - "Stagnant_Shadow_Quanta", - "Stagnant_Shadow_Gust", - "Stagnant_Shadow_Fulmination", - "Stagnant_Shadow_Blaze", + "Calyx_Golden_Memories_Jarilo_VI", + "Calyx_Golden_Memories_The_Xianzhou_Luofu", + "Calyx_Golden_Memories_Penacony", + "Calyx_Golden_Aether_Jarilo_VI", + "Calyx_Golden_Aether_The_Xianzhou_Luofu", + "Calyx_Golden_Aether_Penacony", + "Calyx_Golden_Treasures_Jarilo_VI", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu", + "Calyx_Golden_Treasures_Penacony", + "Calyx_Crimson_Destruction_Herta_StorageZone", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains", + "Calyx_Crimson_Erudition_Jarilo_RivetTown", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape", + "Calyx_Crimson_Nihility_Jarilo_GreatMine", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission", + "Calyx_Crimson_Preservation_Herta_SupplyZone", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass", "Stagnant_Shadow_Spike", - "Stagnant_Shadow_Rime", - "Stagnant_Shadow_Mirage", - "Stagnant_Shadow_Icicle", - "Stagnant_Shadow_Doom", - "Stagnant_Shadow_Puppetry", - "Stagnant_Shadow_Abomination", - "Stagnant_Shadow_Scorch", - "Stagnant_Shadow_Celestial", "Stagnant_Shadow_Perdition", + "Stagnant_Shadow_Blaze", + "Stagnant_Shadow_Scorch", + "Stagnant_Shadow_Rime", + "Stagnant_Shadow_Icicle", + "Stagnant_Shadow_Nectar", + "Stagnant_Shadow_Fulmination", + "Stagnant_Shadow_Doom", + "Stagnant_Shadow_Gust", + "Stagnant_Shadow_Celestial", + "Stagnant_Shadow_Quanta", + "Stagnant_Shadow_Abomination", + "Stagnant_Shadow_Roast", + "Stagnant_Shadow_Mirage", + "Stagnant_Shadow_Puppetry", "Cavern_of_Corrosion_Path_of_Gelid_Wind", "Cavern_of_Corrosion_Path_of_Jabbing_Punch", "Cavern_of_Corrosion_Path_of_Drifting", @@ -224,7 +235,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn", "Cavern_of_Corrosion_Path_of_Conflagration", "Cavern_of_Corrosion_Path_of_Elixir_Seekers", - "Cavern_of_Corrosion_Path_of_Darkness" + "Cavern_of_Corrosion_Path_of_Darkness", + "Cavern_of_Corrosion_Path_of_Dreamdive" ] }, "NameAtDoubleCalyx": { @@ -232,16 +244,25 @@ "value": "Calyx_Golden_Treasures", "option": [ "do_not_participate", - "Calyx_Golden_Memories", - "Calyx_Golden_Aether", - "Calyx_Golden_Treasures", - "Calyx_Crimson_Destruction", - "Calyx_Crimson_Preservation", - "Calyx_Crimson_The_Hunt", - "Calyx_Crimson_Abundance", - "Calyx_Crimson_Erudition", - "Calyx_Crimson_Harmony", - "Calyx_Crimson_Nihility" + "Calyx_Golden_Memories_Jarilo_VI", + "Calyx_Golden_Memories_The_Xianzhou_Luofu", + "Calyx_Golden_Memories_Penacony", + "Calyx_Golden_Aether_Jarilo_VI", + "Calyx_Golden_Aether_The_Xianzhou_Luofu", + "Calyx_Golden_Aether_Penacony", + "Calyx_Golden_Treasures_Jarilo_VI", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu", + "Calyx_Golden_Treasures_Penacony", + "Calyx_Crimson_Destruction_Herta_StorageZone", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains", + "Calyx_Crimson_Erudition_Jarilo_RivetTown", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape", + "Calyx_Crimson_Nihility_Jarilo_GreatMine", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission", + "Calyx_Crimson_Preservation_Herta_SupplyZone", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass" ] }, "NameAtDoubleRelic": { @@ -256,7 +277,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn", "Cavern_of_Corrosion_Path_of_Conflagration", "Cavern_of_Corrosion_Path_of_Elixir_Seekers", - "Cavern_of_Corrosion_Path_of_Darkness" + "Cavern_of_Corrosion_Path_of_Darkness", + "Cavern_of_Corrosion_Path_of_Dreamdive" ] }, "Team": { @@ -281,9 +303,15 @@ "value": "Calyx_Golden_Treasures", "option": [ "do_not_achieve", - "Calyx_Golden_Memories", - "Calyx_Golden_Aether", - "Calyx_Golden_Treasures" + "Calyx_Golden_Memories_Jarilo_VI", + "Calyx_Golden_Memories_The_Xianzhou_Luofu", + "Calyx_Golden_Memories_Penacony", + "Calyx_Golden_Aether_Jarilo_VI", + "Calyx_Golden_Aether_The_Xianzhou_Luofu", + "Calyx_Golden_Aether_Penacony", + "Calyx_Golden_Treasures_Jarilo_VI", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu", + "Calyx_Golden_Treasures_Penacony" ] }, "CalyxCrimson": { @@ -291,13 +319,16 @@ "value": "Calyx_Crimson_Erudition", "option": [ "do_not_achieve", - "Calyx_Crimson_Destruction", - "Calyx_Crimson_Preservation", - "Calyx_Crimson_The_Hunt", - "Calyx_Crimson_Abundance", - "Calyx_Crimson_Erudition", - "Calyx_Crimson_Harmony", - "Calyx_Crimson_Nihility" + "Calyx_Crimson_Destruction_Herta_StorageZone", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains", + "Calyx_Crimson_Erudition_Jarilo_RivetTown", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape", + "Calyx_Crimson_Nihility_Jarilo_GreatMine", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission", + "Calyx_Crimson_Preservation_Herta_SupplyZone", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass" ] }, "StagnantShadow": { @@ -305,20 +336,22 @@ "value": "Stagnant_Shadow_Quanta", "option": [ "do_not_achieve", - "Stagnant_Shadow_Quanta", - "Stagnant_Shadow_Gust", - "Stagnant_Shadow_Fulmination", - "Stagnant_Shadow_Blaze", "Stagnant_Shadow_Spike", - "Stagnant_Shadow_Rime", - "Stagnant_Shadow_Mirage", - "Stagnant_Shadow_Icicle", - "Stagnant_Shadow_Doom", - "Stagnant_Shadow_Puppetry", - "Stagnant_Shadow_Abomination", + "Stagnant_Shadow_Perdition", + "Stagnant_Shadow_Blaze", "Stagnant_Shadow_Scorch", + "Stagnant_Shadow_Rime", + "Stagnant_Shadow_Icicle", + "Stagnant_Shadow_Nectar", + "Stagnant_Shadow_Fulmination", + "Stagnant_Shadow_Doom", + "Stagnant_Shadow_Gust", "Stagnant_Shadow_Celestial", - "Stagnant_Shadow_Perdition" + "Stagnant_Shadow_Quanta", + "Stagnant_Shadow_Abomination", + "Stagnant_Shadow_Roast", + "Stagnant_Shadow_Mirage", + "Stagnant_Shadow_Puppetry" ] }, "CavernOfCorrosion": { @@ -333,7 +366,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn", "Cavern_of_Corrosion_Path_of_Conflagration", "Cavern_of_Corrosion_Path_of_Elixir_Seekers", - "Cavern_of_Corrosion_Path_of_Darkness" + "Cavern_of_Corrosion_Path_of_Darkness", + "Cavern_of_Corrosion_Path_of_Dreamdive" ] } }, @@ -356,6 +390,7 @@ "Arlan", "Asta", "Bailu", + "BlackSwan", "Blade", "Bronya", "Clara", @@ -377,6 +412,7 @@ "Luocha", "Lynx", "March7th", + "Misha", "Natasha", "Pela", "Qingque", @@ -993,6 +1029,8 @@ "Born_to_Obey", "Root_Out_the_Turpitude", "Fire_Lord_Inflames_Blades_of_War", + "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People", "Akashic_Records", "The_Invisible_Hand", @@ -1001,7 +1039,9 @@ "The_Land_of_Gold", "The_Blossom_in_the_Storm", "Legend_of_the_Puppet_Master", - "The_Wages_of_Humanity" + "The_Wages_of_Humanity", + "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver" ] }, "Name_2": { @@ -1014,6 +1054,8 @@ "Born_to_Obey", "Root_Out_the_Turpitude", "Fire_Lord_Inflames_Blades_of_War", + "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People", "Akashic_Records", "The_Invisible_Hand", @@ -1022,7 +1064,9 @@ "The_Land_of_Gold", "The_Blossom_in_the_Storm", "Legend_of_the_Puppet_Master", - "The_Wages_of_Humanity" + "The_Wages_of_Humanity", + "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver" ] }, "Name_3": { @@ -1035,6 +1079,8 @@ "Born_to_Obey", "Root_Out_the_Turpitude", "Fire_Lord_Inflames_Blades_of_War", + "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People", "Akashic_Records", "The_Invisible_Hand", @@ -1043,7 +1089,9 @@ "The_Land_of_Gold", "The_Blossom_in_the_Storm", "Legend_of_the_Puppet_Master", - "The_Wages_of_Humanity" + "The_Wages_of_Humanity", + "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver" ] }, "Name_4": { @@ -1056,6 +1104,8 @@ "Born_to_Obey", "Root_Out_the_Turpitude", "Fire_Lord_Inflames_Blades_of_War", + "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People", "Akashic_Records", "The_Invisible_Hand", @@ -1064,7 +1114,9 @@ "The_Land_of_Gold", "The_Blossom_in_the_Storm", "Legend_of_the_Puppet_Master", - "The_Wages_of_Humanity" + "The_Wages_of_Humanity", + "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver" ] }, "Duration": { diff --git a/module/config/config_generated.py b/module/config/config_generated.py index f97ee62f2..c86f6f7cc 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -40,20 +40,20 @@ class GeneratedConfig: Optimization_WhenTaskQueueEmpty = 'goto_main' # stay_there, goto_main, close_game # Group `Dungeon` - Dungeon_Name = 'Calyx_Golden_Treasures' # Calyx_Golden_Memories, Calyx_Golden_Aether, Calyx_Golden_Treasures, Calyx_Crimson_Destruction, Calyx_Crimson_Preservation, Calyx_Crimson_The_Hunt, Calyx_Crimson_Abundance, Calyx_Crimson_Erudition, Calyx_Crimson_Harmony, Calyx_Crimson_Nihility, Stagnant_Shadow_Quanta, Stagnant_Shadow_Gust, Stagnant_Shadow_Fulmination, Stagnant_Shadow_Blaze, Stagnant_Shadow_Spike, Stagnant_Shadow_Rime, Stagnant_Shadow_Mirage, Stagnant_Shadow_Icicle, Stagnant_Shadow_Doom, Stagnant_Shadow_Puppetry, Stagnant_Shadow_Abomination, Stagnant_Shadow_Scorch, Stagnant_Shadow_Celestial, Stagnant_Shadow_Perdition, Cavern_of_Corrosion_Path_of_Gelid_Wind, Cavern_of_Corrosion_Path_of_Jabbing_Punch, Cavern_of_Corrosion_Path_of_Drifting, Cavern_of_Corrosion_Path_of_Providence, Cavern_of_Corrosion_Path_of_Holy_Hymn, Cavern_of_Corrosion_Path_of_Conflagration, Cavern_of_Corrosion_Path_of_Elixir_Seekers, Cavern_of_Corrosion_Path_of_Darkness - Dungeon_NameAtDoubleCalyx = 'Calyx_Golden_Treasures' # do_not_participate, Calyx_Golden_Memories, Calyx_Golden_Aether, Calyx_Golden_Treasures, Calyx_Crimson_Destruction, Calyx_Crimson_Preservation, Calyx_Crimson_The_Hunt, Calyx_Crimson_Abundance, Calyx_Crimson_Erudition, Calyx_Crimson_Harmony, Calyx_Crimson_Nihility - Dungeon_NameAtDoubleRelic = 'Cavern_of_Corrosion_Path_of_Providence' # do_not_participate, Cavern_of_Corrosion_Path_of_Gelid_Wind, Cavern_of_Corrosion_Path_of_Jabbing_Punch, Cavern_of_Corrosion_Path_of_Drifting, Cavern_of_Corrosion_Path_of_Providence, Cavern_of_Corrosion_Path_of_Holy_Hymn, Cavern_of_Corrosion_Path_of_Conflagration, Cavern_of_Corrosion_Path_of_Elixir_Seekers, Cavern_of_Corrosion_Path_of_Darkness + Dungeon_Name = 'Calyx_Golden_Treasures' # Calyx_Golden_Memories_Jarilo_VI, Calyx_Golden_Memories_The_Xianzhou_Luofu, Calyx_Golden_Memories_Penacony, Calyx_Golden_Aether_Jarilo_VI, Calyx_Golden_Aether_The_Xianzhou_Luofu, Calyx_Golden_Aether_Penacony, Calyx_Golden_Treasures_Jarilo_VI, Calyx_Golden_Treasures_The_Xianzhou_Luofu, Calyx_Golden_Treasures_Penacony, Calyx_Crimson_Destruction_Herta_StorageZone, Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Harmony_Jarilo_RobotSettlement, Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape, Calyx_Crimson_Nihility_Jarilo_GreatMine, Calyx_Crimson_Nihility_Luofu_AlchemyCommission, Calyx_Crimson_Preservation_Herta_SupplyZone, Calyx_Crimson_Abundance_Jarilo_BackwaterPass, Stagnant_Shadow_Spike, Stagnant_Shadow_Perdition, Stagnant_Shadow_Blaze, Stagnant_Shadow_Scorch, Stagnant_Shadow_Rime, Stagnant_Shadow_Icicle, Stagnant_Shadow_Nectar, Stagnant_Shadow_Fulmination, Stagnant_Shadow_Doom, Stagnant_Shadow_Gust, Stagnant_Shadow_Celestial, Stagnant_Shadow_Quanta, Stagnant_Shadow_Abomination, Stagnant_Shadow_Roast, Stagnant_Shadow_Mirage, Stagnant_Shadow_Puppetry, Cavern_of_Corrosion_Path_of_Gelid_Wind, Cavern_of_Corrosion_Path_of_Jabbing_Punch, Cavern_of_Corrosion_Path_of_Drifting, Cavern_of_Corrosion_Path_of_Providence, Cavern_of_Corrosion_Path_of_Holy_Hymn, Cavern_of_Corrosion_Path_of_Conflagration, Cavern_of_Corrosion_Path_of_Elixir_Seekers, Cavern_of_Corrosion_Path_of_Darkness, Cavern_of_Corrosion_Path_of_Dreamdive + Dungeon_NameAtDoubleCalyx = 'Calyx_Golden_Treasures' # do_not_participate, Calyx_Golden_Memories_Jarilo_VI, Calyx_Golden_Memories_The_Xianzhou_Luofu, Calyx_Golden_Memories_Penacony, Calyx_Golden_Aether_Jarilo_VI, Calyx_Golden_Aether_The_Xianzhou_Luofu, Calyx_Golden_Aether_Penacony, Calyx_Golden_Treasures_Jarilo_VI, Calyx_Golden_Treasures_The_Xianzhou_Luofu, Calyx_Golden_Treasures_Penacony, Calyx_Crimson_Destruction_Herta_StorageZone, Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Harmony_Jarilo_RobotSettlement, Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape, Calyx_Crimson_Nihility_Jarilo_GreatMine, Calyx_Crimson_Nihility_Luofu_AlchemyCommission, Calyx_Crimson_Preservation_Herta_SupplyZone, Calyx_Crimson_Abundance_Jarilo_BackwaterPass + Dungeon_NameAtDoubleRelic = 'Cavern_of_Corrosion_Path_of_Providence' # do_not_participate, Cavern_of_Corrosion_Path_of_Gelid_Wind, Cavern_of_Corrosion_Path_of_Jabbing_Punch, Cavern_of_Corrosion_Path_of_Drifting, Cavern_of_Corrosion_Path_of_Providence, Cavern_of_Corrosion_Path_of_Holy_Hymn, Cavern_of_Corrosion_Path_of_Conflagration, Cavern_of_Corrosion_Path_of_Elixir_Seekers, Cavern_of_Corrosion_Path_of_Darkness, Cavern_of_Corrosion_Path_of_Dreamdive Dungeon_Team = 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9 # Group `DungeonDaily` - DungeonDaily_CalyxGolden = 'Calyx_Golden_Treasures' # do_not_achieve, Calyx_Golden_Memories, Calyx_Golden_Aether, Calyx_Golden_Treasures - DungeonDaily_CalyxCrimson = 'Calyx_Crimson_Erudition' # do_not_achieve, Calyx_Crimson_Destruction, Calyx_Crimson_Preservation, Calyx_Crimson_The_Hunt, Calyx_Crimson_Abundance, Calyx_Crimson_Erudition, Calyx_Crimson_Harmony, Calyx_Crimson_Nihility - DungeonDaily_StagnantShadow = 'Stagnant_Shadow_Quanta' # do_not_achieve, Stagnant_Shadow_Quanta, Stagnant_Shadow_Gust, Stagnant_Shadow_Fulmination, Stagnant_Shadow_Blaze, Stagnant_Shadow_Spike, Stagnant_Shadow_Rime, Stagnant_Shadow_Mirage, Stagnant_Shadow_Icicle, Stagnant_Shadow_Doom, Stagnant_Shadow_Puppetry, Stagnant_Shadow_Abomination, Stagnant_Shadow_Scorch, Stagnant_Shadow_Celestial, Stagnant_Shadow_Perdition - DungeonDaily_CavernOfCorrosion = 'Cavern_of_Corrosion_Path_of_Providence' # do_not_achieve, Cavern_of_Corrosion_Path_of_Gelid_Wind, Cavern_of_Corrosion_Path_of_Jabbing_Punch, Cavern_of_Corrosion_Path_of_Drifting, Cavern_of_Corrosion_Path_of_Providence, Cavern_of_Corrosion_Path_of_Holy_Hymn, Cavern_of_Corrosion_Path_of_Conflagration, Cavern_of_Corrosion_Path_of_Elixir_Seekers, Cavern_of_Corrosion_Path_of_Darkness + DungeonDaily_CalyxGolden = 'Calyx_Golden_Treasures' # do_not_achieve, Calyx_Golden_Memories_Jarilo_VI, Calyx_Golden_Memories_The_Xianzhou_Luofu, Calyx_Golden_Memories_Penacony, Calyx_Golden_Aether_Jarilo_VI, Calyx_Golden_Aether_The_Xianzhou_Luofu, Calyx_Golden_Aether_Penacony, Calyx_Golden_Treasures_Jarilo_VI, Calyx_Golden_Treasures_The_Xianzhou_Luofu, Calyx_Golden_Treasures_Penacony + DungeonDaily_CalyxCrimson = 'Calyx_Crimson_Erudition' # do_not_achieve, Calyx_Crimson_Destruction_Herta_StorageZone, Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Harmony_Jarilo_RobotSettlement, Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape, Calyx_Crimson_Nihility_Jarilo_GreatMine, Calyx_Crimson_Nihility_Luofu_AlchemyCommission, Calyx_Crimson_Preservation_Herta_SupplyZone, Calyx_Crimson_Abundance_Jarilo_BackwaterPass + DungeonDaily_StagnantShadow = 'Stagnant_Shadow_Quanta' # do_not_achieve, Stagnant_Shadow_Spike, Stagnant_Shadow_Perdition, Stagnant_Shadow_Blaze, Stagnant_Shadow_Scorch, Stagnant_Shadow_Rime, Stagnant_Shadow_Icicle, Stagnant_Shadow_Nectar, Stagnant_Shadow_Fulmination, Stagnant_Shadow_Doom, Stagnant_Shadow_Gust, Stagnant_Shadow_Celestial, Stagnant_Shadow_Quanta, Stagnant_Shadow_Abomination, Stagnant_Shadow_Roast, Stagnant_Shadow_Mirage, Stagnant_Shadow_Puppetry + DungeonDaily_CavernOfCorrosion = 'Cavern_of_Corrosion_Path_of_Providence' # do_not_achieve, Cavern_of_Corrosion_Path_of_Gelid_Wind, Cavern_of_Corrosion_Path_of_Jabbing_Punch, Cavern_of_Corrosion_Path_of_Drifting, Cavern_of_Corrosion_Path_of_Providence, Cavern_of_Corrosion_Path_of_Holy_Hymn, Cavern_of_Corrosion_Path_of_Conflagration, Cavern_of_Corrosion_Path_of_Elixir_Seekers, Cavern_of_Corrosion_Path_of_Darkness, Cavern_of_Corrosion_Path_of_Dreamdive # Group `DungeonSupport` DungeonSupport_Use = 'when_daily' # always_use, when_daily, do_not_use - DungeonSupport_Character = 'FirstCharacter' # FirstCharacter, Argenti, Arlan, Asta, Bailu, Blade, Bronya, Clara, DanHeng, DanHengImbibitorLunae, DrRatio, FuXuan, Gepard, Guinaifen, Hanya, Herta, Himeko, Hook, Huohuo, JingYuan, Jingliu, Kafka, Luka, Luocha, Lynx, March7th, Natasha, Pela, Qingque, RuanMei, Sampo, Seele, Serval, SilverWolf, Sushang, Tingyun, TopazNumby, TrailblazerDestruction, TrailblazerPreservation, Welt, Xueyi, Yanqing, Yukong + DungeonSupport_Character = 'FirstCharacter' # FirstCharacter, Argenti, Arlan, Asta, Bailu, BlackSwan, Blade, Bronya, Clara, DanHeng, DanHengImbibitorLunae, DrRatio, FuXuan, Gepard, Guinaifen, Hanya, Herta, Himeko, Hook, Huohuo, JingYuan, Jingliu, Kafka, Luka, Luocha, Lynx, March7th, Misha, Natasha, Pela, Qingque, RuanMei, Sampo, Seele, Serval, SilverWolf, Sushang, Tingyun, TopazNumby, TrailblazerDestruction, TrailblazerPreservation, Welt, Xueyi, Yanqing, Yukong # Group `DungeonStorage` DungeonStorage_TrailblazePower = {} @@ -113,10 +113,10 @@ class GeneratedConfig: BattlePassStorage_BattlePassQuestTrailblazePower = {} # Group `Assignment` - Assignment_Name_1 = 'Nameless_Land_Nameless_People' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity - Assignment_Name_2 = 'Akashic_Records' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity - Assignment_Name_3 = 'The_Invisible_Hand' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity - Assignment_Name_4 = 'Nine_Billion_Names' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity + Assignment_Name_1 = 'Nameless_Land_Nameless_People' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver + Assignment_Name_2 = 'Akashic_Records' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver + Assignment_Name_3 = 'The_Invisible_Hand' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver + Assignment_Name_4 = 'Nine_Billion_Names' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver Assignment_Duration = 20 # 4, 8, 12, 20 Assignment_Event = True Assignment_Assignment = {} diff --git a/module/config/config_updater.py b/module/config/config_updater.py index cba3f75c6..8c6521ac6 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -1,3 +1,4 @@ +import re import typing as t from copy import deepcopy @@ -5,7 +6,6 @@ from cached_property import cached_property from deploy.Windows.utils import DEPLOY_TEMPLATE, poor_yaml_read, poor_yaml_write from module.base.timer import timer -from module.config.convert import * from module.config.server import VALID_SERVER from module.config.utils import * @@ -64,35 +64,36 @@ class ConfigGenerator: option_add(keys='Emulator.PackageName.option', options=list(VALID_SERVER.keys())) # Insert dungeons from tasks.dungeon.keywords import DungeonList + calyx_golden = [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Golden_Memories] \ + + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Golden_Aether] \ + + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Golden_Treasures] + # calyx_crimson + from tasks.rogue.keywords import KEYWORDS_ROGUE_PATH as Path + order = [Path.Destruction, Path.The_Hunt, Path.Erudition, Path.The_Harmony, + Path.Nihility, Path.Preservation, Path.Abundance] + calyx_crimson = [] + for path in order: + calyx_crimson += [dungeon.name for dungeon in DungeonList.instances.values() + if dungeon.Calyx_Crimson_Path == path] + # stagnant_shadow + from tasks.character.keywords import CombatType + stagnant_shadow = [] + for type_ in CombatType.instances.values(): + stagnant_shadow += [dungeon.name for dungeon in DungeonList.instances.values() + if dungeon.Stagnant_Shadow_Combat_Type == type_] + cavern_of_corrosion = [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Cavern_of_Corrosion] option_add( keys='Dungeon.Name.option', - options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Golden] \ - + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Crimson] \ - + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Stagnant_Shadow] \ - + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Cavern_of_Corrosion] + options=calyx_golden + calyx_crimson + stagnant_shadow + cavern_of_corrosion ) # Double events - option_add( - keys='Dungeon.NameAtDoubleCalyx.option', - options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Golden] \ - + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Crimson] - ) - option_add( - keys='Dungeon.NameAtDoubleRelic.option', - options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Cavern_of_Corrosion]) + option_add(keys='Dungeon.NameAtDoubleCalyx.option', options=calyx_golden + calyx_crimson) + option_add(keys='Dungeon.NameAtDoubleRelic.option', options=cavern_of_corrosion) # Dungeon daily - option_add( - keys='DungeonDaily.CalyxGolden.option', - options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Golden]) - option_add( - keys='DungeonDaily.CalyxCrimson.option', - options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Crimson]) - option_add( - keys='DungeonDaily.StagnantShadow.option', - options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Stagnant_Shadow]) - option_add( - keys='DungeonDaily.CavernOfCorrosion.option', - options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Cavern_of_Corrosion]) + option_add(keys='DungeonDaily.CalyxGolden.option', options=calyx_golden) + option_add(keys='DungeonDaily.CalyxCrimson.option', options=calyx_crimson) + option_add(keys='DungeonDaily.StagnantShadow.option', options=stagnant_shadow) + option_add(keys='DungeonDaily.CavernOfCorrosion.option', options=cavern_of_corrosion) option_add( keys='Weekly.Name.option', options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Echo_of_War]) @@ -364,12 +365,57 @@ class ConfigGenerator: ingame_lang = gui_lang_to_ingame_lang(lang) dailies = deep_get(self.argument, keys='Dungeon.Name.option') # Dungeon names + i18n_memories = { + 'cn': '材料:角色经验({dungeon})', + 'cht': '材料:角色經驗({dungeon})', + 'jp': '素材:役割経験({dungeon}):', + 'en': 'Material: Character EXP ({dungeon})', + 'es': 'Material: EXP de personaje ({dungeon})', + } + i18n_aether = { + 'cn': '材料:武器经验({dungeon})', + 'cht': '材料:武器經驗({dungeon})', + 'jp': '素材:武器経験({dungeon}):', + 'en': 'Material: Light Cone EXP ({dungeon})', + 'es': 'Material: EXP de conos de luz ({dungeon})', + } + i18n_treasure = { + 'cn': '材料:信用点({dungeon})', + 'cht': '材料:信用點({dungeon})', + 'jp': '素材:クレジット({dungeon})', + 'en': 'Material: Credit ({dungeon})', + 'es': 'Material: Créditos ({dungeon})', + } + i18n_crimson = { + 'cn': '行迹材料:{path}({plane})', + 'cht': '行跡材料:{path}({plane})', + 'jp': '軌跡素材:{path}({plane})', + 'en': 'Trace: {path} ({plane})', + 'es': 'Rastros: {path} ({plane})', + } from tasks.dungeon.keywords import DungeonList, DungeonDetailed - if lang not in ['zh-CN', 'zh-TW', 'en-US', 'es-ES']: - for dungeon in DungeonList.instances.values(): - if dungeon.name in dailies: - value = dungeon.__getattribute__(ingame_lang) - deep_set(new, keys=['Dungeon', 'Name', dungeon.name], value=value) + for dungeon in DungeonList.instances.values(): + dungeon: DungeonList = dungeon + if not dungeon.plane: + continue + dungeon_name = dungeon.__getattribute__(ingame_lang) + dungeon_name = re.sub('[「」]', '', dungeon_name) + plane = dungeon.plane.__getattribute__(ingame_lang) + plane = re.sub('[「」]', '', plane) + if dungeon.is_Calyx_Golden_Memories: + deep_set(new, keys=['Dungeon', 'Name', dungeon.name], + value=i18n_memories[ingame_lang].format(dungeon=dungeon_name)) + if dungeon.is_Calyx_Golden_Aether: + deep_set(new, keys=['Dungeon', 'Name', dungeon.name], + value=i18n_aether[ingame_lang].format(dungeon=dungeon_name)) + if dungeon.is_Calyx_Golden_Treasures: + deep_set(new, keys=['Dungeon', 'Name', dungeon.name], + value=i18n_treasure[ingame_lang].format(dungeon=dungeon_name)) + if dungeon.is_Calyx_Crimson: + path = dungeon.Calyx_Crimson_Path.__getattribute__(ingame_lang) + deep_set(new, keys=['Dungeon', 'Name', dungeon.name], + value=i18n_crimson[ingame_lang].format(path=path, plane=plane)) + # Stagnant shadows with character names for dungeon in DungeonDetailed.instances.values(): if dungeon.name in dailies: diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index e61bff3c0..10809c95d 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -223,30 +223,41 @@ "Name": { "name": "Dungeon Name", "help": "Default dungeon setting", - "Calyx_Golden_Memories": "Material: Character EXP (Bud of Memories)", - "Calyx_Golden_Aether": "Material: Light Cone EXP (Bud of Aether)", - "Calyx_Golden_Treasures": "Material: Credit (Bud of Treasures)", - "Calyx_Crimson_Destruction": "Trace: Destruction (Bud of Destruction)", - "Calyx_Crimson_Preservation": "Trace: Preservation (Bud of Preservation)", - "Calyx_Crimson_The_Hunt": "Trace: Hunt (Bud of Hunt)", - "Calyx_Crimson_Abundance": "Trace: Abundance (Bud of Abundance)", - "Calyx_Crimson_Erudition": "Trace: Erudition (Bud of Erudition)", - "Calyx_Crimson_Harmony": "Trace: Harmony (Bud of Harmony)", - "Calyx_Crimson_Nihility": "Trace: Nihility (Bud of Nihility)", - "Stagnant_Shadow_Quanta": "Ascension: Quantum (Silver Wolf / Seele / Qingque)", - "Stagnant_Shadow_Gust": "Ascension: Wind (Dan Heng / Bronya / Sampo)", - "Stagnant_Shadow_Fulmination": "Ascension: Lightning (Arlan / Serval / Tingyun / Bailu)", - "Stagnant_Shadow_Blaze": "Ascension: Fire (Himeko / Asta / Hook)", + "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-VI))", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: Character EXP (Bud of Memories (The Xianzhou Luofu))", + "Calyx_Golden_Memories_Penacony": "Material: Character EXP (Bud of Memories (Penacony))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-VI))", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: Light Cone EXP (Bud of Aether (The Xianzhou Luofu))", + "Calyx_Golden_Aether_Penacony": "Material: Light Cone EXP (Bud of Aether (Penacony))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-VI))", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Credit (Bud of Treasures (The Xianzhou Luofu))", + "Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures (Penacony))", + "Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Trace: Destruction (Scalegorge Waterscape)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Trace: The Hunt (Outlying Snow Plains)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Trace: Erudition (Rivet Town)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Trace: The Harmony (Robot Settlement)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Trace: The Harmony (The Reverie (Dreamscape))", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Trace: Nihility (Great Mine)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Trace: Nihility (Alchemy Commission)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Trace: Abundance (Backwater Pass)", "Stagnant_Shadow_Spike": "Ascension: Physical (Natasha / Clara / Luka / Sushang)", - "Stagnant_Shadow_Rime": "Ascension: Ice (March 7th / Herta / Gepard / Pela)", - "Stagnant_Shadow_Mirage": "Ascension: Imaginary (Welt / Luocha / Yukong)", - "Stagnant_Shadow_Icicle": "Ascension: Ice (Yanqing / Jingliu / Ruan Mei)", - "Stagnant_Shadow_Doom": "Ascension: Lightning (Kafka / Jing Yuan)", - "Stagnant_Shadow_Puppetry": "Ascension: Imaginary (Dan Heng • Imbibitor Lunae / Dr. Ratio)", - "Stagnant_Shadow_Abomination": "Ascension: Quantum (Lynx / Fu Xuan / Xueyi)", - "Stagnant_Shadow_Scorch": "Ascension: Fire (Guinaifen / Topaz & Numby)", - "Stagnant_Shadow_Celestial": "Ascension: Wind (Blade / Huohuo)", "Stagnant_Shadow_Perdition": "Ascension: Physical (Hanya / Argenti)", + "Stagnant_Shadow_Blaze": "Ascension: Fire (Himeko / Asta / Hook)", + "Stagnant_Shadow_Scorch": "Ascension: Fire (Guinaifen / Topaz & Numby)", + "Stagnant_Shadow_Rime": "Ascension: Ice (March 7th / Herta / Gepard / Pela)", + "Stagnant_Shadow_Icicle": "Ascension: Ice (Yanqing / Jingliu / Ruan Mei)", + "Stagnant_Shadow_Nectar": "Ascension: Ice (Misha)", + "Stagnant_Shadow_Fulmination": "Ascension: Lightning (Arlan / Serval / Tingyun / Bailu)", + "Stagnant_Shadow_Doom": "Ascension: Lightning (Kafka / Jing Yuan)", + "Stagnant_Shadow_Gust": "Ascension: Wind (Dan Heng / Bronya / Sampo)", + "Stagnant_Shadow_Celestial": "Ascension: Wind (Blade / Huohuo / Black Swan)", + "Stagnant_Shadow_Quanta": "Ascension: Quantum (Silver Wolf / Seele / Qingque)", + "Stagnant_Shadow_Abomination": "Ascension: Quantum (Lynx / Fu Xuan / Xueyi)", + "Stagnant_Shadow_Roast": "Ascension: Quantum (Sparkle)", + "Stagnant_Shadow_Mirage": "Ascension: Imaginary (Welt / Luocha / Yukong)", + "Stagnant_Shadow_Puppetry": "Ascension: Imaginary (Dan Heng • Imbibitor Lunae / Dr. Ratio)", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "Relics: Ice Set & Wind Set (Path of Gelid Wind)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "Relics: Physical Set & Break Effect Set (Path of Jabbing Punch)", "Cavern_of_Corrosion_Path_of_Drifting": "Relics: Healing Set & Musketeer Set (Path of Drifting)", @@ -254,22 +265,32 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "Relics: DEF Set & Lighting Set (Path of Holy Hymn)", "Cavern_of_Corrosion_Path_of_Conflagration": "Relics: Fire Set & Imaginary Set (Path of Conflagration)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Relics: HP Set & SPD Set (Path of Elixir Seekers)", - "Cavern_of_Corrosion_Path_of_Darkness": "Relics: Pursuit Set & Dot Set (Path of Darkness)" + "Cavern_of_Corrosion_Path_of_Darkness": "Relics: Pursuit Set & Dot Set (Path of Darkness)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" }, "NameAtDoubleCalyx": { "name": "At Double Calyx Event, choose dungeon", "help": "Return to the default dungeon settings after double times exhausted", "do_not_participate": "Dont participate in event", - "Calyx_Golden_Memories": "Material: Character EXP (Bud of Memories)", - "Calyx_Golden_Aether": "Material: Light Cone EXP (Bud of Aether)", - "Calyx_Golden_Treasures": "Material: Credit (Bud of Treasures)", - "Calyx_Crimson_Destruction": "Trace: Destruction (Bud of Destruction)", - "Calyx_Crimson_Preservation": "Trace: Preservation (Bud of Preservation)", - "Calyx_Crimson_The_Hunt": "Trace: Hunt (Bud of Hunt)", - "Calyx_Crimson_Abundance": "Trace: Abundance (Bud of Abundance)", - "Calyx_Crimson_Erudition": "Trace: Erudition (Bud of Erudition)", - "Calyx_Crimson_Harmony": "Trace: Harmony (Bud of Harmony)", - "Calyx_Crimson_Nihility": "Trace: Nihility (Bud of Nihility)" + "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-VI))", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: Character EXP (Bud of Memories (The Xianzhou Luofu))", + "Calyx_Golden_Memories_Penacony": "Material: Character EXP (Bud of Memories (Penacony))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-VI))", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: Light Cone EXP (Bud of Aether (The Xianzhou Luofu))", + "Calyx_Golden_Aether_Penacony": "Material: Light Cone EXP (Bud of Aether (Penacony))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-VI))", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Credit (Bud of Treasures (The Xianzhou Luofu))", + "Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures (Penacony))", + "Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Trace: Destruction (Scalegorge Waterscape)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Trace: The Hunt (Outlying Snow Plains)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Trace: Erudition (Rivet Town)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Trace: The Harmony (Robot Settlement)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Trace: The Harmony (The Reverie (Dreamscape))", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Trace: Nihility (Great Mine)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Trace: Nihility (Alchemy Commission)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Trace: Abundance (Backwater Pass)" }, "NameAtDoubleRelic": { "name": "At Double Relic Event, choose dungeon", @@ -282,7 +303,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "Relics: DEF Set & Lighting Set (Path of Holy Hymn)", "Cavern_of_Corrosion_Path_of_Conflagration": "Relics: Fire Set & Imaginary Set (Path of Conflagration)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Relics: HP Set & SPD Set (Path of Elixir Seekers)", - "Cavern_of_Corrosion_Path_of_Darkness": "Relics: Pursuit Set & Dot Set (Path of Darkness)" + "Cavern_of_Corrosion_Path_of_Darkness": "Relics: Pursuit Set & Dot Set (Path of Darkness)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" }, "Team": { "name": "Dungeon Team", @@ -307,40 +329,51 @@ "name": "Clear Calyx Golden 1 times", "help": "", "do_not_achieve": "Don't Do This Quest", - "Calyx_Golden_Memories": "Material: Character EXP (Bud of Memories)", - "Calyx_Golden_Aether": "Material: Light Cone EXP (Bud of Aether)", - "Calyx_Golden_Treasures": "Material: Credit (Bud of Treasures)" + "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-VI))", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: Character EXP (Bud of Memories (The Xianzhou Luofu))", + "Calyx_Golden_Memories_Penacony": "Material: Character EXP (Bud of Memories (Penacony))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-VI))", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: Light Cone EXP (Bud of Aether (The Xianzhou Luofu))", + "Calyx_Golden_Aether_Penacony": "Material: Light Cone EXP (Bud of Aether (Penacony))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-VI))", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Credit (Bud of Treasures (The Xianzhou Luofu))", + "Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures (Penacony))" }, "CalyxCrimson": { "name": "Clear Calyx Crimson 1 times", "help": "", "do_not_achieve": "Don't Do This Quest", - "Calyx_Crimson_Destruction": "Trace: Destruction (Bud of Destruction)", - "Calyx_Crimson_Preservation": "Trace: Preservation (Bud of Preservation)", - "Calyx_Crimson_The_Hunt": "Trace: Hunt (Bud of Hunt)", - "Calyx_Crimson_Abundance": "Trace: Abundance (Bud of Abundance)", - "Calyx_Crimson_Erudition": "Trace: Erudition (Bud of Erudition)", - "Calyx_Crimson_Harmony": "Trace: Harmony (Bud of Harmony)", - "Calyx_Crimson_Nihility": "Trace: Nihility (Bud of Nihility)" + "Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Trace: Destruction (Scalegorge Waterscape)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Trace: The Hunt (Outlying Snow Plains)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Trace: Erudition (Rivet Town)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Trace: The Harmony (Robot Settlement)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Trace: The Harmony (The Reverie (Dreamscape))", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Trace: Nihility (Great Mine)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Trace: Nihility (Alchemy Commission)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Trace: Abundance (Backwater Pass)" }, "StagnantShadow": { "name": "Clear Stagnant Shadow 1 times", "help": "", "do_not_achieve": "Don't Do This Quest", - "Stagnant_Shadow_Quanta": "Ascension: Quantum (Silver Wolf / Seele / Qingque)", - "Stagnant_Shadow_Gust": "Ascension: Wind (Dan Heng / Bronya / Sampo)", - "Stagnant_Shadow_Fulmination": "Ascension: Lightning (Arlan / Serval / Tingyun / Bailu)", - "Stagnant_Shadow_Blaze": "Ascension: Fire (Himeko / Asta / Hook)", "Stagnant_Shadow_Spike": "Ascension: Physical (Natasha / Clara / Luka / Sushang)", - "Stagnant_Shadow_Rime": "Ascension: Ice (March 7th / Herta / Gepard / Pela)", - "Stagnant_Shadow_Mirage": "Ascension: Imaginary (Welt / Luocha / Yukong)", - "Stagnant_Shadow_Icicle": "Ascension: Ice (Yanqing / Jingliu / Ruan Mei)", - "Stagnant_Shadow_Doom": "Ascension: Lightning (Kafka / Jing Yuan)", - "Stagnant_Shadow_Puppetry": "Ascension: Imaginary (Dan Heng • Imbibitor Lunae / Dr. Ratio)", - "Stagnant_Shadow_Abomination": "Ascension: Quantum (Lynx / Fu Xuan / Xueyi)", + "Stagnant_Shadow_Perdition": "Ascension: Physical (Hanya / Argenti)", + "Stagnant_Shadow_Blaze": "Ascension: Fire (Himeko / Asta / Hook)", "Stagnant_Shadow_Scorch": "Ascension: Fire (Guinaifen / Topaz & Numby)", - "Stagnant_Shadow_Celestial": "Ascension: Wind (Blade / Huohuo)", - "Stagnant_Shadow_Perdition": "Ascension: Physical (Hanya / Argenti)" + "Stagnant_Shadow_Rime": "Ascension: Ice (March 7th / Herta / Gepard / Pela)", + "Stagnant_Shadow_Icicle": "Ascension: Ice (Yanqing / Jingliu / Ruan Mei)", + "Stagnant_Shadow_Nectar": "Ascension: Ice (Misha)", + "Stagnant_Shadow_Fulmination": "Ascension: Lightning (Arlan / Serval / Tingyun / Bailu)", + "Stagnant_Shadow_Doom": "Ascension: Lightning (Kafka / Jing Yuan)", + "Stagnant_Shadow_Gust": "Ascension: Wind (Dan Heng / Bronya / Sampo)", + "Stagnant_Shadow_Celestial": "Ascension: Wind (Blade / Huohuo / Black Swan)", + "Stagnant_Shadow_Quanta": "Ascension: Quantum (Silver Wolf / Seele / Qingque)", + "Stagnant_Shadow_Abomination": "Ascension: Quantum (Lynx / Fu Xuan / Xueyi)", + "Stagnant_Shadow_Roast": "Ascension: Quantum (Sparkle)", + "Stagnant_Shadow_Mirage": "Ascension: Imaginary (Welt / Luocha / Yukong)", + "Stagnant_Shadow_Puppetry": "Ascension: Imaginary (Dan Heng • Imbibitor Lunae / Dr. Ratio)" }, "CavernOfCorrosion": { "name": "Clear Cavern of Corrosion 1 times", @@ -353,7 +386,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "Relics: DEF Set & Lighting Set (Path of Holy Hymn)", "Cavern_of_Corrosion_Path_of_Conflagration": "Relics: Fire Set & Imaginary Set (Path of Conflagration)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Relics: HP Set & SPD Set (Path of Elixir Seekers)", - "Cavern_of_Corrosion_Path_of_Darkness": "Relics: Pursuit Set & Dot Set (Path of Darkness)" + "Cavern_of_Corrosion_Path_of_Darkness": "Relics: Pursuit Set & Dot Set (Path of Darkness)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" } }, "DungeonSupport": { @@ -376,6 +410,7 @@ "Arlan": "Arlan", "Asta": "Asta", "Bailu": "Bailu", + "BlackSwan": "Black Swan", "Blade": "Blade", "Bronya": "Bronya", "Clara": "Clara", @@ -397,6 +432,7 @@ "Luocha": "Luocha", "Lynx": "Lynx", "March7th": "March 7th", + "Misha": "Misha", "Natasha": "Natasha", "Pela": "Pela", "Qingque": "Qingque", @@ -737,6 +773,8 @@ "Born_to_Obey": "Ancient Part (Born to Obey)", "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", "The_Invisible_Hand": "Credit (The Invisible Hand)", @@ -745,7 +783,9 @@ "The_Land_of_Gold": "Protein Rice & Basic Ingredients (The Land of Gold)", "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", "Legend_of_the_Puppet_Master": "Jade Abacus Unit & Discarded Ingenium Parts (Legend of the Puppet Master)", - "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)" + "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_2": { "name": "Assignment 2 Preference", @@ -756,6 +796,8 @@ "Born_to_Obey": "Ancient Part (Born to Obey)", "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", "The_Invisible_Hand": "Credit (The Invisible Hand)", @@ -764,7 +806,9 @@ "The_Land_of_Gold": "Protein Rice & Basic Ingredients (The Land of Gold)", "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", "Legend_of_the_Puppet_Master": "Jade Abacus Unit & Discarded Ingenium Parts (Legend of the Puppet Master)", - "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)" + "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_3": { "name": "Assignment 3 Preference", @@ -775,6 +819,8 @@ "Born_to_Obey": "Ancient Part (Born to Obey)", "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", "The_Invisible_Hand": "Credit (The Invisible Hand)", @@ -783,7 +829,9 @@ "The_Land_of_Gold": "Protein Rice & Basic Ingredients (The Land of Gold)", "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", "Legend_of_the_Puppet_Master": "Jade Abacus Unit & Discarded Ingenium Parts (Legend of the Puppet Master)", - "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)" + "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_4": { "name": "Assignment 4 Preference", @@ -794,6 +842,8 @@ "Born_to_Obey": "Ancient Part (Born to Obey)", "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", "The_Invisible_Hand": "Credit (The Invisible Hand)", @@ -802,7 +852,9 @@ "The_Land_of_Gold": "Protein Rice & Basic Ingredients (The Land of Gold)", "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", "Legend_of_the_Puppet_Master": "Jade Abacus Unit & Discarded Ingenium Parts (Legend of the Puppet Master)", - "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)" + "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Duration": { "name": "Dispatch Duration", diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index 3103b4e4c..e3a2f2659 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -223,30 +223,41 @@ "Name": { "name": "Nombre de la Mazmorra", "help": "Ajustes predeterminados de las mazmorras", - "Calyx_Golden_Memories": "Material: EXP de personaje (Flor de los recuerdos)", - "Calyx_Golden_Aether": "Material: EXP de conos de luz (Flor de éter)", - "Calyx_Golden_Treasures": "Material: Créditos (Flor de tesoros)", - "Calyx_Crimson_Destruction": "Rastros: Destrucción (Flor de la Destrucción)", - "Calyx_Crimson_Preservation": "Rastros: Conservación (Flor de la Conservación)", - "Calyx_Crimson_The_Hunt": "Rastros: Cacería (Flor de la Cacería)", - "Calyx_Crimson_Abundance": "Rastros: Abundancia (Flor de la Abundancia)", - "Calyx_Crimson_Erudition": "Rastros: Erudición (Flor de la Erudición)", - "Calyx_Crimson_Harmony": "Rastros: Armonía (Flor de la Armonía)", - "Calyx_Crimson_Nihility": "Rastros: Nihilidad (Flor de la Nihilidad)", - "Stagnant_Shadow_Quanta": "Ascension: Cuántico (Silver Wolf / Seele / Qingque)", - "Stagnant_Shadow_Gust": "Ascension: Viento (Dan Heng / Bronya / Sampo)", - "Stagnant_Shadow_Fulmination": "Ascension: Rayo (Arlan / Serval / Tingyun / Bailu)", - "Stagnant_Shadow_Blaze": "Ascension: Fuego (Himeko / Asta / Hook)", + "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-VI))", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: EXP de personaje (Flor de los recuerdos (El Luofu de Xianzhou))", + "Calyx_Golden_Memories_Penacony": "Material: EXP de personaje (Flor de los recuerdos (Colonipenal))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-VI))", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: EXP de conos de luz (Flor de éter (El Luofu de Xianzhou))", + "Calyx_Golden_Aether_Penacony": "Material: EXP de conos de luz (Flor de éter (Colonipenal))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-VI))", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Créditos (Flor de tesoros (El Luofu de Xianzhou))", + "Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros (Colonipenal))", + "Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Rastros: Destrucción (Desfiladero de Escamas)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Rastros: Cacería (Llanuras nevadas de las afueras)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Rastros: Erudición (Villarremache)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Rastros: Armonía (Asentamiento robot)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Rastros: Armonía (Hotel Fantasía (paisaje onírico))", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Rastros: Nihilidad (Mina principal)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Rastros: Nihilidad (Comisión de Alquimia)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Rastros: Abundancia (Paso del Remanso)", "Stagnant_Shadow_Spike": "Ascension: Físico (Natasha / Clara / Luka / Sushang)", - "Stagnant_Shadow_Rime": "Ascension: Hielo (Siete de Marzo / Herta / Gepard / Pela)", - "Stagnant_Shadow_Mirage": "Ascension: Imaginario (Welt / Luocha / Yukong)", - "Stagnant_Shadow_Icicle": "Ascension: Hielo (Yanqing / Jingliu / Ruan Mei)", - "Stagnant_Shadow_Doom": "Ascension: Rayo (Kafka / Jing Yuan)", - "Stagnant_Shadow_Puppetry": "Ascension: Imaginario (Dan Heng - Imbibitor Lunae / Dr. Ratio)", - "Stagnant_Shadow_Abomination": "Ascension: Cuántico (Lynx / Fu Xuan / Xueyi)", - "Stagnant_Shadow_Scorch": "Ascension: Fuego (Guinaifen / Topaz y Conti)", - "Stagnant_Shadow_Celestial": "Ascension: Viento (Blade / Huohuo)", "Stagnant_Shadow_Perdition": "Ascension: Físico (Hanya / Argenti)", + "Stagnant_Shadow_Blaze": "Ascension: Fuego (Himeko / Asta / Hook)", + "Stagnant_Shadow_Scorch": "Ascension: Fuego (Guinaifen / Topaz y Conti)", + "Stagnant_Shadow_Rime": "Ascension: Hielo (Siete de Marzo / Herta / Gepard / Pela)", + "Stagnant_Shadow_Icicle": "Ascension: Hielo (Yanqing / Jingliu / Ruan Mei)", + "Stagnant_Shadow_Nectar": "Ascension: Hielo (Misha)", + "Stagnant_Shadow_Fulmination": "Ascension: Rayo (Arlan / Serval / Tingyun / Bailu)", + "Stagnant_Shadow_Doom": "Ascension: Rayo (Kafka / Jing Yuan)", + "Stagnant_Shadow_Gust": "Ascension: Viento (Dan Heng / Bronya / Sampo)", + "Stagnant_Shadow_Celestial": "Ascension: Viento (Blade / Huohuo / Cisne Negro)", + "Stagnant_Shadow_Quanta": "Ascension: Cuántico (Silver Wolf / Seele / Qingque)", + "Stagnant_Shadow_Abomination": "Ascension: Cuántico (Lynx / Fu Xuan / Xueyi)", + "Stagnant_Shadow_Roast": "Ascension: Cuántico (Sparkle)", + "Stagnant_Shadow_Mirage": "Ascension: Imaginario (Welt / Luocha / Yukong)", + "Stagnant_Shadow_Puppetry": "Ascension: Imaginario (Dan Heng - Imbibitor Lunae / Dr. Ratio)", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "Artefactos: Hielo y Viento (Senda del viento gélido)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "Artefactos: Físico y Efecto de Ruptura (Senda de los puños rápidos)", "Cavern_of_Corrosion_Path_of_Drifting": "Artefactos: Curación y Pistolera de la espiga silvestre (Senda de la deriva)", @@ -254,22 +265,32 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "Artefactos: Defensa y Trueno (Senda del himno sagrado)", "Cavern_of_Corrosion_Path_of_Conflagration": "Artefactos: Fuego e Imaginario (Senda de la conflagración)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Artefactos: HP y SPD (Senda de los elixires)", - "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)" + "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" }, "NameAtDoubleCalyx": { "name": "En los eventos de x2 de Cáliz", "help": "Se volverán a los ajustes predeterminados una vez se acaben los intentos del evento", "do_not_participate": "No participar en el evento", - "Calyx_Golden_Memories": "Material: EXP de personaje (Flor de los recuerdos)", - "Calyx_Golden_Aether": "Material: EXP de conos de luz (Flor de éter)", - "Calyx_Golden_Treasures": "Material: Créditos (Flor de tesoros)", - "Calyx_Crimson_Destruction": "Rastros: Destrucción (Flor de la Destrucción)", - "Calyx_Crimson_Preservation": "Rastros: Conservación (Flor de la Conservación)", - "Calyx_Crimson_The_Hunt": "Rastros: Cacería (Flor de la Cacería)", - "Calyx_Crimson_Abundance": "Rastros: Abundancia (Flor de la Abundancia)", - "Calyx_Crimson_Erudition": "Rastros: Erudición (Flor de la Erudición)", - "Calyx_Crimson_Harmony": "Rastros: Armonía (Flor de la Armonía)", - "Calyx_Crimson_Nihility": "Rastros: Nihilidad (Flor de la Nihilidad)" + "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-VI))", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: EXP de personaje (Flor de los recuerdos (El Luofu de Xianzhou))", + "Calyx_Golden_Memories_Penacony": "Material: EXP de personaje (Flor de los recuerdos (Colonipenal))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-VI))", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: EXP de conos de luz (Flor de éter (El Luofu de Xianzhou))", + "Calyx_Golden_Aether_Penacony": "Material: EXP de conos de luz (Flor de éter (Colonipenal))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-VI))", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Créditos (Flor de tesoros (El Luofu de Xianzhou))", + "Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros (Colonipenal))", + "Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Rastros: Destrucción (Desfiladero de Escamas)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Rastros: Cacería (Llanuras nevadas de las afueras)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Rastros: Erudición (Villarremache)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Rastros: Armonía (Asentamiento robot)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Rastros: Armonía (Hotel Fantasía (paisaje onírico))", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Rastros: Nihilidad (Mina principal)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Rastros: Nihilidad (Comisión de Alquimia)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Rastros: Abundancia (Paso del Remanso)" }, "NameAtDoubleRelic": { "name": "En los eventos de x2 de Caverna de la corrosión", @@ -282,7 +303,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "Artefactos: Defensa y Trueno (Senda del himno sagrado)", "Cavern_of_Corrosion_Path_of_Conflagration": "Artefactos: Fuego e Imaginario (Senda de la conflagración)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Artefactos: HP y SPD (Senda de los elixires)", - "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)" + "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" }, "Team": { "name": "Equipo de mazmorra", @@ -307,40 +329,51 @@ "name": "Completar Cáliz (oro) 1 vez", "help": "", "do_not_achieve": "No hacer esta misión", - "Calyx_Golden_Memories": "Material: EXP de personaje (Flor de los recuerdos)", - "Calyx_Golden_Aether": "Material: EXP de conos de luz (Flor de éter)", - "Calyx_Golden_Treasures": "Material: Créditos (Flor de tesoros)" + "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-VI))", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: EXP de personaje (Flor de los recuerdos (El Luofu de Xianzhou))", + "Calyx_Golden_Memories_Penacony": "Material: EXP de personaje (Flor de los recuerdos (Colonipenal))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-VI))", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: EXP de conos de luz (Flor de éter (El Luofu de Xianzhou))", + "Calyx_Golden_Aether_Penacony": "Material: EXP de conos de luz (Flor de éter (Colonipenal))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-VI))", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Créditos (Flor de tesoros (El Luofu de Xianzhou))", + "Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros (Colonipenal))" }, "CalyxCrimson": { "name": "Completar Cáliz (carmesí) 1 vez", "help": "", "do_not_achieve": "No hacer esta misión", - "Calyx_Crimson_Destruction": "Rastros: Destrucción (Flor de la Destrucción)", - "Calyx_Crimson_Preservation": "Rastros: Conservación (Flor de la Conservación)", - "Calyx_Crimson_The_Hunt": "Rastros: Cacería (Flor de la Cacería)", - "Calyx_Crimson_Abundance": "Rastros: Abundancia (Flor de la Abundancia)", - "Calyx_Crimson_Erudition": "Rastros: Erudición (Flor de la Erudición)", - "Calyx_Crimson_Harmony": "Rastros: Armonía (Flor de la Armonía)", - "Calyx_Crimson_Nihility": "Rastros: Nihilidad (Flor de la Nihilidad)" + "Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Rastros: Destrucción (Desfiladero de Escamas)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Rastros: Cacería (Llanuras nevadas de las afueras)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Rastros: Erudición (Villarremache)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Rastros: Armonía (Asentamiento robot)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Rastros: Armonía (Hotel Fantasía (paisaje onírico))", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Rastros: Nihilidad (Mina principal)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Rastros: Nihilidad (Comisión de Alquimia)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Rastros: Abundancia (Paso del Remanso)" }, "StagnantShadow": { "name": "Completar Sombra paralizada 1 vez", "help": "", "do_not_achieve": "No hacer esta misión", - "Stagnant_Shadow_Quanta": "Ascension: Cuántico (Silver Wolf / Seele / Qingque)", - "Stagnant_Shadow_Gust": "Ascension: Viento (Dan Heng / Bronya / Sampo)", - "Stagnant_Shadow_Fulmination": "Ascension: Rayo (Arlan / Serval / Tingyun / Bailu)", - "Stagnant_Shadow_Blaze": "Ascension: Fuego (Himeko / Asta / Hook)", "Stagnant_Shadow_Spike": "Ascension: Físico (Natasha / Clara / Luka / Sushang)", - "Stagnant_Shadow_Rime": "Ascension: Hielo (Siete de Marzo / Herta / Gepard / Pela)", - "Stagnant_Shadow_Mirage": "Ascension: Imaginario (Welt / Luocha / Yukong)", - "Stagnant_Shadow_Icicle": "Ascension: Hielo (Yanqing / Jingliu / Ruan Mei)", - "Stagnant_Shadow_Doom": "Ascension: Rayo (Kafka / Jing Yuan)", - "Stagnant_Shadow_Puppetry": "Ascension: Imaginario (Dan Heng - Imbibitor Lunae / Dr. Ratio)", - "Stagnant_Shadow_Abomination": "Ascension: Cuántico (Lynx / Fu Xuan / Xueyi)", + "Stagnant_Shadow_Perdition": "Ascension: Físico (Hanya / Argenti)", + "Stagnant_Shadow_Blaze": "Ascension: Fuego (Himeko / Asta / Hook)", "Stagnant_Shadow_Scorch": "Ascension: Fuego (Guinaifen / Topaz y Conti)", - "Stagnant_Shadow_Celestial": "Ascension: Viento (Blade / Huohuo)", - "Stagnant_Shadow_Perdition": "Ascension: Físico (Hanya / Argenti)" + "Stagnant_Shadow_Rime": "Ascension: Hielo (Siete de Marzo / Herta / Gepard / Pela)", + "Stagnant_Shadow_Icicle": "Ascension: Hielo (Yanqing / Jingliu / Ruan Mei)", + "Stagnant_Shadow_Nectar": "Ascension: Hielo (Misha)", + "Stagnant_Shadow_Fulmination": "Ascension: Rayo (Arlan / Serval / Tingyun / Bailu)", + "Stagnant_Shadow_Doom": "Ascension: Rayo (Kafka / Jing Yuan)", + "Stagnant_Shadow_Gust": "Ascension: Viento (Dan Heng / Bronya / Sampo)", + "Stagnant_Shadow_Celestial": "Ascension: Viento (Blade / Huohuo / Cisne Negro)", + "Stagnant_Shadow_Quanta": "Ascension: Cuántico (Silver Wolf / Seele / Qingque)", + "Stagnant_Shadow_Abomination": "Ascension: Cuántico (Lynx / Fu Xuan / Xueyi)", + "Stagnant_Shadow_Roast": "Ascension: Cuántico (Sparkle)", + "Stagnant_Shadow_Mirage": "Ascension: Imaginario (Welt / Luocha / Yukong)", + "Stagnant_Shadow_Puppetry": "Ascension: Imaginario (Dan Heng - Imbibitor Lunae / Dr. Ratio)" }, "CavernOfCorrosion": { "name": "Completar Caverna de la corrosión 1 vez", @@ -353,7 +386,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "Artefactos: Defensa y Trueno (Senda del himno sagrado)", "Cavern_of_Corrosion_Path_of_Conflagration": "Artefactos: Fuego e Imaginario (Senda de la conflagración)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Artefactos: HP y SPD (Senda de los elixires)", - "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)" + "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" } }, "DungeonSupport": { @@ -376,6 +410,7 @@ "Arlan": "Arlan", "Asta": "Asta", "Bailu": "Bailu", + "BlackSwan": "Cisne Negro", "Blade": "Blade", "Bronya": "Bronya", "Clara": "Clara", @@ -397,6 +432,7 @@ "Luocha": "Luocha", "Lynx": "Lynx", "March7th": "Siete de Marzo", + "Misha": "Misha", "Natasha": "Natasha", "Pela": "Pela", "Qingque": "Qingque", @@ -737,6 +773,8 @@ "Born_to_Obey": "Componente antiguo (Creados para obedecer)", "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "Akashic_Records": "Material de EXP de cono de luz (Los Registros de Akasha)", "The_Invisible_Hand": "Créditos (La mano invisible)", @@ -745,7 +783,9 @@ "The_Land_of_Gold": "Arroz protéico e Ingredientes básicos (Tierra de oportunidades)", "The_Blossom_in_the_Storm": "Líquido gaseoso y Semilla (Flores en la tormenta)", "Legend_of_the_Puppet_Master": "Unidad de ábaco de jade y Componentes mecánicos abandonados (La leyenda del titiritero)", - "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)" + "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_2": { "name": "Preferencia de Encargo 2", @@ -756,6 +796,8 @@ "Born_to_Obey": "Componente antiguo (Creados para obedecer)", "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "Akashic_Records": "Material de EXP de cono de luz (Los Registros de Akasha)", "The_Invisible_Hand": "Créditos (La mano invisible)", @@ -764,7 +806,9 @@ "The_Land_of_Gold": "Arroz protéico e Ingredientes básicos (Tierra de oportunidades)", "The_Blossom_in_the_Storm": "Líquido gaseoso y Semilla (Flores en la tormenta)", "Legend_of_the_Puppet_Master": "Unidad de ábaco de jade y Componentes mecánicos abandonados (La leyenda del titiritero)", - "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)" + "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_3": { "name": "Preferencia de Encargo 3", @@ -775,6 +819,8 @@ "Born_to_Obey": "Componente antiguo (Creados para obedecer)", "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "Akashic_Records": "Material de EXP de cono de luz (Los Registros de Akasha)", "The_Invisible_Hand": "Créditos (La mano invisible)", @@ -783,7 +829,9 @@ "The_Land_of_Gold": "Arroz protéico e Ingredientes básicos (Tierra de oportunidades)", "The_Blossom_in_the_Storm": "Líquido gaseoso y Semilla (Flores en la tormenta)", "Legend_of_the_Puppet_Master": "Unidad de ábaco de jade y Componentes mecánicos abandonados (La leyenda del titiritero)", - "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)" + "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_4": { "name": "Preferencia de Encargo 4", @@ -794,6 +842,8 @@ "Born_to_Obey": "Componente antiguo (Creados para obedecer)", "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "Akashic_Records": "Material de EXP de cono de luz (Los Registros de Akasha)", "The_Invisible_Hand": "Créditos (La mano invisible)", @@ -802,7 +852,9 @@ "The_Land_of_Gold": "Arroz protéico e Ingredientes básicos (Tierra de oportunidades)", "The_Blossom_in_the_Storm": "Líquido gaseoso y Semilla (Flores en la tormenta)", "Legend_of_the_Puppet_Master": "Unidad de ábaco de jade y Componentes mecánicos abandonados (La leyenda del titiritero)", - "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)" + "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Duration": { "name": "Duración del encargo", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 641efc2b5..79dada7a5 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -223,30 +223,41 @@ "Name": { "name": "Dungeon.Name.name", "help": "Dungeon.Name.help", - "Calyx_Golden_Memories": "疑似花萼(金)・回憶の蕾", - "Calyx_Golden_Aether": "疑似花萼(金)・エーテルの蕾", - "Calyx_Golden_Treasures": "疑似花萼(金)・秘蔵の蕾", - "Calyx_Crimson_Destruction": "疑似花萼(赤)・壊滅の蕾", - "Calyx_Crimson_Preservation": "疑似花萼(赤)・存護の蕾", - "Calyx_Crimson_The_Hunt": "疑似花萼(赤)・巡狩の蕾", - "Calyx_Crimson_Abundance": "疑似花萼(赤)・豊穣の蕾", - "Calyx_Crimson_Erudition": "疑似花萼(赤)・知恵の蕾", - "Calyx_Crimson_Harmony": "疑似花萼(赤)・調和の蕾", - "Calyx_Crimson_Nihility": "疑似花萼(赤)・虚無の蕾", - "Stagnant_Shadow_Quanta": "キャラクター昇格素材:量子(銀狼 / ゼーレ / 青雀)", - "Stagnant_Shadow_Gust": "キャラクター昇格素材:風(丹恒 / ブローニャ / サンポ)", - "Stagnant_Shadow_Fulmination": "キャラクター昇格素材:雷(アーラン / セーバル / 停雲 / 白露)", - "Stagnant_Shadow_Blaze": "キャラクター昇格素材:炎(姫子 / アスター / フック)", + "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-VI):", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "素材:役割経験(回憶の蕾・仙舟羅浮):", + "Calyx_Golden_Memories_Penacony": "素材:役割経験(回憶の蕾・ピノコニー):", + "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-VI):", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "素材:武器経験(エーテルの蕾・仙舟羅浮):", + "Calyx_Golden_Aether_Penacony": "素材:武器経験(エーテルの蕾・ピノコニー):", + "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-VI)", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "素材:クレジット(秘蔵の蕾・仙舟羅浮)", + "Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾・ピノコニー)", + "Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "軌跡素材:壊滅(鱗淵境)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "軌跡素材:巡狩(郊外雪原)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "軌跡素材:知恵(リベットタウン)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "軌跡素材:調和(機械集落)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "軌跡素材:調和(ホテル・レバリー-夢境)", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "軌跡素材:虚無(大鉱区)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "軌跡素材:虚無(丹鼎司)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "軌跡素材:豊穣(外縁通路)", "Stagnant_Shadow_Spike": "キャラクター昇格素材:物理(ナターシャ / クラーラ / ルカ / 素裳)", - "Stagnant_Shadow_Rime": "キャラクター昇格素材:氷(三月なのか / ヘルタ / ジェパード / ペラ)", - "Stagnant_Shadow_Mirage": "キャラクター昇格素材:虚数(ヴェルト / 羅刹 / 御空)", - "Stagnant_Shadow_Icicle": "キャラクター昇格素材:氷(彦卿 / 鏡流 / ルアン・メェイ)", - "Stagnant_Shadow_Doom": "キャラクター昇格素材:雷(カフカ / 景元)", - "Stagnant_Shadow_Puppetry": "キャラクター昇格素材:虚数(丹恒・飲月 / Dr.レイシオ)", - "Stagnant_Shadow_Abomination": "キャラクター昇格素材:量子(リンクス / 符玄 / 雪衣)", - "Stagnant_Shadow_Scorch": "キャラクター昇格素材:炎(桂乃芬 / トパーズ&カブ)", - "Stagnant_Shadow_Celestial": "キャラクター昇格素材:風(刃 / フォフォ)", "Stagnant_Shadow_Perdition": "キャラクター昇格素材:物理(寒鴉 / アルジェンティ)", + "Stagnant_Shadow_Blaze": "キャラクター昇格素材:炎(姫子 / アスター / フック)", + "Stagnant_Shadow_Scorch": "キャラクター昇格素材:炎(桂乃芬 / トパーズ&カブ)", + "Stagnant_Shadow_Rime": "キャラクター昇格素材:氷(三月なのか / ヘルタ / ジェパード / ペラ)", + "Stagnant_Shadow_Icicle": "キャラクター昇格素材:氷(彦卿 / 鏡流 / ルアン・メェイ)", + "Stagnant_Shadow_Nectar": "キャラクター昇格素材:氷(ミーシャ)", + "Stagnant_Shadow_Fulmination": "キャラクター昇格素材:雷(アーラン / セーバル / 停雲 / 白露)", + "Stagnant_Shadow_Doom": "キャラクター昇格素材:雷(カフカ / 景元)", + "Stagnant_Shadow_Gust": "キャラクター昇格素材:風(丹恒 / ブローニャ / サンポ)", + "Stagnant_Shadow_Celestial": "キャラクター昇格素材:風(刃 / フォフォ / ブラックスワン)", + "Stagnant_Shadow_Quanta": "キャラクター昇格素材:量子(銀狼 / ゼーレ / 青雀)", + "Stagnant_Shadow_Abomination": "キャラクター昇格素材:量子(リンクス / 符玄 / 雪衣)", + "Stagnant_Shadow_Roast": "キャラクター昇格素材:量子(花火)", + "Stagnant_Shadow_Mirage": "キャラクター昇格素材:虚数(ヴェルト / 羅刹 / 御空)", + "Stagnant_Shadow_Puppetry": "キャラクター昇格素材:虚数(丹恒・飲月 / Dr.レイシオ)", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路", "Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路", @@ -254,22 +265,32 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路", "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路", - "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路" + "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路", + "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路" }, "NameAtDoubleCalyx": { "name": "Dungeon.NameAtDoubleCalyx.name", "help": "Dungeon.NameAtDoubleCalyx.help", "do_not_participate": "do_not_participate", - "Calyx_Golden_Memories": "疑似花萼(金)・回憶の蕾", - "Calyx_Golden_Aether": "疑似花萼(金)・エーテルの蕾", - "Calyx_Golden_Treasures": "疑似花萼(金)・秘蔵の蕾", - "Calyx_Crimson_Destruction": "疑似花萼(赤)・壊滅の蕾", - "Calyx_Crimson_Preservation": "疑似花萼(赤)・存護の蕾", - "Calyx_Crimson_The_Hunt": "疑似花萼(赤)・巡狩の蕾", - "Calyx_Crimson_Abundance": "疑似花萼(赤)・豊穣の蕾", - "Calyx_Crimson_Erudition": "疑似花萼(赤)・知恵の蕾", - "Calyx_Crimson_Harmony": "疑似花萼(赤)・調和の蕾", - "Calyx_Crimson_Nihility": "疑似花萼(赤)・虚無の蕾" + "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-VI):", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "素材:役割経験(回憶の蕾・仙舟羅浮):", + "Calyx_Golden_Memories_Penacony": "素材:役割経験(回憶の蕾・ピノコニー):", + "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-VI):", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "素材:武器経験(エーテルの蕾・仙舟羅浮):", + "Calyx_Golden_Aether_Penacony": "素材:武器経験(エーテルの蕾・ピノコニー):", + "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-VI)", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "素材:クレジット(秘蔵の蕾・仙舟羅浮)", + "Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾・ピノコニー)", + "Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "軌跡素材:壊滅(鱗淵境)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "軌跡素材:巡狩(郊外雪原)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "軌跡素材:知恵(リベットタウン)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "軌跡素材:調和(機械集落)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "軌跡素材:調和(ホテル・レバリー-夢境)", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "軌跡素材:虚無(大鉱区)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "軌跡素材:虚無(丹鼎司)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "軌跡素材:豊穣(外縁通路)" }, "NameAtDoubleRelic": { "name": "Dungeon.NameAtDoubleRelic.name", @@ -282,7 +303,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路", "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路", - "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路" + "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路", + "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路" }, "Team": { "name": "Dungeon.Team.name", @@ -307,40 +329,51 @@ "name": "DungeonDaily.CalyxGolden.name", "help": "DungeonDaily.CalyxGolden.help", "do_not_achieve": "do_not_achieve", - "Calyx_Golden_Memories": "疑似花萼(金)・回憶の蕾", - "Calyx_Golden_Aether": "疑似花萼(金)・エーテルの蕾", - "Calyx_Golden_Treasures": "疑似花萼(金)・秘蔵の蕾" + "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-VI):", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "素材:役割経験(回憶の蕾・仙舟羅浮):", + "Calyx_Golden_Memories_Penacony": "素材:役割経験(回憶の蕾・ピノコニー):", + "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-VI):", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "素材:武器経験(エーテルの蕾・仙舟羅浮):", + "Calyx_Golden_Aether_Penacony": "素材:武器経験(エーテルの蕾・ピノコニー):", + "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-VI)", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "素材:クレジット(秘蔵の蕾・仙舟羅浮)", + "Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾・ピノコニー)" }, "CalyxCrimson": { "name": "DungeonDaily.CalyxCrimson.name", "help": "DungeonDaily.CalyxCrimson.help", "do_not_achieve": "do_not_achieve", - "Calyx_Crimson_Destruction": "疑似花萼(赤)・壊滅の蕾", - "Calyx_Crimson_Preservation": "疑似花萼(赤)・存護の蕾", - "Calyx_Crimson_The_Hunt": "疑似花萼(赤)・巡狩の蕾", - "Calyx_Crimson_Abundance": "疑似花萼(赤)・豊穣の蕾", - "Calyx_Crimson_Erudition": "疑似花萼(赤)・知恵の蕾", - "Calyx_Crimson_Harmony": "疑似花萼(赤)・調和の蕾", - "Calyx_Crimson_Nihility": "疑似花萼(赤)・虚無の蕾" + "Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "軌跡素材:壊滅(鱗淵境)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "軌跡素材:巡狩(郊外雪原)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "軌跡素材:知恵(リベットタウン)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "軌跡素材:調和(機械集落)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "軌跡素材:調和(ホテル・レバリー-夢境)", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "軌跡素材:虚無(大鉱区)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "軌跡素材:虚無(丹鼎司)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "軌跡素材:豊穣(外縁通路)" }, "StagnantShadow": { "name": "DungeonDaily.StagnantShadow.name", "help": "DungeonDaily.StagnantShadow.help", "do_not_achieve": "do_not_achieve", - "Stagnant_Shadow_Quanta": "キャラクター昇格素材:量子(銀狼 / ゼーレ / 青雀)", - "Stagnant_Shadow_Gust": "キャラクター昇格素材:風(丹恒 / ブローニャ / サンポ)", - "Stagnant_Shadow_Fulmination": "キャラクター昇格素材:雷(アーラン / セーバル / 停雲 / 白露)", - "Stagnant_Shadow_Blaze": "キャラクター昇格素材:炎(姫子 / アスター / フック)", "Stagnant_Shadow_Spike": "キャラクター昇格素材:物理(ナターシャ / クラーラ / ルカ / 素裳)", - "Stagnant_Shadow_Rime": "キャラクター昇格素材:氷(三月なのか / ヘルタ / ジェパード / ペラ)", - "Stagnant_Shadow_Mirage": "キャラクター昇格素材:虚数(ヴェルト / 羅刹 / 御空)", - "Stagnant_Shadow_Icicle": "キャラクター昇格素材:氷(彦卿 / 鏡流 / ルアン・メェイ)", - "Stagnant_Shadow_Doom": "キャラクター昇格素材:雷(カフカ / 景元)", - "Stagnant_Shadow_Puppetry": "キャラクター昇格素材:虚数(丹恒・飲月 / Dr.レイシオ)", - "Stagnant_Shadow_Abomination": "キャラクター昇格素材:量子(リンクス / 符玄 / 雪衣)", + "Stagnant_Shadow_Perdition": "キャラクター昇格素材:物理(寒鴉 / アルジェンティ)", + "Stagnant_Shadow_Blaze": "キャラクター昇格素材:炎(姫子 / アスター / フック)", "Stagnant_Shadow_Scorch": "キャラクター昇格素材:炎(桂乃芬 / トパーズ&カブ)", - "Stagnant_Shadow_Celestial": "キャラクター昇格素材:風(刃 / フォフォ)", - "Stagnant_Shadow_Perdition": "キャラクター昇格素材:物理(寒鴉 / アルジェンティ)" + "Stagnant_Shadow_Rime": "キャラクター昇格素材:氷(三月なのか / ヘルタ / ジェパード / ペラ)", + "Stagnant_Shadow_Icicle": "キャラクター昇格素材:氷(彦卿 / 鏡流 / ルアン・メェイ)", + "Stagnant_Shadow_Nectar": "キャラクター昇格素材:氷(ミーシャ)", + "Stagnant_Shadow_Fulmination": "キャラクター昇格素材:雷(アーラン / セーバル / 停雲 / 白露)", + "Stagnant_Shadow_Doom": "キャラクター昇格素材:雷(カフカ / 景元)", + "Stagnant_Shadow_Gust": "キャラクター昇格素材:風(丹恒 / ブローニャ / サンポ)", + "Stagnant_Shadow_Celestial": "キャラクター昇格素材:風(刃 / フォフォ / ブラックスワン)", + "Stagnant_Shadow_Quanta": "キャラクター昇格素材:量子(銀狼 / ゼーレ / 青雀)", + "Stagnant_Shadow_Abomination": "キャラクター昇格素材:量子(リンクス / 符玄 / 雪衣)", + "Stagnant_Shadow_Roast": "キャラクター昇格素材:量子(花火)", + "Stagnant_Shadow_Mirage": "キャラクター昇格素材:虚数(ヴェルト / 羅刹 / 御空)", + "Stagnant_Shadow_Puppetry": "キャラクター昇格素材:虚数(丹恒・飲月 / Dr.レイシオ)" }, "CavernOfCorrosion": { "name": "DungeonDaily.CavernOfCorrosion.name", @@ -353,7 +386,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路", "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路", - "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路" + "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路", + "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路" } }, "DungeonSupport": { @@ -376,6 +410,7 @@ "Arlan": "アーラン", "Asta": "アスター", "Bailu": "白露", + "BlackSwan": "ブラックスワン", "Blade": "刃", "Bronya": "ブローニャ", "Clara": "クラーラ", @@ -397,6 +432,7 @@ "Luocha": "羅刹", "Lynx": "リンクス", "March7th": "三月なのか", + "Misha": "ミーシャ", "Natasha": "ナターシャ", "Pela": "ペラ", "Qingque": "青雀", @@ -737,6 +773,8 @@ "Born_to_Obey": "古代パーツ(生まれながらに服従する)", "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "キャラクターの経験値素材(無名の地、無名の人)", "Akashic_Records": "光円錐強化素材(アーカーシャの記録)", "The_Invisible_Hand": "信用ポイント(見えざる手)", @@ -745,7 +783,9 @@ "The_Land_of_Gold": "タンパク米と基本食材(黄金の大地)", "The_Blossom_in_the_Storm": "気態流体と種子(嵐の中で咲き誇る花)", "Legend_of_the_Puppet_Master": "玉兆単元&廃棄された機巧部品(傀儡師伝説)", - "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)" + "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_2": { "name": "依頼 2", @@ -756,6 +796,8 @@ "Born_to_Obey": "古代パーツ(生まれながらに服従する)", "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "キャラクターの経験値素材(無名の地、無名の人)", "Akashic_Records": "光円錐強化素材(アーカーシャの記録)", "The_Invisible_Hand": "信用ポイント(見えざる手)", @@ -764,7 +806,9 @@ "The_Land_of_Gold": "タンパク米と基本食材(黄金の大地)", "The_Blossom_in_the_Storm": "気態流体と種子(嵐の中で咲き誇る花)", "Legend_of_the_Puppet_Master": "玉兆単元&廃棄された機巧部品(傀儡師伝説)", - "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)" + "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_3": { "name": "依頼 3", @@ -775,6 +819,8 @@ "Born_to_Obey": "古代パーツ(生まれながらに服従する)", "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "キャラクターの経験値素材(無名の地、無名の人)", "Akashic_Records": "光円錐強化素材(アーカーシャの記録)", "The_Invisible_Hand": "信用ポイント(見えざる手)", @@ -783,7 +829,9 @@ "The_Land_of_Gold": "タンパク米と基本食材(黄金の大地)", "The_Blossom_in_the_Storm": "気態流体と種子(嵐の中で咲き誇る花)", "Legend_of_the_Puppet_Master": "玉兆単元&廃棄された機巧部品(傀儡師伝説)", - "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)" + "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_4": { "name": "依頼 4", @@ -794,6 +842,8 @@ "Born_to_Obey": "古代パーツ(生まれながらに服従する)", "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "キャラクターの経験値素材(無名の地、無名の人)", "Akashic_Records": "光円錐強化素材(アーカーシャの記録)", "The_Invisible_Hand": "信用ポイント(見えざる手)", @@ -802,7 +852,9 @@ "The_Land_of_Gold": "タンパク米と基本食材(黄金の大地)", "The_Blossom_in_the_Storm": "気態流体と種子(嵐の中で咲き誇る花)", "Legend_of_the_Puppet_Master": "玉兆単元&廃棄された機巧部品(傀儡師伝説)", - "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)" + "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Duration": { "name": "派遣時間", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 78a748b21..74d0f8d08 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -223,30 +223,41 @@ "Name": { "name": "副本名称", "help": "默认打本设置", - "Calyx_Golden_Memories": "材料:角色经验(回忆之蕾•拟造花萼金)", - "Calyx_Golden_Aether": "材料:武器经验(以太之蕾•拟造花萼金)", - "Calyx_Golden_Treasures": "材料:信用点(藏珍之蕾•拟造花萼金)", - "Calyx_Crimson_Destruction": "行迹材料:毁灭(毁灭之蕾•拟造花萼赤)", - "Calyx_Crimson_Preservation": "行迹材料:存护(存护之蕾•拟造花萼赤)", - "Calyx_Crimson_The_Hunt": "行迹材料:巡猎(巡猎之蕾•拟造花萼赤)", - "Calyx_Crimson_Abundance": "行迹材料:丰饶(丰饶之蕾•拟造花萼赤)", - "Calyx_Crimson_Erudition": "行迹材料:智识(智识之蕾•拟造花萼赤)", - "Calyx_Crimson_Harmony": "行迹材料:同谐(同谐之蕾•拟造花萼赤)", - "Calyx_Crimson_Nihility": "行迹材料:虚无(虚无之蕾•拟造花萼赤)", - "Stagnant_Shadow_Quanta": "角色晋阶材料:量子(银狼 / 希儿 / 青雀)", - "Stagnant_Shadow_Gust": "角色晋阶材料:风(丹恒 / 布洛妮娅 / 桑博)", - "Stagnant_Shadow_Fulmination": "角色晋阶材料:雷(阿兰 / 希露瓦 / 停云 / 白露)", - "Stagnant_Shadow_Blaze": "角色晋阶材料:火(姬子 / 艾丝妲 / 虎克)", + "Calyx_Golden_Memories_Jarilo_VI": "材料:角色经验(回忆之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色经验(回忆之蕾•仙舟罗浮)", + "Calyx_Golden_Memories_Penacony": "材料:角色经验(回忆之蕾•匹诺康尼)", + "Calyx_Golden_Aether_Jarilo_VI": "材料:武器经验(以太之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器经验(以太之蕾•仙舟罗浮)", + "Calyx_Golden_Aether_Penacony": "材料:武器经验(以太之蕾•匹诺康尼)", + "Calyx_Golden_Treasures_Jarilo_VI": "材料:信用点(藏珍之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用点(藏珍之蕾•仙舟罗浮)", + "Calyx_Golden_Treasures_Penacony": "材料:信用点(藏珍之蕾•匹诺康尼)", + "Calyx_Crimson_Destruction_Herta_StorageZone": "行迹材料:毁灭(收容舱段)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行迹材料:毁灭(鳞渊境)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行迹材料:巡猎(城郊雪原)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行迹材料:智识(铆钉镇)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行迹材料:同谐(机械聚落)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行迹材料:同谐(白日梦酒店-梦境)", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行迹材料:虚无(大矿区)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行迹材料:虚无(丹鼎司)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行迹材料:丰饶(边缘通路)", "Stagnant_Shadow_Spike": "角色晋阶材料:物理(娜塔莎 / 克拉拉 / 卢卡 / 素裳)", - "Stagnant_Shadow_Rime": "角色晋阶材料:冰(三月七 / 黑塔 / 杰帕德 / 佩拉)", - "Stagnant_Shadow_Mirage": "角色晋阶材料:虚数(瓦尔特 / 罗刹 / 驭空)", - "Stagnant_Shadow_Icicle": "角色晋阶材料:冰(彦卿 / 镜流 / 阮•梅)", - "Stagnant_Shadow_Doom": "角色晋阶材料:雷(卡芙卡 / 景元)", - "Stagnant_Shadow_Puppetry": "角色晋阶材料:虚数(丹恒•饮月 / 真理医生)", - "Stagnant_Shadow_Abomination": "角色晋阶材料:量子(玲可 / 符玄 / 雪衣)", - "Stagnant_Shadow_Scorch": "角色晋阶材料:火(桂乃芬 / 托帕&账账)", - "Stagnant_Shadow_Celestial": "角色晋阶材料:风(刃 / 藿藿)", "Stagnant_Shadow_Perdition": "角色晋阶材料:物理(寒鸦 / 银枝)", + "Stagnant_Shadow_Blaze": "角色晋阶材料:火(姬子 / 艾丝妲 / 虎克)", + "Stagnant_Shadow_Scorch": "角色晋阶材料:火(桂乃芬 / 托帕&账账)", + "Stagnant_Shadow_Rime": "角色晋阶材料:冰(三月七 / 黑塔 / 杰帕德 / 佩拉)", + "Stagnant_Shadow_Icicle": "角色晋阶材料:冰(彦卿 / 镜流 / 阮•梅)", + "Stagnant_Shadow_Nectar": "角色晋阶材料:冰(米沙)", + "Stagnant_Shadow_Fulmination": "角色晋阶材料:雷(阿兰 / 希露瓦 / 停云 / 白露)", + "Stagnant_Shadow_Doom": "角色晋阶材料:雷(卡芙卡 / 景元)", + "Stagnant_Shadow_Gust": "角色晋阶材料:风(丹恒 / 布洛妮娅 / 桑博)", + "Stagnant_Shadow_Celestial": "角色晋阶材料:风(刃 / 藿藿 / 黑天鹅)", + "Stagnant_Shadow_Quanta": "角色晋阶材料:量子(银狼 / 希儿 / 青雀)", + "Stagnant_Shadow_Abomination": "角色晋阶材料:量子(玲可 / 符玄 / 雪衣)", + "Stagnant_Shadow_Roast": "角色晋阶材料:量子(花火)", + "Stagnant_Shadow_Mirage": "角色晋阶材料:虚数(瓦尔特 / 罗刹 / 驭空)", + "Stagnant_Shadow_Puppetry": "角色晋阶材料:虚数(丹恒•饮月 / 真理医生)", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "遗器:冰套+风套(霜风之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遗器:物理套+击破套(迅拳之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Drifting": "遗器:治疗套+快枪手(漂泊之径•侵蚀隧洞)", @@ -254,22 +265,32 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "遗器:防御套+雷套(圣颂之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Conflagration": "遗器:火套+虚数套(野焰之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遗器:生命套+速度套(药使之径•侵蚀隧洞)", - "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套(幽冥之径•侵蚀隧洞)" + "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套(幽冥之径•侵蚀隧洞)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" }, "NameAtDoubleCalyx": { "name": "有双倍花活动时,选择副本", "help": "次数耗尽后回退到默认打本设置", "do_not_participate": "不参与活动", - "Calyx_Golden_Memories": "材料:角色经验(回忆之蕾•拟造花萼金)", - "Calyx_Golden_Aether": "材料:武器经验(以太之蕾•拟造花萼金)", - "Calyx_Golden_Treasures": "材料:信用点(藏珍之蕾•拟造花萼金)", - "Calyx_Crimson_Destruction": "行迹材料:毁灭(毁灭之蕾•拟造花萼赤)", - "Calyx_Crimson_Preservation": "行迹材料:存护(存护之蕾•拟造花萼赤)", - "Calyx_Crimson_The_Hunt": "行迹材料:巡猎(巡猎之蕾•拟造花萼赤)", - "Calyx_Crimson_Abundance": "行迹材料:丰饶(丰饶之蕾•拟造花萼赤)", - "Calyx_Crimson_Erudition": "行迹材料:智识(智识之蕾•拟造花萼赤)", - "Calyx_Crimson_Harmony": "行迹材料:同谐(同谐之蕾•拟造花萼赤)", - "Calyx_Crimson_Nihility": "行迹材料:虚无(虚无之蕾•拟造花萼赤)" + "Calyx_Golden_Memories_Jarilo_VI": "材料:角色经验(回忆之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色经验(回忆之蕾•仙舟罗浮)", + "Calyx_Golden_Memories_Penacony": "材料:角色经验(回忆之蕾•匹诺康尼)", + "Calyx_Golden_Aether_Jarilo_VI": "材料:武器经验(以太之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器经验(以太之蕾•仙舟罗浮)", + "Calyx_Golden_Aether_Penacony": "材料:武器经验(以太之蕾•匹诺康尼)", + "Calyx_Golden_Treasures_Jarilo_VI": "材料:信用点(藏珍之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用点(藏珍之蕾•仙舟罗浮)", + "Calyx_Golden_Treasures_Penacony": "材料:信用点(藏珍之蕾•匹诺康尼)", + "Calyx_Crimson_Destruction_Herta_StorageZone": "行迹材料:毁灭(收容舱段)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行迹材料:毁灭(鳞渊境)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行迹材料:巡猎(城郊雪原)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行迹材料:智识(铆钉镇)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行迹材料:同谐(机械聚落)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行迹材料:同谐(白日梦酒店-梦境)", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行迹材料:虚无(大矿区)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行迹材料:虚无(丹鼎司)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行迹材料:丰饶(边缘通路)" }, "NameAtDoubleRelic": { "name": "有遗器活动时,选择副本", @@ -282,7 +303,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "遗器:防御套+雷套(圣颂之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Conflagration": "遗器:火套+虚数套(野焰之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遗器:生命套+速度套(药使之径•侵蚀隧洞)", - "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套(幽冥之径•侵蚀隧洞)" + "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套(幽冥之径•侵蚀隧洞)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" }, "Team": { "name": "打本队伍", @@ -307,40 +329,51 @@ "name": "完成1次拟造花萼(金)", "help": "", "do_not_achieve": "不完成这个任务", - "Calyx_Golden_Memories": "材料:角色经验(回忆之蕾•拟造花萼金)", - "Calyx_Golden_Aether": "材料:武器经验(以太之蕾•拟造花萼金)", - "Calyx_Golden_Treasures": "材料:信用点(藏珍之蕾•拟造花萼金)" + "Calyx_Golden_Memories_Jarilo_VI": "材料:角色经验(回忆之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色经验(回忆之蕾•仙舟罗浮)", + "Calyx_Golden_Memories_Penacony": "材料:角色经验(回忆之蕾•匹诺康尼)", + "Calyx_Golden_Aether_Jarilo_VI": "材料:武器经验(以太之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器经验(以太之蕾•仙舟罗浮)", + "Calyx_Golden_Aether_Penacony": "材料:武器经验(以太之蕾•匹诺康尼)", + "Calyx_Golden_Treasures_Jarilo_VI": "材料:信用点(藏珍之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用点(藏珍之蕾•仙舟罗浮)", + "Calyx_Golden_Treasures_Penacony": "材料:信用点(藏珍之蕾•匹诺康尼)" }, "CalyxCrimson": { "name": "完成1次拟造花萼(赤)", "help": "", "do_not_achieve": "不完成这个任务", - "Calyx_Crimson_Destruction": "行迹材料:毁灭(毁灭之蕾•拟造花萼赤)", - "Calyx_Crimson_Preservation": "行迹材料:存护(存护之蕾•拟造花萼赤)", - "Calyx_Crimson_The_Hunt": "行迹材料:巡猎(巡猎之蕾•拟造花萼赤)", - "Calyx_Crimson_Abundance": "行迹材料:丰饶(丰饶之蕾•拟造花萼赤)", - "Calyx_Crimson_Erudition": "行迹材料:智识(智识之蕾•拟造花萼赤)", - "Calyx_Crimson_Harmony": "行迹材料:同谐(同谐之蕾•拟造花萼赤)", - "Calyx_Crimson_Nihility": "行迹材料:虚无(虚无之蕾•拟造花萼赤)" + "Calyx_Crimson_Destruction_Herta_StorageZone": "行迹材料:毁灭(收容舱段)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行迹材料:毁灭(鳞渊境)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行迹材料:巡猎(城郊雪原)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行迹材料:智识(铆钉镇)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行迹材料:同谐(机械聚落)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行迹材料:同谐(白日梦酒店-梦境)", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行迹材料:虚无(大矿区)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行迹材料:虚无(丹鼎司)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行迹材料:丰饶(边缘通路)" }, "StagnantShadow": { "name": "完成1次凝滞虚影", "help": "", "do_not_achieve": "不完成这个任务", - "Stagnant_Shadow_Quanta": "角色晋阶材料:量子(银狼 / 希儿 / 青雀)", - "Stagnant_Shadow_Gust": "角色晋阶材料:风(丹恒 / 布洛妮娅 / 桑博)", - "Stagnant_Shadow_Fulmination": "角色晋阶材料:雷(阿兰 / 希露瓦 / 停云 / 白露)", - "Stagnant_Shadow_Blaze": "角色晋阶材料:火(姬子 / 艾丝妲 / 虎克)", "Stagnant_Shadow_Spike": "角色晋阶材料:物理(娜塔莎 / 克拉拉 / 卢卡 / 素裳)", - "Stagnant_Shadow_Rime": "角色晋阶材料:冰(三月七 / 黑塔 / 杰帕德 / 佩拉)", - "Stagnant_Shadow_Mirage": "角色晋阶材料:虚数(瓦尔特 / 罗刹 / 驭空)", - "Stagnant_Shadow_Icicle": "角色晋阶材料:冰(彦卿 / 镜流 / 阮•梅)", - "Stagnant_Shadow_Doom": "角色晋阶材料:雷(卡芙卡 / 景元)", - "Stagnant_Shadow_Puppetry": "角色晋阶材料:虚数(丹恒•饮月 / 真理医生)", - "Stagnant_Shadow_Abomination": "角色晋阶材料:量子(玲可 / 符玄 / 雪衣)", + "Stagnant_Shadow_Perdition": "角色晋阶材料:物理(寒鸦 / 银枝)", + "Stagnant_Shadow_Blaze": "角色晋阶材料:火(姬子 / 艾丝妲 / 虎克)", "Stagnant_Shadow_Scorch": "角色晋阶材料:火(桂乃芬 / 托帕&账账)", - "Stagnant_Shadow_Celestial": "角色晋阶材料:风(刃 / 藿藿)", - "Stagnant_Shadow_Perdition": "角色晋阶材料:物理(寒鸦 / 银枝)" + "Stagnant_Shadow_Rime": "角色晋阶材料:冰(三月七 / 黑塔 / 杰帕德 / 佩拉)", + "Stagnant_Shadow_Icicle": "角色晋阶材料:冰(彦卿 / 镜流 / 阮•梅)", + "Stagnant_Shadow_Nectar": "角色晋阶材料:冰(米沙)", + "Stagnant_Shadow_Fulmination": "角色晋阶材料:雷(阿兰 / 希露瓦 / 停云 / 白露)", + "Stagnant_Shadow_Doom": "角色晋阶材料:雷(卡芙卡 / 景元)", + "Stagnant_Shadow_Gust": "角色晋阶材料:风(丹恒 / 布洛妮娅 / 桑博)", + "Stagnant_Shadow_Celestial": "角色晋阶材料:风(刃 / 藿藿 / 黑天鹅)", + "Stagnant_Shadow_Quanta": "角色晋阶材料:量子(银狼 / 希儿 / 青雀)", + "Stagnant_Shadow_Abomination": "角色晋阶材料:量子(玲可 / 符玄 / 雪衣)", + "Stagnant_Shadow_Roast": "角色晋阶材料:量子(花火)", + "Stagnant_Shadow_Mirage": "角色晋阶材料:虚数(瓦尔特 / 罗刹 / 驭空)", + "Stagnant_Shadow_Puppetry": "角色晋阶材料:虚数(丹恒•饮月 / 真理医生)" }, "CavernOfCorrosion": { "name": "完成1次侵蚀隧洞", @@ -353,7 +386,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "遗器:防御套+雷套(圣颂之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Conflagration": "遗器:火套+虚数套(野焰之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遗器:生命套+速度套(药使之径•侵蚀隧洞)", - "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套(幽冥之径•侵蚀隧洞)" + "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套(幽冥之径•侵蚀隧洞)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" } }, "DungeonSupport": { @@ -376,6 +410,7 @@ "Arlan": "阿兰", "Asta": "艾丝妲", "Bailu": "白露", + "BlackSwan": "黑天鹅", "Blade": "刃", "Bronya": "布洛妮娅", "Clara": "克拉拉", @@ -397,6 +432,7 @@ "Luocha": "罗刹", "Lynx": "玲可", "March7th": "三月七", + "Misha": "米沙", "Natasha": "娜塔莎", "Pela": "佩拉", "Qingque": "青雀", @@ -737,6 +773,8 @@ "Born_to_Obey": "古代零件(生而服从)", "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "Akashic_Records": "光锥强化材料(阿卡夏记录)", "The_Invisible_Hand": "信用点(看不见的手)", @@ -745,7 +783,9 @@ "The_Land_of_Gold": "蛋白米&基本食材(黄金大地)", "The_Blossom_in_the_Storm": "气态流体&种子(风暴中怒放的花)", "Legend_of_the_Puppet_Master": "玉兆单元&废弃机巧零件(偃师传说)", - "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)" + "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_2": { "name": "第2个委托选择", @@ -756,6 +796,8 @@ "Born_to_Obey": "古代零件(生而服从)", "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "Akashic_Records": "光锥强化材料(阿卡夏记录)", "The_Invisible_Hand": "信用点(看不见的手)", @@ -764,7 +806,9 @@ "The_Land_of_Gold": "蛋白米&基本食材(黄金大地)", "The_Blossom_in_the_Storm": "气态流体&种子(风暴中怒放的花)", "Legend_of_the_Puppet_Master": "玉兆单元&废弃机巧零件(偃师传说)", - "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)" + "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_3": { "name": "第3个委托选择", @@ -775,6 +819,8 @@ "Born_to_Obey": "古代零件(生而服从)", "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "Akashic_Records": "光锥强化材料(阿卡夏记录)", "The_Invisible_Hand": "信用点(看不见的手)", @@ -783,7 +829,9 @@ "The_Land_of_Gold": "蛋白米&基本食材(黄金大地)", "The_Blossom_in_the_Storm": "气态流体&种子(风暴中怒放的花)", "Legend_of_the_Puppet_Master": "玉兆单元&废弃机巧零件(偃师传说)", - "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)" + "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_4": { "name": "第4个委托选择", @@ -794,6 +842,8 @@ "Born_to_Obey": "古代零件(生而服从)", "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "Akashic_Records": "光锥强化材料(阿卡夏记录)", "The_Invisible_Hand": "信用点(看不见的手)", @@ -802,7 +852,9 @@ "The_Land_of_Gold": "蛋白米&基本食材(黄金大地)", "The_Blossom_in_the_Storm": "气态流体&种子(风暴中怒放的花)", "Legend_of_the_Puppet_Master": "玉兆单元&废弃机巧零件(偃师传说)", - "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)" + "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Duration": { "name": "派遣时长", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 9fe990535..20df243c7 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -223,30 +223,41 @@ "Name": { "name": "副本名稱", "help": "默認打本設定", - "Calyx_Golden_Memories": "材料:角色經驗(回憶之蕾•擬造花萼金)", - "Calyx_Golden_Aether": "材料:武器經驗(乙太之蕾•擬造花萼金)", - "Calyx_Golden_Treasures": "材料:信用點(藏珍之蕾•擬造花萼金)", - "Calyx_Crimson_Destruction": "行跡材料:毀滅(毀滅之蕾•擬造花萼赤)", - "Calyx_Crimson_Preservation": "行跡材料:存護(存護之蕾•擬造花萼赤)", - "Calyx_Crimson_The_Hunt": "行跡材料:巡獵(巡獵之蕾•擬造花萼赤)", - "Calyx_Crimson_Abundance": "行跡材料:豐饒(豐饒之蕾•擬造花萼赤)", - "Calyx_Crimson_Erudition": "行跡材料:智識(智識之蕾•擬造花萼赤)", - "Calyx_Crimson_Harmony": "行跡材料:同諧(同諧之蕾•擬造花萼赤)", - "Calyx_Crimson_Nihility": "行跡材料:虛無(虛無之蕾•擬造花萼赤)", - "Stagnant_Shadow_Quanta": "角色晉階材料:量子(銀狼 / 希兒 / 青雀)", - "Stagnant_Shadow_Gust": "角色晉階材料:風(丹恆 / 布洛妮婭 / 桑博)", - "Stagnant_Shadow_Fulmination": "角色晉階材料:雷(阿蘭 / 希露瓦 / 停雲 / 白露)", - "Stagnant_Shadow_Blaze": "角色晉階材料:火(姬子 / 艾絲妲 / 虎克)", + "Calyx_Golden_Memories_Jarilo_VI": "材料:角色經驗(回憶之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色經驗(回憶之蕾•仙舟羅浮)", + "Calyx_Golden_Memories_Penacony": "材料:角色經驗(回憶之蕾•匹諾康尼)", + "Calyx_Golden_Aether_Jarilo_VI": "材料:武器經驗(乙太之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器經驗(乙太之蕾•仙舟羅浮)", + "Calyx_Golden_Aether_Penacony": "材料:武器經驗(乙太之蕾•匹諾康尼)", + "Calyx_Golden_Treasures_Jarilo_VI": "材料:信用點(藏珍之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用點(藏珍之蕾•仙舟羅浮)", + "Calyx_Golden_Treasures_Penacony": "材料:信用點(藏珍之蕾•匹諾康尼)", + "Calyx_Crimson_Destruction_Herta_StorageZone": "行跡材料:毀滅(收容艙段)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行跡材料:毀滅(鱗淵境)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行跡材料:巡獵(城郊雪原)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行跡材料:智識(鉚釘鎮)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行跡材料:同諧(機械聚落)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行跡材料:同諧(白日夢飯店-夢境)", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行跡材料:虛無(大礦區)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行跡材料:虛無(丹鼎司)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行跡材料:豐饒(邊緣通道)", "Stagnant_Shadow_Spike": "角色晉階材料:物理(娜塔莎 / 克拉拉 / 盧卡 / 素裳)", - "Stagnant_Shadow_Rime": "角色晉階材料:冰(三月七 / 黑塔 / 傑帕德 / 佩拉)", - "Stagnant_Shadow_Mirage": "角色晉階材料:虛數(瓦爾特 / 羅剎 / 馭空)", - "Stagnant_Shadow_Icicle": "角色晉階材料:冰(彥卿 / 鏡流 / 阮•梅)", - "Stagnant_Shadow_Doom": "角色晉階材料:雷(卡芙卡 / 景元)", - "Stagnant_Shadow_Puppetry": "角色晉階材料:虛數(丹恆•飲月 / 真理醫生)", - "Stagnant_Shadow_Abomination": "角色晉階材料:量子(玲可 / 符玄 / 雪衣)", - "Stagnant_Shadow_Scorch": "角色晉階材料:火(桂乃芬 / 托帕&帳帳)", - "Stagnant_Shadow_Celestial": "角色晉階材料:風(刃 / 藿藿)", "Stagnant_Shadow_Perdition": "角色晉階材料:物理(寒鴉 / 銀枝)", + "Stagnant_Shadow_Blaze": "角色晉階材料:火(姬子 / 艾絲妲 / 虎克)", + "Stagnant_Shadow_Scorch": "角色晉階材料:火(桂乃芬 / 托帕&帳帳)", + "Stagnant_Shadow_Rime": "角色晉階材料:冰(三月七 / 黑塔 / 傑帕德 / 佩拉)", + "Stagnant_Shadow_Icicle": "角色晉階材料:冰(彥卿 / 鏡流 / 阮•梅)", + "Stagnant_Shadow_Nectar": "角色晉階材料:冰(米沙)", + "Stagnant_Shadow_Fulmination": "角色晉階材料:雷(阿蘭 / 希露瓦 / 停雲 / 白露)", + "Stagnant_Shadow_Doom": "角色晉階材料:雷(卡芙卡 / 景元)", + "Stagnant_Shadow_Gust": "角色晉階材料:風(丹恆 / 布洛妮婭 / 桑博)", + "Stagnant_Shadow_Celestial": "角色晉階材料:風(刃 / 藿藿 / 黑天鵝)", + "Stagnant_Shadow_Quanta": "角色晉階材料:量子(銀狼 / 希兒 / 青雀)", + "Stagnant_Shadow_Abomination": "角色晉階材料:量子(玲可 / 符玄 / 雪衣)", + "Stagnant_Shadow_Roast": "角色晉階材料:量子(花火)", + "Stagnant_Shadow_Mirage": "角色晉階材料:虛數(瓦爾特 / 羅剎 / 馭空)", + "Stagnant_Shadow_Puppetry": "角色晉階材料:虛數(丹恆•飲月 / 真理醫生)", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "遺器:冰套+風套(霜風之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遺器:物理套+擊破套(迅拳之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Drifting": "遺器:治療套+快槍手(漂泊之徑•侵蝕隧洞)", @@ -254,22 +265,32 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "遺器:防禦套+雷套(聖頌之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Conflagration": "遺器:火套+虛數套(野焰之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遺器:生命套+速度套(藥使之徑•侵蝕隧洞)", - "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套(幽冥之徑•侵蝕隧洞)" + "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套(幽冥之徑•侵蝕隧洞)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" }, "NameAtDoubleCalyx": { "name": "有雙倍花活動時,選擇副本", "help": "次數耗儘後回退到默認打本設定", "do_not_participate": "不參與活動", - "Calyx_Golden_Memories": "材料:角色經驗(回憶之蕾•擬造花萼金)", - "Calyx_Golden_Aether": "材料:武器經驗(乙太之蕾•擬造花萼金)", - "Calyx_Golden_Treasures": "材料:信用點(藏珍之蕾•擬造花萼金)", - "Calyx_Crimson_Destruction": "行跡材料:毀滅(毀滅之蕾•擬造花萼赤)", - "Calyx_Crimson_Preservation": "行跡材料:存護(存護之蕾•擬造花萼赤)", - "Calyx_Crimson_The_Hunt": "行跡材料:巡獵(巡獵之蕾•擬造花萼赤)", - "Calyx_Crimson_Abundance": "行跡材料:豐饒(豐饒之蕾•擬造花萼赤)", - "Calyx_Crimson_Erudition": "行跡材料:智識(智識之蕾•擬造花萼赤)", - "Calyx_Crimson_Harmony": "行跡材料:同諧(同諧之蕾•擬造花萼赤)", - "Calyx_Crimson_Nihility": "行跡材料:虛無(虛無之蕾•擬造花萼赤)" + "Calyx_Golden_Memories_Jarilo_VI": "材料:角色經驗(回憶之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色經驗(回憶之蕾•仙舟羅浮)", + "Calyx_Golden_Memories_Penacony": "材料:角色經驗(回憶之蕾•匹諾康尼)", + "Calyx_Golden_Aether_Jarilo_VI": "材料:武器經驗(乙太之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器經驗(乙太之蕾•仙舟羅浮)", + "Calyx_Golden_Aether_Penacony": "材料:武器經驗(乙太之蕾•匹諾康尼)", + "Calyx_Golden_Treasures_Jarilo_VI": "材料:信用點(藏珍之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用點(藏珍之蕾•仙舟羅浮)", + "Calyx_Golden_Treasures_Penacony": "材料:信用點(藏珍之蕾•匹諾康尼)", + "Calyx_Crimson_Destruction_Herta_StorageZone": "行跡材料:毀滅(收容艙段)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行跡材料:毀滅(鱗淵境)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行跡材料:巡獵(城郊雪原)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行跡材料:智識(鉚釘鎮)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行跡材料:同諧(機械聚落)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行跡材料:同諧(白日夢飯店-夢境)", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行跡材料:虛無(大礦區)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行跡材料:虛無(丹鼎司)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行跡材料:豐饒(邊緣通道)" }, "NameAtDoubleRelic": { "name": "有遺器活動時,選擇副本", @@ -282,7 +303,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "遺器:防禦套+雷套(聖頌之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Conflagration": "遺器:火套+虛數套(野焰之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遺器:生命套+速度套(藥使之徑•侵蝕隧洞)", - "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套(幽冥之徑•侵蝕隧洞)" + "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套(幽冥之徑•侵蝕隧洞)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" }, "Team": { "name": "打本隊伍", @@ -307,40 +329,51 @@ "name": "完成1次擬造花萼(金)", "help": "", "do_not_achieve": "不完成這個任務", - "Calyx_Golden_Memories": "材料:角色經驗(回憶之蕾•擬造花萼金)", - "Calyx_Golden_Aether": "材料:武器經驗(乙太之蕾•擬造花萼金)", - "Calyx_Golden_Treasures": "材料:信用點(藏珍之蕾•擬造花萼金)" + "Calyx_Golden_Memories_Jarilo_VI": "材料:角色經驗(回憶之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色經驗(回憶之蕾•仙舟羅浮)", + "Calyx_Golden_Memories_Penacony": "材料:角色經驗(回憶之蕾•匹諾康尼)", + "Calyx_Golden_Aether_Jarilo_VI": "材料:武器經驗(乙太之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器經驗(乙太之蕾•仙舟羅浮)", + "Calyx_Golden_Aether_Penacony": "材料:武器經驗(乙太之蕾•匹諾康尼)", + "Calyx_Golden_Treasures_Jarilo_VI": "材料:信用點(藏珍之蕾•雅利洛-Ⅵ)", + "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用點(藏珍之蕾•仙舟羅浮)", + "Calyx_Golden_Treasures_Penacony": "材料:信用點(藏珍之蕾•匹諾康尼)" }, "CalyxCrimson": { "name": "完成1次擬造花萼(赤)", "help": "", "do_not_achieve": "不完成這個任務", - "Calyx_Crimson_Destruction": "行跡材料:毀滅(毀滅之蕾•擬造花萼赤)", - "Calyx_Crimson_Preservation": "行跡材料:存護(存護之蕾•擬造花萼赤)", - "Calyx_Crimson_The_Hunt": "行跡材料:巡獵(巡獵之蕾•擬造花萼赤)", - "Calyx_Crimson_Abundance": "行跡材料:豐饒(豐饒之蕾•擬造花萼赤)", - "Calyx_Crimson_Erudition": "行跡材料:智識(智識之蕾•擬造花萼赤)", - "Calyx_Crimson_Harmony": "行跡材料:同諧(同諧之蕾•擬造花萼赤)", - "Calyx_Crimson_Nihility": "行跡材料:虛無(虛無之蕾•擬造花萼赤)" + "Calyx_Crimson_Destruction_Herta_StorageZone": "行跡材料:毀滅(收容艙段)", + "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行跡材料:毀滅(鱗淵境)", + "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行跡材料:巡獵(城郊雪原)", + "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行跡材料:智識(鉚釘鎮)", + "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行跡材料:同諧(機械聚落)", + "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行跡材料:同諧(白日夢飯店-夢境)", + "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行跡材料:虛無(大礦區)", + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行跡材料:虛無(丹鼎司)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行跡材料:豐饒(邊緣通道)" }, "StagnantShadow": { "name": "完成1次凝滯虛影", "help": "", "do_not_achieve": "不完成這個任務", - "Stagnant_Shadow_Quanta": "角色晉階材料:量子(銀狼 / 希兒 / 青雀)", - "Stagnant_Shadow_Gust": "角色晉階材料:風(丹恆 / 布洛妮婭 / 桑博)", - "Stagnant_Shadow_Fulmination": "角色晉階材料:雷(阿蘭 / 希露瓦 / 停雲 / 白露)", - "Stagnant_Shadow_Blaze": "角色晉階材料:火(姬子 / 艾絲妲 / 虎克)", "Stagnant_Shadow_Spike": "角色晉階材料:物理(娜塔莎 / 克拉拉 / 盧卡 / 素裳)", - "Stagnant_Shadow_Rime": "角色晉階材料:冰(三月七 / 黑塔 / 傑帕德 / 佩拉)", - "Stagnant_Shadow_Mirage": "角色晉階材料:虛數(瓦爾特 / 羅剎 / 馭空)", - "Stagnant_Shadow_Icicle": "角色晉階材料:冰(彥卿 / 鏡流 / 阮•梅)", - "Stagnant_Shadow_Doom": "角色晉階材料:雷(卡芙卡 / 景元)", - "Stagnant_Shadow_Puppetry": "角色晉階材料:虛數(丹恆•飲月 / 真理醫生)", - "Stagnant_Shadow_Abomination": "角色晉階材料:量子(玲可 / 符玄 / 雪衣)", + "Stagnant_Shadow_Perdition": "角色晉階材料:物理(寒鴉 / 銀枝)", + "Stagnant_Shadow_Blaze": "角色晉階材料:火(姬子 / 艾絲妲 / 虎克)", "Stagnant_Shadow_Scorch": "角色晉階材料:火(桂乃芬 / 托帕&帳帳)", - "Stagnant_Shadow_Celestial": "角色晉階材料:風(刃 / 藿藿)", - "Stagnant_Shadow_Perdition": "角色晉階材料:物理(寒鴉 / 銀枝)" + "Stagnant_Shadow_Rime": "角色晉階材料:冰(三月七 / 黑塔 / 傑帕德 / 佩拉)", + "Stagnant_Shadow_Icicle": "角色晉階材料:冰(彥卿 / 鏡流 / 阮•梅)", + "Stagnant_Shadow_Nectar": "角色晉階材料:冰(米沙)", + "Stagnant_Shadow_Fulmination": "角色晉階材料:雷(阿蘭 / 希露瓦 / 停雲 / 白露)", + "Stagnant_Shadow_Doom": "角色晉階材料:雷(卡芙卡 / 景元)", + "Stagnant_Shadow_Gust": "角色晉階材料:風(丹恆 / 布洛妮婭 / 桑博)", + "Stagnant_Shadow_Celestial": "角色晉階材料:風(刃 / 藿藿 / 黑天鵝)", + "Stagnant_Shadow_Quanta": "角色晉階材料:量子(銀狼 / 希兒 / 青雀)", + "Stagnant_Shadow_Abomination": "角色晉階材料:量子(玲可 / 符玄 / 雪衣)", + "Stagnant_Shadow_Roast": "角色晉階材料:量子(花火)", + "Stagnant_Shadow_Mirage": "角色晉階材料:虛數(瓦爾特 / 羅剎 / 馭空)", + "Stagnant_Shadow_Puppetry": "角色晉階材料:虛數(丹恆•飲月 / 真理醫生)" }, "CavernOfCorrosion": { "name": "完成1次侵蝕隧洞", @@ -353,7 +386,8 @@ "Cavern_of_Corrosion_Path_of_Holy_Hymn": "遺器:防禦套+雷套(聖頌之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Conflagration": "遺器:火套+虛數套(野焰之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遺器:生命套+速度套(藥使之徑•侵蝕隧洞)", - "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套(幽冥之徑•侵蝕隧洞)" + "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套(幽冥之徑•侵蝕隧洞)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" } }, "DungeonSupport": { @@ -376,6 +410,7 @@ "Arlan": "阿蘭", "Asta": "艾絲妲", "Bailu": "白露", + "BlackSwan": "黑天鵝", "Blade": "刃", "Bronya": "布洛妮婭", "Clara": "克拉拉", @@ -397,6 +432,7 @@ "Luocha": "羅剎", "Lynx": "玲可", "March7th": "三月七", + "Misha": "米沙", "Natasha": "娜塔莎", "Pela": "佩拉", "Qingque": "青雀", @@ -737,6 +773,8 @@ "Born_to_Obey": "古代零件(生而服從)", "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "角色經驗材料(無名之地,無名之人)", "Akashic_Records": "光錐強化材料(阿卡夏記錄)", "The_Invisible_Hand": "信用點(看不見的手)", @@ -745,7 +783,9 @@ "The_Land_of_Gold": "蛋白米&基本食材(黃金大地)", "The_Blossom_in_the_Storm": "氣態流體&種子(風暴中怒放的花)", "Legend_of_the_Puppet_Master": "玉兆單元&廢棄機巧零件(偃師傳說)", - "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)" + "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_2": { "name": "第2個委託選擇", @@ -756,6 +796,8 @@ "Born_to_Obey": "古代零件(生而服從)", "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "角色經驗材料(無名之地,無名之人)", "Akashic_Records": "光錐強化材料(阿卡夏記錄)", "The_Invisible_Hand": "信用點(看不見的手)", @@ -764,7 +806,9 @@ "The_Land_of_Gold": "蛋白米&基本食材(黃金大地)", "The_Blossom_in_the_Storm": "氣態流體&種子(風暴中怒放的花)", "Legend_of_the_Puppet_Master": "玉兆單元&廢棄機巧零件(偃師傳說)", - "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)" + "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_3": { "name": "第3個委託選擇", @@ -775,6 +819,8 @@ "Born_to_Obey": "古代零件(生而服從)", "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "角色經驗材料(無名之地,無名之人)", "Akashic_Records": "光錐強化材料(阿卡夏記錄)", "The_Invisible_Hand": "信用點(看不見的手)", @@ -783,7 +829,9 @@ "The_Land_of_Gold": "蛋白米&基本食材(黃金大地)", "The_Blossom_in_the_Storm": "氣態流體&種子(風暴中怒放的花)", "Legend_of_the_Puppet_Master": "玉兆單元&廢棄機巧零件(偃師傳說)", - "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)" + "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Name_4": { "name": "第4個委託選擇", @@ -794,6 +842,8 @@ "Born_to_Obey": "古代零件(生而服從)", "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "A_Startling_Night_Terror": "A_Startling_Night_Terror", + "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", "Nameless_Land_Nameless_People": "角色經驗材料(無名之地,無名之人)", "Akashic_Records": "光錐強化材料(阿卡夏記錄)", "The_Invisible_Hand": "信用點(看不見的手)", @@ -802,7 +852,9 @@ "The_Land_of_Gold": "蛋白米&基本食材(黃金大地)", "The_Blossom_in_the_Storm": "氣態流體&種子(風暴中怒放的花)", "Legend_of_the_Puppet_Master": "玉兆單元&廢棄機巧零件(偃師傳說)", - "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)" + "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)", + "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", + "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" }, "Duration": { "name": "派遣時間", diff --git a/tasks/dungeon/keywords/classes.py b/tasks/dungeon/keywords/classes.py index e7fa1e9a4..190efe337 100644 --- a/tasks/dungeon/keywords/classes.py +++ b/tasks/dungeon/keywords/classes.py @@ -35,10 +35,38 @@ class DungeonList(Keyword): def is_Calyx_Golden(self): return 'Calyx_Golden' in self.name + @cached_property + def is_Calyx_Golden_Memories(self): + return 'Calyx_Golden_Memories' in self.name + + @cached_property + def is_Calyx_Golden_Aether(self): + return 'Calyx_Golden_Aether' in self.name + + @cached_property + def is_Calyx_Golden_Treasures(self): + return 'Calyx_Golden_Treasures' in self.name + @cached_property def is_Calyx_Crimson(self): return 'Calyx_Crimson' in self.name + @cached_property + def Calyx_Crimson_Path(self): + """ + Returns: + RoguePath: RoguePath object or None + """ + if not self.is_Calyx_Crimson: + return None + from tasks.rogue.keywords import RoguePath + for path in RoguePath.instances.values(): + if path.name in self.name: + return path + elif path.name == 'The_Harmony' and 'Harmony' in self.name: + return path + return None + @cached_property def is_Calyx(self): return self.is_Calyx_Golden or self.is_Calyx_Crimson @@ -47,6 +75,24 @@ class DungeonList(Keyword): def is_Stagnant_Shadow(self): return 'Stagnant_Shadow' in self.name + @cached_property + def Stagnant_Shadow_Combat_Type(self): + """ + Returns: + CombatType: CombatType object or None + """ + if not self.is_Stagnant_Shadow: + return None + from tasks.dungeon.keywords import DungeonDetailed + detail = DungeonDetailed.find_name(self.name) + if detail is None: + return None + from tasks.character.keywords import CombatType + for type_ in CombatType.instances.values(): + if type_.cn in detail.cn[:10]: + return type_ + return None + @cached_property def is_Cavern_of_Corrosion(self): return 'Cavern_of_Corrosion' in self.name From 0cf7700555a11c09a9c7326b8c61194a8db762d5 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 04:46:37 +0800 Subject: [PATCH 30/65] Upd: Redirect to 2.0 dungeon settings --- module/config/argument/argument.yaml | 4 ++-- module/config/config_updater.py | 10 +++++----- module/config/convert.py | 30 +++++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 3e0d467e8..66b0eff29 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -92,10 +92,10 @@ Dungeon: DungeonDaily: # Dungeon names will be injected in config updater CalyxGolden: - value: Calyx_Golden_Treasures + value: Calyx_Golden_Treasures_Jarilo_VI option: [ do_not_achieve, ] CalyxCrimson: - value: Calyx_Crimson_Erudition + value: Calyx_Crimson_Destruction_Herta_StorageZone option: [ do_not_achieve, ] StagnantShadow: value: Stagnant_Shadow_Quanta diff --git a/module/config/config_updater.py b/module/config/config_updater.py index 8c6521ac6..732e16152 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -6,6 +6,7 @@ from cached_property import cached_property from deploy.Windows.utils import DEPLOY_TEMPLATE, poor_yaml_read, poor_yaml_write from module.base.timer import timer +from module.config.convert import * from module.config.server import VALID_SERVER from module.config.utils import * @@ -631,11 +632,10 @@ class ConfigGenerator: class ConfigUpdater: # source, target, (optional)convert_func redirection = [ - # ('Dungeon.Dungeon.Support', 'Dungeon.DungeonSupport.Use'), - # ('Dungeon.Dungeon.SupportCharacter', 'Dungeon.DungeonSupport.Character'), - # ('Dungeon.Dungeon.Name', 'Dungeon.Dungeon.Name', convert_daily), - # ('Dungeon.Dungeon.NameAtDoubleCalyx', 'Dungeon.Dungeon.NameAtDoubleCalyx', convert_daily), - # ('Dungeon.DungeonDaily.CalyxCrimson', 'Dungeon.DungeonDaily.CalyxCrimson', convert_daily), + ('Dungeon.Dungeon.Name', 'Dungeon.Dungeon.Name', convert_20_dungeon), + ('Dungeon.Dungeon.NameAtDoubleCalyx', 'Dungeon.Dungeon.NameAtDoubleCalyx', convert_20_dungeon), + ('Dungeon.DungeonDaily.CalyxGolden', 'Dungeon.DungeonDaily.CalyxGolden', convert_20_dungeon), + ('Dungeon.DungeonDaily.CalyxCrimson', 'Dungeon.DungeonDaily.CalyxCrimson', convert_20_dungeon), ] @cached_property diff --git a/module/config/convert.py b/module/config/convert.py index 264101d43..aadc72df4 100644 --- a/module/config/convert.py +++ b/module/config/convert.py @@ -1,4 +1,32 @@ def convert_daily(value): if value == "Calyx_Crimson_Hunt": value = "Calyx_Crimson_The_Hunt" - return value \ No newline at end of file + return value + + +def convert_20_dungeon(value): + if value == 'Calyx_Golden_Memories': + return 'Calyx_Golden_Memories_Jarilo_VI' + if value == 'Calyx_Golden_Aether': + return 'Calyx_Golden_Aether_Jarilo_VI' + if value == 'Calyx_Golden_Treasures': + return 'Calyx_Golden_Treasures_Jarilo_VI' + if value == 'Calyx_Golden_Memories': + return 'Calyx_Golden_Memories_Jarilo_VI' + + if value == 'Calyx_Crimson_Destruction': + return 'Calyx_Crimson_Destruction_Herta_StorageZone' + if value == 'Calyx_Crimson_The_Hunt': + return 'Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains' + if value == 'Calyx_Crimson_Erudition': + return 'Calyx_Crimson_Erudition_Jarilo_RivetTown' + if value == 'Calyx_Crimson_Harmony': + return 'Calyx_Crimson_Harmony_Jarilo_RobotSettlement' + if value == 'Calyx_Crimson_Nihility': + return 'Calyx_Crimson_Nihility_Jarilo_GreatMine' + if value == 'Calyx_Crimson_Preservation': + return 'Calyx_Crimson_Preservation_Herta_SupplyZone' + if value == 'Calyx_Crimson_Abundance': + return 'Calyx_Crimson_Abundance_Jarilo_BackwaterPass' + + return value From 98efb031bc6b09dea0da2bb4c1b909566fb69cfa Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 05:13:54 +0800 Subject: [PATCH 31/65] Chore: Rename KEYWORD_* to KEYWORDS_* --- tasks/assignment/assignment.py | 4 +-- tasks/battle_pass/battle_pass.py | 46 +++++++++++++------------- tasks/battle_pass/keywords/__init__.py | 8 ++--- tasks/character/keywords/__init__.py | 2 +- tasks/character/switch.py | 8 ++--- tasks/daily/daily_quest.py | 3 +- tasks/dungeon/dungeon.py | 12 +++---- tasks/item/consumable_usage.py | 6 ++-- tasks/item/keywords/__init__.py | 2 +- tasks/item/relics.py | 4 +-- tasks/item/ui.py | 22 ++++++------ tasks/rogue/rogue.py | 4 +-- 12 files changed, 59 insertions(+), 62 deletions(-) diff --git a/tasks/assignment/assignment.py b/tasks/assignment/assignment.py index 2f21c93f2..758dd5af2 100644 --- a/tasks/assignment/assignment.py +++ b/tasks/assignment/assignment.py @@ -2,11 +2,9 @@ from datetime import datetime from module.logger import logger from tasks.assignment.claim import AssignmentClaim -from tasks.assignment.keywords import (KEYWORDS_ASSIGNMENT_GROUP, - AssignmentEntry, AssignmentEventGroup) +from tasks.assignment.keywords import (AssignmentEntry, AssignmentEventGroup, KEYWORDS_ASSIGNMENT_GROUP) from tasks.assignment.ui import AssignmentStatus from tasks.base.page import page_assignment, page_menu -from tasks.battle_pass.keywords import KEYWORD_BATTLE_PASS_QUEST from tasks.daily.keywords import KEYWORDS_DAILY_QUEST from tasks.daily.synthesize import SynthesizeUI diff --git a/tasks/battle_pass/battle_pass.py b/tasks/battle_pass/battle_pass.py index b5053dec6..a7e172b41 100644 --- a/tasks/battle_pass/battle_pass.py +++ b/tasks/battle_pass/battle_pass.py @@ -30,12 +30,12 @@ class BattlePassTab(Switch): SWITCH_BATTLE_PASS_TAB = BattlePassTab('BattlePassTab', is_selector=True) SWITCH_BATTLE_PASS_TAB.add_state( - KEYWORD_BATTLE_PASS_TAB.Rewards, + KEYWORDS_BATTLE_PASS_TAB.Rewards, check_button=REWARDS_CHECK, click_button=REWARDS_CLICK ) SWITCH_BATTLE_PASS_TAB.add_state( - KEYWORD_BATTLE_PASS_TAB.Missions, + KEYWORDS_BATTLE_PASS_TAB.Missions, check_button=MISSIONS_CHECK, click_button=MISSIONS_CLICK ) @@ -59,12 +59,12 @@ class BattlePassMissionTab(Switch): SWITCH_BATTLE_PASS_MISSION_TAB = BattlePassMissionTab('BattlePassMissionTab', is_selector=True) SWITCH_BATTLE_PASS_MISSION_TAB.add_state( - KEYWORD_BATTLE_PASS_MISSION_TAB.This_Week_Missions, + KEYWORDS_BATTLE_PASS_MISSION_TAB.This_Week_Missions, check_button=WEEK_MISSION_CLICK, click_button=WEEK_MISSION_CLICK ) SWITCH_BATTLE_PASS_MISSION_TAB.add_state( - KEYWORD_BATTLE_PASS_MISSION_TAB.This_Period_Missions, + KEYWORDS_BATTLE_PASS_MISSION_TAB.This_Period_Missions, check_button=PERIOD_MISSION_CLICK, click_button=PERIOD_MISSION_CLICK ) @@ -89,7 +89,7 @@ class DataBattlePassQuest: @property def is_incomplete(self) -> bool: - return self.state == KEYWORD_BATTLE_PASS_QUEST_STATE.Navigate + return self.state == KEYWORDS_BATTLE_PASS_QUEST_STATE.Navigate class BattlePassUI(UI): @@ -129,7 +129,7 @@ class BattlePassUI(UI): logger.info('Missions tab loaded') break - def battle_pass_goto(self, state: KEYWORD_BATTLE_PASS_TAB): + def battle_pass_goto(self, state: KEYWORDS_BATTLE_PASS_TAB): """ Args: state: @@ -143,18 +143,18 @@ class BattlePassUI(UI): self.ui_ensure(page_battle_pass) if SWITCH_BATTLE_PASS_TAB.set(state, main=self): logger.info(f'Tab goto {state}, wait until loaded') - if state == KEYWORD_BATTLE_PASS_TAB.Missions: + if state == KEYWORDS_BATTLE_PASS_TAB.Missions: self._battle_pass_wait_missions_loaded() - if state == KEYWORD_BATTLE_PASS_TAB.Rewards: + if state == KEYWORDS_BATTLE_PASS_TAB.Rewards: self._battle_pass_wait_rewards_loaded() - def battle_pass_mission_tab_goto(self, state: KEYWORD_BATTLE_PASS_MISSION_TAB): - self.battle_pass_goto(KEYWORD_BATTLE_PASS_TAB.Missions) + def battle_pass_mission_tab_goto(self, state: KEYWORDS_BATTLE_PASS_MISSION_TAB): + self.battle_pass_goto(KEYWORDS_BATTLE_PASS_TAB.Missions) if SWITCH_BATTLE_PASS_MISSION_TAB.set(state, main=self): logger.info(f'Tab goto {state}, wait until loaded') - if state == KEYWORD_BATTLE_PASS_MISSION_TAB.This_Week_Missions: + if state == KEYWORDS_BATTLE_PASS_MISSION_TAB.This_Week_Missions: self._battle_pass_wait_missions_loaded() - if state == KEYWORD_BATTLE_PASS_MISSION_TAB.This_Period_Missions: + if state == KEYWORDS_BATTLE_PASS_MISSION_TAB.This_Period_Missions: self._battle_pass_wait_missions_loaded() def handle_choose_gifts(self, interval=5): @@ -174,7 +174,7 @@ class BattlePassUI(UI): def _claim_exp(self, skip_first_screenshot=True): logger.hr('Claim EXP', level=1) - self.battle_pass_goto(KEYWORD_BATTLE_PASS_TAB.Missions) + self.battle_pass_goto(KEYWORDS_BATTLE_PASS_TAB.Missions) claimed = False while 1: if skip_first_screenshot: @@ -195,7 +195,7 @@ class BattlePassUI(UI): def _claim_rewards(self, skip_first_screenshot=True): logger.hr('Claim rewards', level=1) - self.battle_pass_goto(KEYWORD_BATTLE_PASS_TAB.Rewards) + self.battle_pass_goto(KEYWORDS_BATTLE_PASS_TAB.Rewards) timeout = Timer(5, count=15).start() while 1: if skip_first_screenshot: @@ -305,11 +305,11 @@ class BattlePassUI(UI): def battle_pass_quests_recognition(self): """ Pages: - in: page_battle_pass, KEYWORD_BATTLE_PASS_TAB.Missions, weekly or period + in: page_battle_pass, KEYWORDS_BATTLE_PASS_TAB.Missions, weekly or period """ logger.hr('Quest recognise', level=1) self.battle_pass_mission_tab_goto( - KEYWORD_BATTLE_PASS_MISSION_TAB.This_Week_Missions) + KEYWORDS_BATTLE_PASS_MISSION_TAB.This_Week_Missions) scroll = Scroll(MISSION_PAGE_SCROLL, color=(198, 198, 198)) scroll.set_top(main=self) @@ -327,19 +327,19 @@ class BattlePassUI(UI): # Convert quest keyword to stored object dic_quest_to_stored = { - KEYWORD_BATTLE_PASS_QUEST.Complete_Simulated_Universe_1_times: + KEYWORDS_BATTLE_PASS_QUEST.Complete_Simulated_Universe_1_times: self.config.stored.BattlePassSimulatedUniverse, - KEYWORD_BATTLE_PASS_QUEST.Clear_Calyx_1_times: + KEYWORDS_BATTLE_PASS_QUEST.Clear_Calyx_1_times: self.config.stored.BattlePassQuestCalyx, - KEYWORD_BATTLE_PASS_QUEST.Complete_Echo_of_War_1_times: + KEYWORDS_BATTLE_PASS_QUEST.Complete_Echo_of_War_1_times: self.config.stored.BattlePassQuestEchoOfWar, - KEYWORD_BATTLE_PASS_QUEST.Use_300000_credits: + KEYWORDS_BATTLE_PASS_QUEST.Use_300000_credits: self.config.stored.BattlePassQuestCredits, - KEYWORD_BATTLE_PASS_QUEST.Synthesize_Consumables_1_times: + KEYWORDS_BATTLE_PASS_QUEST.Synthesize_Consumables_1_times: self.config.stored.BattlePassQuestSynthesizeConsumables, - KEYWORD_BATTLE_PASS_QUEST.Clear_Cavern_of_Corrosion_1_times: + KEYWORDS_BATTLE_PASS_QUEST.Clear_Cavern_of_Corrosion_1_times: self.config.stored.BattlePassQuestCavernOfCorrosion, - KEYWORD_BATTLE_PASS_QUEST.Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max: + KEYWORDS_BATTLE_PASS_QUEST.Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max: self.config.stored.BattlePassQuestTrailblazePower, } with self.config.multi_set(): diff --git a/tasks/battle_pass/keywords/__init__.py b/tasks/battle_pass/keywords/__init__.py index 2cfa8f449..6e5e5a7b8 100644 --- a/tasks/battle_pass/keywords/__init__.py +++ b/tasks/battle_pass/keywords/__init__.py @@ -1,6 +1,6 @@ -import tasks.battle_pass.keywords.mission_tab as KEYWORD_BATTLE_PASS_MISSION_TAB -import tasks.battle_pass.keywords.quest as KEYWORD_BATTLE_PASS_QUEST -import tasks.battle_pass.keywords.quest_state as KEYWORD_BATTLE_PASS_QUEST_STATE -import tasks.battle_pass.keywords.tab as KEYWORD_BATTLE_PASS_TAB +import tasks.battle_pass.keywords.mission_tab as KEYWORDS_BATTLE_PASS_MISSION_TAB +import tasks.battle_pass.keywords.quest as KEYWORDS_BATTLE_PASS_QUEST +import tasks.battle_pass.keywords.quest_state as KEYWORDS_BATTLE_PASS_QUEST_STATE +import tasks.battle_pass.keywords.tab as KEYWORDS_BATTLE_PASS_TAB from tasks.battle_pass.keywords.classes import BattlePassTab, BattlePassMissionTab, BattlePassQuest, \ BattlePassQuestState diff --git a/tasks/character/keywords/__init__.py b/tasks/character/keywords/__init__.py index 3add0cd00..cf96673b8 100644 --- a/tasks/character/keywords/__init__.py +++ b/tasks/character/keywords/__init__.py @@ -1,4 +1,4 @@ -import tasks.character.keywords.character_list as KEYWORD_CHARACTER_LIST +import tasks.character.keywords.character_list as KEYWORDS_CHARACTER_LIST import tasks.character.keywords.combat_type as KEYWORDS_COMBAT_TYPE from tasks.character.keywords.character_list import * from tasks.character.keywords.classes import CharacterList, CombatType diff --git a/tasks/character/switch.py b/tasks/character/switch.py index 818ab800a..7f8faf301 100644 --- a/tasks/character/switch.py +++ b/tasks/character/switch.py @@ -11,7 +11,7 @@ from module.logger import logger from module.ocr.ocr import BoxedResult, OcrResultButton, OcrWhiteLetterOnComplexBackground from tasks.base.ui import UI from tasks.character.assets.assets_character_switch import * -from tasks.character.keywords import CharacterList, DICT_SORTED_RANGES, KEYWORD_CHARACTER_LIST +from tasks.character.keywords import CharacterList, DICT_SORTED_RANGES, KEYWORDS_CHARACTER_LIST class OcrCharacterName(OcrWhiteLetterOnComplexBackground): @@ -86,16 +86,16 @@ class CharacterSwitch(UI): Detect characters that can't be found by OCR """ dict_template = { - KEYWORD_CHARACTER_LIST.TrailblazerDestruction: [ + KEYWORDS_CHARACTER_LIST.TrailblazerDestruction: [ TrailblazerDestructionMale, TrailblazerDestructionFemale, ], - KEYWORD_CHARACTER_LIST.TrailblazerPreservation: [ + KEYWORDS_CHARACTER_LIST.TrailblazerPreservation: [ TrailblazerPreservationMale, TrailblazerPreservationFemale, ], - KEYWORD_CHARACTER_LIST.Huohuo: [ + KEYWORDS_CHARACTER_LIST.Huohuo: [ Huohuo, ], } diff --git a/tasks/daily/daily_quest.py b/tasks/daily/daily_quest.py index 3e80a4798..d10953647 100644 --- a/tasks/daily/daily_quest.py +++ b/tasks/daily/daily_quest.py @@ -6,7 +6,6 @@ from module.base.utils import crop from module.logger import logger from module.ocr.ocr import Ocr, OcrResultButton from module.ocr.utils import split_and_pair_buttons -from tasks.battle_pass.keywords import KEYWORD_BATTLE_PASS_QUEST from tasks.daily.assets.assets_daily_reward import * from tasks.daily.camera import CameraUI from tasks.daily.keywords import ( @@ -337,7 +336,7 @@ class DailyQuestUI(DungeonUI, RouteLoader): # but battle pass quests need synthesizing consumables. # if self.synthesized_material: # quests = self.config.stored.BattlePassWeeklyQuest.load_quests() - # if KEYWORD_BATTLE_PASS_QUEST.Synthesize_Consumables_1_times in quests: + # if KEYWORDS_BATTLE_PASS_QUEST.Synthesize_Consumables_1_times in quests: # logger.info('Done weekly quest Synthesize_Consumables_1_times once') # self.config.stored.BattlePassQuestSynthesizeConsumables.add() # if self.config.stored.BattlePassQuestSynthesizeConsumables.is_full(): diff --git a/tasks/dungeon/dungeon.py b/tasks/dungeon/dungeon.py index 5bfb4e171..247065993 100644 --- a/tasks/dungeon/dungeon.py +++ b/tasks/dungeon/dungeon.py @@ -1,6 +1,6 @@ from module.base.utils import area_offset from module.logger import logger -from tasks.battle_pass.keywords import KEYWORD_BATTLE_PASS_QUEST +from tasks.battle_pass.keywords import KEYWORDS_BATTLE_PASS_QUEST from tasks.combat.combat import Combat from tasks.daily.keywords import KEYWORDS_DAILY_QUEST from tasks.dungeon.event import DungeonEvent @@ -84,7 +84,7 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat): if KEYWORDS_DAILY_QUEST.Clear_Calyx_Golden_1_times in self.daily_quests: logger.info('Achieved daily quest Clear_Calyx_Golden_1_times') self.achieved_daily_quest = True - if KEYWORD_BATTLE_PASS_QUEST.Clear_Calyx_1_times in self.weekly_quests: + if KEYWORDS_BATTLE_PASS_QUEST.Clear_Calyx_1_times in self.weekly_quests: logger.info('Done weekly quest Clear_Calyx_1_times once') self.config.stored.BattlePassQuestCalyx.add() if self.config.stored.BattlePassQuestCalyx.is_full(): @@ -95,7 +95,7 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat): if KEYWORDS_DAILY_QUEST.Clear_Calyx_Crimson_1_times in self.daily_quests: logger.info('Achieve daily quest Clear_Calyx_Crimson_1_times') self.achieved_daily_quest = True - if KEYWORD_BATTLE_PASS_QUEST.Clear_Calyx_1_times in self.weekly_quests: + if KEYWORDS_BATTLE_PASS_QUEST.Clear_Calyx_1_times in self.weekly_quests: logger.info('Done weekly quest Clear_Calyx_1_times once') self.config.stored.BattlePassQuestCalyx.add() if self.config.stored.BattlePassQuestCalyx.is_full(): @@ -111,7 +111,7 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat): if KEYWORDS_DAILY_QUEST.Clear_Cavern_of_Corrosion_1_times in self.daily_quests: logger.info('Achieve daily quest Clear_Cavern_of_Corrosion_1_times') self.achieved_daily_quest = True - if KEYWORD_BATTLE_PASS_QUEST.Clear_Cavern_of_Corrosion_1_times in self.weekly_quests: + if KEYWORDS_BATTLE_PASS_QUEST.Clear_Cavern_of_Corrosion_1_times in self.weekly_quests: logger.info('Done weekly quest Clear_Cavern_of_Corrosion_1_times once') self.config.stored.BattlePassQuestCavernOfCorrosion.add() if self.config.stored.BattlePassQuestCavernOfCorrosion.is_full(): @@ -122,7 +122,7 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat): if KEYWORDS_DAILY_QUEST.Complete_Echo_of_War_1_times in self.daily_quests: logger.info('Achieve daily quest Complete_Echo_of_War_1_times') self.achieved_daily_quest = True - if KEYWORD_BATTLE_PASS_QUEST.Complete_Echo_of_War_1_times in self.weekly_quests: + if KEYWORDS_BATTLE_PASS_QUEST.Complete_Echo_of_War_1_times in self.weekly_quests: logger.info('Done weekly quest Complete_Echo_of_War_1_times once') self.config.stored.BattlePassQuestEchoOfWar.add() if self.config.stored.BattlePassQuestEchoOfWar.is_full(): @@ -407,7 +407,7 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat): def check_stamina_quest(self, stamina_used: int): logger.info(f'Used {stamina_used} stamina') - if KEYWORD_BATTLE_PASS_QUEST.Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max in self.weekly_quests: + if KEYWORDS_BATTLE_PASS_QUEST.Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max in self.weekly_quests: logger.info(f'Done Consume_a_total_of_1_Trailblaze_Power_1400_Trailblazer_Power_max stamina {stamina_used}') self.config.stored.BattlePassQuestTrailblazePower.add(stamina_used) if self.config.stored.BattlePassQuestTrailblazePower.is_full(): diff --git a/tasks/item/consumable_usage.py b/tasks/item/consumable_usage.py index 07224982d..6df481dc5 100644 --- a/tasks/item/consumable_usage.py +++ b/tasks/item/consumable_usage.py @@ -8,7 +8,7 @@ from tasks.daily.assets.assets_daily_synthesize_consumable import \ from tasks.daily.synthesize import SynthesizeConsumablesUI from tasks.item.assets.assets_item_consumable_usage import * from tasks.item.assets.assets_item_ui import CONSUMABLE_CHECK -from tasks.item.keywords import KEYWORD_ITEM_TAB +from tasks.item.keywords import KEYWORDS_ITEM_TAB from tasks.item.ui import ItemUI @@ -28,7 +28,7 @@ class ConsumableUsageUI(ItemUI): """ logger.hr('Use consumable', level=2) self.ui_ensure(page_item) - self.item_goto(KEYWORD_ITEM_TAB.Consumables) + self.item_goto(KEYWORDS_ITEM_TAB.Consumables) if self._search_and_select_consumable(): self._click_use() self._confirm_use() @@ -50,7 +50,7 @@ class ConsumableUsageUI(ItemUI): # because in this scenario, scroll bar delay appears and the previous screenshot was # taken after clicking on the "item" to determine whether to enter the "item", which may be inaccurate # self._switch_tag_to_consumables(False) - self.item_goto(KEYWORD_ITEM_TAB.Consumables) + self.item_goto(KEYWORDS_ITEM_TAB.Consumables) # Determine if there is a scroll bar. If there is a scroll bar, # pull it down and check if the consumable to be used can be found diff --git a/tasks/item/keywords/__init__.py b/tasks/item/keywords/__init__.py index e37815a8c..079bcd293 100644 --- a/tasks/item/keywords/__init__.py +++ b/tasks/item/keywords/__init__.py @@ -1,2 +1,2 @@ -import tasks.item.keywords.tab as KEYWORD_ITEM_TAB +import tasks.item.keywords.tab as KEYWORDS_ITEM_TAB from tasks.item.keywords.classes import ItemTab diff --git a/tasks/item/relics.py b/tasks/item/relics.py index 7febb0751..d0b3d916b 100644 --- a/tasks/item/relics.py +++ b/tasks/item/relics.py @@ -2,7 +2,7 @@ from module.base.timer import Timer from module.logger import logger from tasks.base.assets.assets_base_page import CLOSE from tasks.item.assets.assets_item_relics import * -from tasks.item.keywords import KEYWORD_ITEM_TAB +from tasks.item.keywords import KEYWORDS_ITEM_TAB from tasks.item.ui import ItemUI @@ -48,7 +48,7 @@ class RelicsUI(ItemUI): out: page_item, GOTO_SALVAGE """ logger.hr('Salvage Relic', level=2) - self.item_goto(KEYWORD_ITEM_TAB.Relics, wait_until_stable=False) + self.item_goto(KEYWORDS_ITEM_TAB.Relics, wait_until_stable=False) while 1: # relic tab -> salvage if skip_first_screenshot: skip_first_screenshot = False diff --git a/tasks/item/ui.py b/tasks/item/ui.py index 78d9151cf..23ae5561a 100644 --- a/tasks/item/ui.py +++ b/tasks/item/ui.py @@ -4,48 +4,48 @@ from tasks.base.page import page_item from tasks.base.ui import UI from tasks.item.assets.assets_item_consumable_usage import SIMPLE_PROTECTIVE_GEAR from tasks.item.assets.assets_item_ui import * -from tasks.item.keywords import KEYWORD_ITEM_TAB +from tasks.item.keywords import KEYWORDS_ITEM_TAB SWITCH_ITEM_TAB = Switch('ItemTab', is_selector=True) SWITCH_ITEM_TAB.add_state( - KEYWORD_ITEM_TAB.UpgradeMaterials, + KEYWORDS_ITEM_TAB.UpgradeMaterials, check_button=UPGRADE_MATERIAL_CHECK, click_button=UPGRADE_MATERIAL_CLICK ) SWITCH_ITEM_TAB.add_state( - KEYWORD_ITEM_TAB.LightCone, + KEYWORDS_ITEM_TAB.LightCone, check_button=LIGHT_CONE_CHECK, click_button=LIGHT_CONE_CLICK ) SWITCH_ITEM_TAB.add_state( - KEYWORD_ITEM_TAB.Relics, + KEYWORDS_ITEM_TAB.Relics, check_button=RELICS_CHECK, click_button=RELICS_CLICK ) SWITCH_ITEM_TAB.add_state( - KEYWORD_ITEM_TAB.OtherMaterials, + KEYWORDS_ITEM_TAB.OtherMaterials, check_button=OTHER_MATERIALS_CHECK, click_button=OTHER_MATERIALS_CLICK ) SWITCH_ITEM_TAB.add_state( - KEYWORD_ITEM_TAB.Consumables, + KEYWORDS_ITEM_TAB.Consumables, check_button=CONSUMABLE_CHECK, click_button=CONSUMABLE_CLICK, ) SWITCH_ITEM_TAB.add_state( - KEYWORD_ITEM_TAB.Missions, + KEYWORDS_ITEM_TAB.Missions, check_button=MISSIONS_CHECK, click_button=MISSIONS_CLICK ) SWITCH_ITEM_TAB.add_state( - KEYWORD_ITEM_TAB.Valuables, + KEYWORDS_ITEM_TAB.Valuables, check_button=VALUABLES_CHECK, click_button=VALUABLES_CLICK ) class ItemUI(UI): - def item_goto(self, state: KEYWORD_ITEM_TAB, wait_until_stable=True): + def item_goto(self, state: KEYWORDS_ITEM_TAB, wait_until_stable=True): """ Args: state: @@ -55,8 +55,8 @@ class ItemUI(UI): Returns: self = ItemUI('alas') self.device.screenshot() - self.item_goto(KEYWORD_ITEM_TAB.Relics) - self.item_goto(KEYWORD_ITEM_TAB.Consumables) + self.item_goto(KEYWORDS_ITEM_TAB.Relics) + self.item_goto(KEYWORDS_ITEM_TAB.Consumables) """ logger.hr('Item tab goto', level=2) self.ui_ensure(page_item) diff --git a/tasks/rogue/rogue.py b/tasks/rogue/rogue.py index a6f1a2984..7635b25b8 100644 --- a/tasks/rogue/rogue.py +++ b/tasks/rogue/rogue.py @@ -1,5 +1,5 @@ from module.logger import logger -from tasks.battle_pass.keywords import KEYWORD_BATTLE_PASS_QUEST +from tasks.battle_pass.keywords import KEYWORDS_BATTLE_PASS_QUEST from tasks.daily.keywords import KEYWORDS_DAILY_QUEST from tasks.rogue.entry.entry import RogueEntry from tasks.rogue.exception import RogueReachedWeeklyPointLimit, RogueTeamNotPrepared @@ -54,7 +54,7 @@ class Rogue(RouteLoader, RogueEntry): self.config.task_call('DailyQuest') self.config.task_stop() quests = self.config.stored.BattlePassWeeklyQuest.load_quests() - if KEYWORD_BATTLE_PASS_QUEST.Complete_Simulated_Universe_1_times in quests: + if KEYWORDS_BATTLE_PASS_QUEST.Complete_Simulated_Universe_1_times in quests: logger.info('Achieve battle pass quest Complete_Simulated_Universe_1_times') self.config.task_call('BattlePass') self.config.task_stop() From e27332c6092d0632ea1fe9e7d445b292c100372d Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 05:24:46 +0800 Subject: [PATCH 32/65] Add: Switch world before entering calyx golden --- assets/share/dungeon/ui/CALYX_WORLD_1.png | Bin 0 -> 6798 bytes assets/share/dungeon/ui/CALYX_WORLD_2.png | Bin 0 -> 6999 bytes assets/share/dungeon/ui/CALYX_WORLD_3.png | Bin 0 -> 6900 bytes tasks/dungeon/assets/assets_dungeon_ui.py | 30 +++++++++++++ tasks/dungeon/keywords/classes.py | 11 +++++ tasks/dungeon/ui.py | 51 +++++++++++++++++++++- tasks/map/keywords/classes.py | 6 +++ 7 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 assets/share/dungeon/ui/CALYX_WORLD_1.png create mode 100644 assets/share/dungeon/ui/CALYX_WORLD_2.png create mode 100644 assets/share/dungeon/ui/CALYX_WORLD_3.png diff --git a/assets/share/dungeon/ui/CALYX_WORLD_1.png b/assets/share/dungeon/ui/CALYX_WORLD_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5457292d261d6d6497a8b955c490411ba6d68717 GIT binary patch literal 6798 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 a&Pc#uP9F!^d9|89b{(zTnw9F-PyPcfwkZPu literal 0 HcmV?d00001 diff --git a/assets/share/dungeon/ui/CALYX_WORLD_2.png b/assets/share/dungeon/ui/CALYX_WORLD_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3e3edb76e15028fa4e91d86798437e14a3c5fe GIT binary patch literal 6999 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 XQ7$eKbgN4MuwsU literal 0 HcmV?d00001 diff --git a/assets/share/dungeon/ui/CALYX_WORLD_3.png b/assets/share/dungeon/ui/CALYX_WORLD_3.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb73049b481bbfb72978d365a87ea12522ed2b5 GIT binary patch literal 6900 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 ZB>@h&{<71dVV<+Y+v+-Mr7E^h{sZOLLNEXT literal 0 HcmV?d00001 diff --git a/tasks/dungeon/assets/assets_dungeon_ui.py b/tasks/dungeon/assets/assets_dungeon_ui.py index 3b8a6ece6..7d6007a7e 100644 --- a/tasks/dungeon/assets/assets_dungeon_ui.py +++ b/tasks/dungeon/assets/assets_dungeon_ui.py @@ -3,6 +3,36 @@ from module.base.button import Button, ButtonWrapper # This file was auto-generated, do not modify it manually. To generate: # ``` python -m dev_tools.button_extract ``` +CALYX_WORLD_1 = ButtonWrapper( + name='CALYX_WORLD_1', + share=Button( + file='./assets/share/dungeon/ui/CALYX_WORLD_1.png', + area=(490, 185, 540, 230), + search=(470, 165, 560, 250), + color=(197, 196, 196), + button=(490, 185, 540, 230), + ), +) +CALYX_WORLD_2 = ButtonWrapper( + name='CALYX_WORLD_2', + share=Button( + file='./assets/share/dungeon/ui/CALYX_WORLD_2.png', + area=(590, 185, 640, 230), + search=(570, 165, 660, 250), + color=(199, 198, 198), + button=(590, 185, 640, 230), + ), +) +CALYX_WORLD_3 = ButtonWrapper( + name='CALYX_WORLD_3', + share=Button( + file='./assets/share/dungeon/ui/CALYX_WORLD_3.png', + area=(689, 186, 739, 231), + search=(669, 166, 759, 251), + color=(158, 158, 158), + button=(689, 186, 739, 231), + ), +) DAILY_TRAINING_CHECK = ButtonWrapper( name='DAILY_TRAINING_CHECK', share=Button( diff --git a/tasks/dungeon/keywords/classes.py b/tasks/dungeon/keywords/classes.py index 190efe337..88bccc895 100644 --- a/tasks/dungeon/keywords/classes.py +++ b/tasks/dungeon/keywords/classes.py @@ -31,6 +31,17 @@ class DungeonList(Keyword): from tasks.map.keywords import MapPlane return MapPlane.find_plane_id(self.plane_id) + @cached_property + def world(self): + """ + Returns: + MapWorld: MapWorld object or None + """ + if self.plane is not None: + return self.plane.world + else: + return None + @cached_property def is_Calyx_Golden(self): return 'Calyx_Golden' in self.name diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index f5d87e518..17bddbbb0 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -27,6 +27,7 @@ from tasks.dungeon.keywords import ( ) from tasks.dungeon.keywords.classes import DungeonEntrance from tasks.dungeon.state import DungeonState +from tasks.map.keywords import KEYWORDS_MAP_WORLD class DungeonTabSwitch(Switch): @@ -76,7 +77,11 @@ class OcrDungeonNav(Ocr): class OcrDungeonList(Ocr): def after_process(self, result): + # 乙太之蕾•雅利洛-Ⅵ + result = result.replace('-VI', '-Ⅵ') + result = super().after_process(result) + if self.lang == 'cn': result = result.replace('翼', '巽') # 巽风之形 result = result.replace('皖A0', '50').replace('皖', '') @@ -372,6 +377,43 @@ class DungeonUI(DungeonState): DUNGEON_NAV_LIST.select_row(dungeon.dungeon_nav, main=self, insight=False) return True + def _dungeon_world_set(self, dungeon: DungeonList, skip_first_screenshot=True): + """ + Switch worlds in Calyx_Golden + """ + logger.hr('Dungeon world set', level=2) + if not dungeon.is_Calyx_Golden: + logger.warning(f'Dungeon {dungeon} is not Calyx Golden, no need to set world') + return + if dungeon.world is None: + logger.error(f'Dungeon {dungeon} does not belongs to any world') + return + dic_world_button = { + KEYWORDS_MAP_WORLD.Jarilo_VI: CALYX_WORLD_1, + KEYWORDS_MAP_WORLD.The_Xianzhou_Luofu: CALYX_WORLD_2, + KEYWORDS_MAP_WORLD.Penacony: CALYX_WORLD_3, + } + button = dic_world_button.get(dungeon.world) + if button is None: + logger.error(f'Dungeon {dungeon} with world {dungeon.world} has no corresponding world button') + return + + logger.info(f'Dungeon world set {dungeon.world}') + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # End + if self.image_color_count(button, color=(18, 18, 18), threshold=180, count=50): + logger.info(f'Dungeon world at {dungeon.world}') + break + # Click + if self.ui_page_appear(page_guide, interval=2): + self.device.click(button) + continue + def _dungeon_insight(self, dungeon: DungeonList): """ Pages: @@ -534,8 +576,7 @@ class DungeonUI(DungeonState): # Reset search button DUNGEON_LIST.search_button = OCR_DUNGEON_LIST - if dungeon.is_Calyx_Golden \ - or dungeon.is_Calyx_Crimson \ + if dungeon.is_Calyx_Crimson \ or dungeon.is_Stagnant_Shadow \ or dungeon.is_Cavern_of_Corrosion \ or dungeon.is_Echo_of_War: @@ -543,6 +584,12 @@ class DungeonUI(DungeonState): self._dungeon_insight(dungeon) self._dungeon_enter(dungeon) return True + if dungeon.is_Calyx_Golden: + self._dungeon_nav_goto(dungeon) + self._dungeon_world_set(dungeon) + self._dungeon_insight(dungeon) + self._dungeon_enter(dungeon) + return True logger.error(f'Goto dungeon {dungeon} is not supported') return False diff --git a/tasks/map/keywords/classes.py b/tasks/map/keywords/classes.py index d94ca017d..a071b7cab 100644 --- a/tasks/map/keywords/classes.py +++ b/tasks/map/keywords/classes.py @@ -37,6 +37,9 @@ class MapPlane(Keyword): return instance return None + def __hash__(self) -> int: + return super().__hash__() + @cached_property def world(self) -> "MapWorld": """ @@ -154,6 +157,9 @@ class MapWorld(Keyword): return instance return None + def __hash__(self) -> int: + return super().__hash__() + @cached_property def is_Herta(self): return self.short_name == 'Herta' From 3f38deedd7dd9d21ef2e3af83e707d06bda33312 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 05:52:57 +0800 Subject: [PATCH 33/65] Fix: Wait until dungeon list loaded --- assets/share/dungeon/ui/LIST_LOADED_CHECK.png | Bin 0 -> 29246 bytes tasks/dungeon/assets/assets_dungeon_ui.py | 10 +++++++ tasks/dungeon/ui.py | 27 ++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 assets/share/dungeon/ui/LIST_LOADED_CHECK.png diff --git a/assets/share/dungeon/ui/LIST_LOADED_CHECK.png b/assets/share/dungeon/ui/LIST_LOADED_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..df938c00d3a40fb0afe2770c11898a70b09322bf GIT binary patch literal 29246 zcmeFY_cz=B`v#s)ohUUrRB36cQM>l5_EsbIXsMW?W{gVus;W)x5}`Fh5~KErP_0qB z_K46Tf)HB-k+1jXd(QW_?|<-mo|E&)IT`0Xulw=1@9Vzq>lyRHNc;Mg+gAVpz;#_6 z4O0N%!s*+yzb~CVUH;+KJ9D~RexqaU4**i6IH`GDNLTmXRJX@nWXDwWEqGDme`u~3`btjzTK7r_6Z^wKX@>wMM}z^f0e zZ2xpbMqjbG$#Ek`2iX38?1~N|dj8Af2G{4Y(Kc~FyJr;Mnc~{;(2e!=qlu$tQV!{O zAY_o`-3>OulENf!lCe&EH}2h84xK;e@3SuT{&2m}0RU{C3kik>d{aF> zQ{e+R3wSdo_K>aXFC(Jqg`g$ielp+>KO5=lnNOyGUt;FJZUTOB1HPG6zrF%U0|2~2 z-m38f(ANQLySgeD0F$WH87{zN{$121K*AY7)?@95XaB(hUIPC$6*>F;2jENTKm20n zzn7nRXI&?$efAyh0w5^S>J!U9F9Gke)I|CK_n(~wsNZAnKX>2Y+?S`rt$$FCZz3CX z&H%pmruS#+4@=!_NdJ8svc36do^Sq#SEbr3E+JOXh+(~o%+4BHaqrr`7MG z1RuHy@Xh`wtL%G01l{+QcTl-$BB}ShnuIr%^x&i`5=KuH8k(1`v=iZo-Li^lc)@Sj z71C&$tijivKF_uSlicFXpkGdfTnChXH2!W>$5h+v^&Lt%b2g6IYB&h+4|GQ~{`S>m z0IRFCWC#@iNNuGh{qy7upg*&40RU)T=C&(I<1*;H1ORA!`B(VcbEa!;H%q@W=d|%O zf9E>;>Y~O!*B*XXVpY4i`0nnNuiP2WZ<&8rm^@$m?cD7zH?se-*0f1HyH5JUX7?}o z4cEn&+_^uvn?GJY|NPe__E&rg(KnnDC;101ab+c*=YORmo${{m{z~*s6aJ20euZaI zY97hfFoWW!UfIP*X}*lHx-Hnn=}feeu}G3}=CP6s z;<)oY_tnOwhiBv7v9Dcn_`v$Z>;0!s+ExZu>Lmhe4{F$&E?HiV_#pA)5r1llag9JI z8?8OqNulzSl~$=Bh3_6;u7JZMW_HI^orlcbDT_u|_yj&l>R#3L)WPeB7Mc~R470lD z7zmO-fxBlHFIBxOy`Py}|B2<3amrEm&&B$i3LVk&2AA_6nii(9>B+dL63-XqNvdUi zL7ViWaz`(rqZRUObirSOUWl7Tq1dGZvjzI$oa()Wq6K5Wv)x_Ysczyc0Zo?)5%)AR ze`gMRE;Fr=Rw8yG*RFrO9?_-a^!S$Nt*~3g-1WD_vkZ_IMl!R0nLnM7yp!enndP$& z&`Nk;_$^0r4_mrIxT;F*sfseCO(q+p^ZQRe|99hKkv!Ro1 z6>ZHR=)%#RAn`B*Gj)G7s1%e8LM-|ApJDE-{Ie-Pm7_PnH*kF*O!Sl2 zR|rGed*I!IJ+9S_@r@x~xu?>XWIx^Vl6dC4+4sqL+4Hk|!_el3za=+%-I|iy-3o?u z3m!EHQleZJWP-U=K&3u+ol2!=U1mI$UOBl-;tSggI~H4n`qMnKK}|z7BLRJVzeHwA zCri8666MEoJab>QOf}<=6C#T=b2{|mWaGLrrZe95UdS-apq75NP_YQH*t3`@)g8AZ zi;%(NmR>LJSi-Nt72v&fC1vok_8>TT?&kc>B%xuUJu~lViM8XkD{I+n7uV(YU+oL* zgZBq{`tGvvj4K8xzV!EBzDIj{3P`>3YZYt3P5#h6}0xsh2G?D3i+! zTpU~Mofq1hPP|QN8m=ALD}ZC+Gi6iYQ9_?`M>yulPz-*j+y1BW#`E1xs@1%2-vXi- zUi@R{6G_}5$idp-2zSr8I!7>f{3-YszTNf@t~czZf{L=s;lRo{l}?qjd7*hxEyx!B zIpvlI&~a!Ml<7G4Nb#_jo^;UqH)NZ0%jm+(Gi_&xXK?@C{K;yvp8 zf?P{IyiC2E*WeBB8qf{@21gxeZe_9sus^)K9<$g!*{&S3;D46nl`WOCm~EaB;9O3e z$#3LZS{dlgg(z9eSbuu^Eb=p3W|b;2;=bAoac*N`v9}=)`}PNTq_Jj8enP%UWqpI5 zQpys-B7OfEK`~tY(CwqKR$!;pWnVmJUw&PKnB=<)q~lm|l0! zsChE+wEl6uG3d#Y)a#2OOW>Y6sZl-D#RoM19Xy9uq`^=@jcNG{W=;d~k|)8o+_u3D zIyfDhQK>o5$tvx^)%Tolai6}uX!uq=*$`~K^@qPz6U+G^&WsBpCSh;d^g7smb2z-$ zt+y(J{$k$B6u9jXGP9j%8Zlf{r2gc+rF1$ft-IH|eAlMYnd4RZYv6`Q=9sMoOqeU( zvGh%8N%_Gyt%jv}OC!gzw|gPr>FHU$`kr;N4!Mx*T}riXt50<}-}4@(yeA~xcDmElx&$ROXhV!Ua+AV}!kG3oH^?3VK3+2w zt*up;!KSha_jDBA5aI89rs3<^klHsk!puLO6WbomA>W2AyjcD^@N?#8|6CTVe(w@l zC*;YnLTg~DXaV?(@>kr(a(n@T$AL$?rJe!ZkXUdI?2<{c%>9CRth_~Ae4n~d{JJ<7 zVWg@&nl%$bH8{@lv^TNGxvCH5s&WNT4C)=J-8-|SB>T`|lIG7N#&kMnAbgtd0_ZB4FZ4hYMI|$le z=Ym|J7|hs*CIwdWrO*0RPIR{VsHJL{Ml0sx@`0KmHl0D#6gT~`2rz^4Gf>PrAX;WGfh<&)yrp#=cAdg^LC zHxHg(qf@J0CIbJ2l-KU7kg`d0`Wv6JHl+bNF9Pmsh7A2my9*RWVa!)Q=azq7jgFzY zI5|0;e8^qSN?b;*WSibfPZdf(ErlX3%c6kyo3iXWjOIp44sPQ3+eX+wwHj)`vwwH# z=b<{UXPc?zVY6W&6ZT&k|6Ttf@E-#IA@Cmp{~_=n0{5=+G7>57_XBr@MZKkyoQl`=nEcvr2YpjN0}2(A~+S1WYhKa>8ac?LXC?g7Rh zLIZ}Ru?-E_hRm>xt%s=K()T2hc{Cpu?$J6&J1{=^6n&syZlotBj6AHS@<>(ta1o*y zT@1KUOmvM9%Hyf0=@k&TCpRSIP#lpWQIm zu+|;#C!_xDr7SLhV%;1&q|s$)R&GB~F6Pn1Yfs_HUnT)*g&~(TdBL*Q>n16 zFg?Rwf5~bj*sO=2&H1r$p`D_Pj1)v1_N4QZ>Gqn$MXno}Sy=;vC+#fZSl;`fPGg%t z{ZT$%fbVd}YhNFpqYN9QWHsvHYXW%)&6E$`^=4zhYhT|=u8rI@uRd}cZNQ>29{9o> zfk!^m7Up((oM~n~K%R$--W98XWOOV#yDI7>XlbgfD$NuRx-Kj{MW`k{Tz^Q)(Qt8g zCR@Vx*jZ*6A4pu)j$_+%y>D%JoXoF!WON7$**=v3o0gM>KL;pQj;vb%!C(DkxB?|C zrKGrc6Y-1r!XD!_@{M)6(`mqdV82?BduqUHkHI0%s2HCB6!j>>M1Hwlr5`B^-FOsdsYq;T}o=5j1&i=23(9b zD6_Rhco(Cc8uLUbr$H*TjTm}Hva71l#n;K#3dw*?O}H#;)BNG4r{AraTMtqQjDD_R zIsifncl+1;u5+J}1qq_%!+IL~Lx$^e?KP+uQyJ@X#}rEn>><&vYA&rB9a};tv;;|9 zl#&6;7|O#vf_%(k`D(zXBd0h|067YlcOwc@{E<12Qpc+^2OFo;^tV;rr&CVQ9!Bz5 zxHY~`;)6ql*~E|mp<}eK=JguNP~JF|>W3Q@arJ>eM4(Uk3AS-s(tDfOqoerr=Wu<*)|0frkmDqZ4s>1!-s=OoIL z1Ep5tRN^FETi2ain6)VDA}SxSAC#h`&r#5H@v6l6z{{X{HW71)AZ#GV6XSd*iOC2S zCE5n#CvO;McRt#~!-J`)-d%!L@t9baLm0&Z*UT#u+YHR~40{aWcx1P{<#R&;S0DVt zc|I+(1PQn9J8p@{+W@RJy)`(`s^yP=0_xUTY@SCb^Jg#tkJcK$gC3TfAT1QXU+<(AuBvv1_ zTUXR~=Y4F(VNG-iI*zIOG+kDf7ho~yES23~W{eZn6O)htfX~Tbd&p$~z{d%l?H?pz zve7?I5fjd}GsJi!{OedXW(+!Hiljv!F69t33%66AqfqzmCV1mTD3!M9YECXTE_t*6 zD1G>3Dt3Y7wZg=DnG|nqYYG${-)W^YwI27XI!J!l{=!sw zJhnWe-y#D1<|mBJssVX$n)dLW2gXPoo}m7)BBM+MYAN&lNDq)oxDu}%Sl7~TTbB4z z*h7H)xTCYKpRYvIP(I5V4}!>5Z#$u58?yD_+l63__EEom(~EcGr(rv`u!AS9o6h_x z`T<7-t2sUeND^n2>tLgh=F93FKaruxWs0F~K0KG*2<(@2?;Nwo5iKcRklnZPWv(CG z^r`>Q_LY*7i(vfgHm4f;atao%D zTS`ZBI8Un6NAW6{;M5~STebl<`vLjR5`Lokd9xeUvI4rgz~0N06l}&h_QtK1>b*6} z$c8QldpAYmV~%omqs{|#4Vf*;&ZI7~YCm^^n75X1Z(euv}b z>EW|R8D_c1KL@H`N*U`@i@t4cuJ8LSQ!hOlyQox#?qC)Dz^WcUj!ZKfm{Qh{2UVJL z2z-3WSy~eh;+jaSLN|oziIvMYW~J*n+iT0XPmkMA3!>1PPs%!oUnk}#h zlp+DEbz;8Rx(0hPx7t8H@y)9A$Yz={aV^(?Krjn3;TYm}y7bj75`9I!UI3+Iy((

9p!L2AE;6j|TJSg}=sfmX@zJp-uM} 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 XH)a0W8}&@`_ushgEZ23eggy8_)_Dt! literal 0 HcmV?d00001 diff --git a/tasks/dungeon/assets/assets_dungeon_ui.py b/tasks/dungeon/assets/assets_dungeon_ui.py index 7d6007a7e..d70a8e5b3 100644 --- a/tasks/dungeon/assets/assets_dungeon_ui.py +++ b/tasks/dungeon/assets/assets_dungeon_ui.py @@ -63,6 +63,16 @@ DAILY_TRAINING_LOADED = ButtonWrapper( button=(1143, 546, 1158, 561), ), ) +LIST_LOADED_CHECK = ButtonWrapper( + name='LIST_LOADED_CHECK', + share=Button( + file='./assets/share/dungeon/ui/LIST_LOADED_CHECK.png', + area=(576, 606, 951, 664), + search=(556, 586, 971, 684), + color=(180, 188, 195), + button=(576, 606, 951, 664), + ), +) OCR_DUNGEON_LIST = ButtonWrapper( name='OCR_DUNGEON_LIST', share=Button( diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 17bddbbb0..735b93481 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -1,5 +1,6 @@ import re +import cv2 import numpy as np from module.base.base import ModuleBase @@ -27,6 +28,7 @@ from tasks.dungeon.keywords import ( ) from tasks.dungeon.keywords.classes import DungeonEntrance from tasks.dungeon.state import DungeonState +from tasks.map.interact.aim import inrange from tasks.map.keywords import KEYWORDS_MAP_WORLD @@ -266,6 +268,28 @@ class DungeonUI(DungeonState): logger.info('Treasures lightward loaded (event locked)') return True + def _dungeon_wait_until_dungeon_list_loaded(self, skip_first_screenshot=True): + timeout = Timer(1, count=3).start() + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # End + if timeout.reached(): + logger.warning('Wait until dungeon list loaded timeout') + return False + + # Check if having any content + # List background: 254, guild border: 225 + r, g, b = cv2.split(self.image_crop(LIST_LOADED_CHECK)) + minimum = cv2.min(cv2.min(r, g), b) + minimum = inrange(minimum, lower=0, upper=180) + if minimum.size > 100: + logger.info('Dungeon list loaded') + break + def _dungeon_wait_until_echo_or_war_stabled(self, skip_first_screenshot=True): """ Returns: @@ -581,12 +605,15 @@ class DungeonUI(DungeonState): or dungeon.is_Cavern_of_Corrosion \ or dungeon.is_Echo_of_War: self._dungeon_nav_goto(dungeon) + self._dungeon_wait_until_dungeon_list_loaded() self._dungeon_insight(dungeon) self._dungeon_enter(dungeon) return True if dungeon.is_Calyx_Golden: self._dungeon_nav_goto(dungeon) + self._dungeon_wait_until_dungeon_list_loaded() self._dungeon_world_set(dungeon) + self._dungeon_wait_until_dungeon_list_loaded() self._dungeon_insight(dungeon) self._dungeon_enter(dungeon) return True From 519167492001c33b25b4c87ec12e41db8d9f546c Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 06:57:52 +0800 Subject: [PATCH 34/65] Fix: Entering calyx crimson --- config/template.json | 4 +- dev_tools/keyword_extract.py | 4 +- dev_tools/keywords/base.py | 8 +- dev_tools/keywords/dungeon_list.py | 23 +++++ module/config/argument/args.json | 20 ++-- module/config/config_generated.py | 8 +- module/config/config_updater.py | 4 +- module/config/i18n/en-US.json | 16 +-- module/config/i18n/es-ES.json | 16 +-- module/config/i18n/ja-JP.json | 16 +-- module/config/i18n/zh-CN.json | 16 +-- module/config/i18n/zh-TW.json | 16 +-- module/ocr/keyword.py | 2 +- tasks/dungeon/keywords/dungeon.py | 158 ++++++++++++++--------------- tasks/dungeon/ui.py | 31 +++++- 15 files changed, 197 insertions(+), 145 deletions(-) diff --git a/config/template.json b/config/template.json index f930c95aa..8661bc5e7 100644 --- a/config/template.json +++ b/config/template.json @@ -47,8 +47,8 @@ "Team": 1 }, "DungeonDaily": { - "CalyxGolden": "Calyx_Golden_Treasures", - "CalyxCrimson": "Calyx_Crimson_Erudition", + "CalyxGolden": "Calyx_Golden_Treasures_Jarilo_VI", + "CalyxCrimson": "Calyx_Crimson_Destruction_Herta_StorageZone", "StagnantShadow": "Stagnant_Shadow_Quanta", "CavernOfCorrosion": "Cavern_of_Corrosion_Path_of_Providence" }, diff --git a/dev_tools/keyword_extract.py b/dev_tools/keyword_extract.py index 8a1cb3378..b42a0bec1 100644 --- a/dev_tools/keyword_extract.py +++ b/dev_tools/keyword_extract.py @@ -566,6 +566,8 @@ class KeywordExtract: self.load_keywords(['领取', '追踪']) self.write_keywords(keyword_class='BattlePassQuestState', output_file='./tasks/battle_pass/keywords/quest_state.py') + self.generate_map_planes() + self.generate_character_keywords() from dev_tools.keywords.dungeon_list import GenerateDungeonList GenerateDungeonList()() self.load_keywords(['进入', '传送', '追踪']) @@ -578,8 +580,6 @@ class KeywordExtract: output_file='./tasks/battle_pass/keywords/mission_tab.py') self.generate_assignments() self.generate_forgotten_hall_stages() - self.generate_map_planes() - self.generate_character_keywords() self.generate_daily_quests() self.generate_battle_pass_quests() self.load_keywords(['养成材料', '光锥', '遗器', '其他材料', '消耗品', '任务', '贵重物']) diff --git a/dev_tools/keywords/base.py b/dev_tools/keywords/base.py index cc71b7f55..c8804f49e 100644 --- a/dev_tools/keywords/base.py +++ b/dev_tools/keywords/base.py @@ -146,6 +146,11 @@ class GenerateKeyword: def convert_name(self, text: str, keyword: dict) -> str: return text_to_variable(text) + def iter_rows(self) -> t.Iterable[dict]: + for keyword in self.iter_keywords(): + keyword = self.format_keywords(keyword) + yield keyword + def format_keywords(self, keyword: dict) -> dict | None: base = self.keyword_format.copy() text_id = keyword.pop('text_id') @@ -170,8 +175,7 @@ class GenerateKeyword: self.gen_import() self.gen.CommentAutoGenerage('dev_tools.keyword_extract') - for keyword in self.iter_keywords(): - keyword = self.format_keywords(keyword) + for keyword in self.iter_rows(): with self.gen.Object(key=keyword['name'], object_class=self.keyword_class): for key, value in keyword.items(): self.gen.ObjectAttr(key, value) diff --git a/dev_tools/keywords/dungeon_list.py b/dev_tools/keywords/dungeon_list.py index 5de6b45b2..334331b4d 100644 --- a/dev_tools/keywords/dungeon_list.py +++ b/dev_tools/keywords/dungeon_list.py @@ -72,3 +72,26 @@ class GenerateDungeonList(GenerateKeyword): plane = MapPlane.find_plane_id(keyword['plane_id']) text = f'{text}_{plane.name}' return text + + def iter_rows(self) -> t.Iterable[dict]: + dungeons = list(super().iter_rows()) + calyx = [] + order = [ + 'Calyx_Golden', + 'Calyx_Crimson_Destruction', + 'Calyx_Crimson_Preservation', + 'Calyx_Crimson_The_Hunt', + 'Calyx_Crimson_Abundance', + 'Calyx_Crimson_Erudition', + 'Calyx_Crimson_Harmony', + 'Calyx_Crimson_Nihility', + ] + for keyword in order: + condition = lambda x: x['name'].startswith(keyword) + print([d for d in dungeons]) + calyx += [d for d in dungeons if condition(d)] + dungeons = [d for d in dungeons if not condition(d)] + dungeons = calyx + dungeons + + for row in dungeons: + yield row diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 9ccf50ce5..ce370b787 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -204,14 +204,14 @@ "Calyx_Golden_Treasures_Penacony", "Calyx_Crimson_Destruction_Herta_StorageZone", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape", + "Calyx_Crimson_Preservation_Herta_SupplyZone", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass", "Calyx_Crimson_Erudition_Jarilo_RivetTown", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape", "Calyx_Crimson_Nihility_Jarilo_GreatMine", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission", - "Calyx_Crimson_Preservation_Herta_SupplyZone", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass", "Stagnant_Shadow_Spike", "Stagnant_Shadow_Perdition", "Stagnant_Shadow_Blaze", @@ -255,14 +255,14 @@ "Calyx_Golden_Treasures_Penacony", "Calyx_Crimson_Destruction_Herta_StorageZone", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape", + "Calyx_Crimson_Preservation_Herta_SupplyZone", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass", "Calyx_Crimson_Erudition_Jarilo_RivetTown", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape", "Calyx_Crimson_Nihility_Jarilo_GreatMine", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission", - "Calyx_Crimson_Preservation_Herta_SupplyZone", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission" ] }, "NameAtDoubleRelic": { @@ -300,7 +300,7 @@ "DungeonDaily": { "CalyxGolden": { "type": "select", - "value": "Calyx_Golden_Treasures", + "value": "Calyx_Golden_Treasures_Jarilo_VI", "option": [ "do_not_achieve", "Calyx_Golden_Memories_Jarilo_VI", @@ -316,19 +316,19 @@ }, "CalyxCrimson": { "type": "select", - "value": "Calyx_Crimson_Erudition", + "value": "Calyx_Crimson_Destruction_Herta_StorageZone", "option": [ "do_not_achieve", "Calyx_Crimson_Destruction_Herta_StorageZone", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape", + "Calyx_Crimson_Preservation_Herta_SupplyZone", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass", "Calyx_Crimson_Erudition_Jarilo_RivetTown", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape", "Calyx_Crimson_Nihility_Jarilo_GreatMine", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission", - "Calyx_Crimson_Preservation_Herta_SupplyZone", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission" ] }, "StagnantShadow": { diff --git a/module/config/config_generated.py b/module/config/config_generated.py index c86f6f7cc..b3e344ea7 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -40,14 +40,14 @@ class GeneratedConfig: Optimization_WhenTaskQueueEmpty = 'goto_main' # stay_there, goto_main, close_game # Group `Dungeon` - Dungeon_Name = 'Calyx_Golden_Treasures' # Calyx_Golden_Memories_Jarilo_VI, Calyx_Golden_Memories_The_Xianzhou_Luofu, Calyx_Golden_Memories_Penacony, Calyx_Golden_Aether_Jarilo_VI, Calyx_Golden_Aether_The_Xianzhou_Luofu, Calyx_Golden_Aether_Penacony, Calyx_Golden_Treasures_Jarilo_VI, Calyx_Golden_Treasures_The_Xianzhou_Luofu, Calyx_Golden_Treasures_Penacony, Calyx_Crimson_Destruction_Herta_StorageZone, Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Harmony_Jarilo_RobotSettlement, Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape, Calyx_Crimson_Nihility_Jarilo_GreatMine, Calyx_Crimson_Nihility_Luofu_AlchemyCommission, Calyx_Crimson_Preservation_Herta_SupplyZone, Calyx_Crimson_Abundance_Jarilo_BackwaterPass, Stagnant_Shadow_Spike, Stagnant_Shadow_Perdition, Stagnant_Shadow_Blaze, Stagnant_Shadow_Scorch, Stagnant_Shadow_Rime, Stagnant_Shadow_Icicle, Stagnant_Shadow_Nectar, Stagnant_Shadow_Fulmination, Stagnant_Shadow_Doom, Stagnant_Shadow_Gust, Stagnant_Shadow_Celestial, Stagnant_Shadow_Quanta, Stagnant_Shadow_Abomination, Stagnant_Shadow_Roast, Stagnant_Shadow_Mirage, Stagnant_Shadow_Puppetry, Cavern_of_Corrosion_Path_of_Gelid_Wind, Cavern_of_Corrosion_Path_of_Jabbing_Punch, Cavern_of_Corrosion_Path_of_Drifting, Cavern_of_Corrosion_Path_of_Providence, Cavern_of_Corrosion_Path_of_Holy_Hymn, Cavern_of_Corrosion_Path_of_Conflagration, Cavern_of_Corrosion_Path_of_Elixir_Seekers, Cavern_of_Corrosion_Path_of_Darkness, Cavern_of_Corrosion_Path_of_Dreamdive - Dungeon_NameAtDoubleCalyx = 'Calyx_Golden_Treasures' # do_not_participate, Calyx_Golden_Memories_Jarilo_VI, Calyx_Golden_Memories_The_Xianzhou_Luofu, Calyx_Golden_Memories_Penacony, Calyx_Golden_Aether_Jarilo_VI, Calyx_Golden_Aether_The_Xianzhou_Luofu, Calyx_Golden_Aether_Penacony, Calyx_Golden_Treasures_Jarilo_VI, Calyx_Golden_Treasures_The_Xianzhou_Luofu, Calyx_Golden_Treasures_Penacony, Calyx_Crimson_Destruction_Herta_StorageZone, Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Harmony_Jarilo_RobotSettlement, Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape, Calyx_Crimson_Nihility_Jarilo_GreatMine, Calyx_Crimson_Nihility_Luofu_AlchemyCommission, Calyx_Crimson_Preservation_Herta_SupplyZone, Calyx_Crimson_Abundance_Jarilo_BackwaterPass + Dungeon_Name = 'Calyx_Golden_Treasures' # Calyx_Golden_Memories_Jarilo_VI, Calyx_Golden_Memories_The_Xianzhou_Luofu, Calyx_Golden_Memories_Penacony, Calyx_Golden_Aether_Jarilo_VI, Calyx_Golden_Aether_The_Xianzhou_Luofu, Calyx_Golden_Aether_Penacony, Calyx_Golden_Treasures_Jarilo_VI, Calyx_Golden_Treasures_The_Xianzhou_Luofu, Calyx_Golden_Treasures_Penacony, Calyx_Crimson_Destruction_Herta_StorageZone, Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape, Calyx_Crimson_Preservation_Herta_SupplyZone, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_Abundance_Jarilo_BackwaterPass, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Harmony_Jarilo_RobotSettlement, Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape, Calyx_Crimson_Nihility_Jarilo_GreatMine, Calyx_Crimson_Nihility_Luofu_AlchemyCommission, Stagnant_Shadow_Spike, Stagnant_Shadow_Perdition, Stagnant_Shadow_Blaze, Stagnant_Shadow_Scorch, Stagnant_Shadow_Rime, Stagnant_Shadow_Icicle, Stagnant_Shadow_Nectar, Stagnant_Shadow_Fulmination, Stagnant_Shadow_Doom, Stagnant_Shadow_Gust, Stagnant_Shadow_Celestial, Stagnant_Shadow_Quanta, Stagnant_Shadow_Abomination, Stagnant_Shadow_Roast, Stagnant_Shadow_Mirage, Stagnant_Shadow_Puppetry, Cavern_of_Corrosion_Path_of_Gelid_Wind, Cavern_of_Corrosion_Path_of_Jabbing_Punch, Cavern_of_Corrosion_Path_of_Drifting, Cavern_of_Corrosion_Path_of_Providence, Cavern_of_Corrosion_Path_of_Holy_Hymn, Cavern_of_Corrosion_Path_of_Conflagration, Cavern_of_Corrosion_Path_of_Elixir_Seekers, Cavern_of_Corrosion_Path_of_Darkness, Cavern_of_Corrosion_Path_of_Dreamdive + Dungeon_NameAtDoubleCalyx = 'Calyx_Golden_Treasures' # do_not_participate, Calyx_Golden_Memories_Jarilo_VI, Calyx_Golden_Memories_The_Xianzhou_Luofu, Calyx_Golden_Memories_Penacony, Calyx_Golden_Aether_Jarilo_VI, Calyx_Golden_Aether_The_Xianzhou_Luofu, Calyx_Golden_Aether_Penacony, Calyx_Golden_Treasures_Jarilo_VI, Calyx_Golden_Treasures_The_Xianzhou_Luofu, Calyx_Golden_Treasures_Penacony, Calyx_Crimson_Destruction_Herta_StorageZone, Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape, Calyx_Crimson_Preservation_Herta_SupplyZone, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_Abundance_Jarilo_BackwaterPass, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Harmony_Jarilo_RobotSettlement, Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape, Calyx_Crimson_Nihility_Jarilo_GreatMine, Calyx_Crimson_Nihility_Luofu_AlchemyCommission Dungeon_NameAtDoubleRelic = 'Cavern_of_Corrosion_Path_of_Providence' # do_not_participate, Cavern_of_Corrosion_Path_of_Gelid_Wind, Cavern_of_Corrosion_Path_of_Jabbing_Punch, Cavern_of_Corrosion_Path_of_Drifting, Cavern_of_Corrosion_Path_of_Providence, Cavern_of_Corrosion_Path_of_Holy_Hymn, Cavern_of_Corrosion_Path_of_Conflagration, Cavern_of_Corrosion_Path_of_Elixir_Seekers, Cavern_of_Corrosion_Path_of_Darkness, Cavern_of_Corrosion_Path_of_Dreamdive Dungeon_Team = 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9 # Group `DungeonDaily` - DungeonDaily_CalyxGolden = 'Calyx_Golden_Treasures' # do_not_achieve, Calyx_Golden_Memories_Jarilo_VI, Calyx_Golden_Memories_The_Xianzhou_Luofu, Calyx_Golden_Memories_Penacony, Calyx_Golden_Aether_Jarilo_VI, Calyx_Golden_Aether_The_Xianzhou_Luofu, Calyx_Golden_Aether_Penacony, Calyx_Golden_Treasures_Jarilo_VI, Calyx_Golden_Treasures_The_Xianzhou_Luofu, Calyx_Golden_Treasures_Penacony - DungeonDaily_CalyxCrimson = 'Calyx_Crimson_Erudition' # do_not_achieve, Calyx_Crimson_Destruction_Herta_StorageZone, Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Harmony_Jarilo_RobotSettlement, Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape, Calyx_Crimson_Nihility_Jarilo_GreatMine, Calyx_Crimson_Nihility_Luofu_AlchemyCommission, Calyx_Crimson_Preservation_Herta_SupplyZone, Calyx_Crimson_Abundance_Jarilo_BackwaterPass + DungeonDaily_CalyxGolden = 'Calyx_Golden_Treasures_Jarilo_VI' # do_not_achieve, Calyx_Golden_Memories_Jarilo_VI, Calyx_Golden_Memories_The_Xianzhou_Luofu, Calyx_Golden_Memories_Penacony, Calyx_Golden_Aether_Jarilo_VI, Calyx_Golden_Aether_The_Xianzhou_Luofu, Calyx_Golden_Aether_Penacony, Calyx_Golden_Treasures_Jarilo_VI, Calyx_Golden_Treasures_The_Xianzhou_Luofu, Calyx_Golden_Treasures_Penacony + DungeonDaily_CalyxCrimson = 'Calyx_Crimson_Destruction_Herta_StorageZone' # do_not_achieve, Calyx_Crimson_Destruction_Herta_StorageZone, Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape, Calyx_Crimson_Preservation_Herta_SupplyZone, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_Abundance_Jarilo_BackwaterPass, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Harmony_Jarilo_RobotSettlement, Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape, Calyx_Crimson_Nihility_Jarilo_GreatMine, Calyx_Crimson_Nihility_Luofu_AlchemyCommission DungeonDaily_StagnantShadow = 'Stagnant_Shadow_Quanta' # do_not_achieve, Stagnant_Shadow_Spike, Stagnant_Shadow_Perdition, Stagnant_Shadow_Blaze, Stagnant_Shadow_Scorch, Stagnant_Shadow_Rime, Stagnant_Shadow_Icicle, Stagnant_Shadow_Nectar, Stagnant_Shadow_Fulmination, Stagnant_Shadow_Doom, Stagnant_Shadow_Gust, Stagnant_Shadow_Celestial, Stagnant_Shadow_Quanta, Stagnant_Shadow_Abomination, Stagnant_Shadow_Roast, Stagnant_Shadow_Mirage, Stagnant_Shadow_Puppetry DungeonDaily_CavernOfCorrosion = 'Cavern_of_Corrosion_Path_of_Providence' # do_not_achieve, Cavern_of_Corrosion_Path_of_Gelid_Wind, Cavern_of_Corrosion_Path_of_Jabbing_Punch, Cavern_of_Corrosion_Path_of_Drifting, Cavern_of_Corrosion_Path_of_Providence, Cavern_of_Corrosion_Path_of_Holy_Hymn, Cavern_of_Corrosion_Path_of_Conflagration, Cavern_of_Corrosion_Path_of_Elixir_Seekers, Cavern_of_Corrosion_Path_of_Darkness, Cavern_of_Corrosion_Path_of_Dreamdive diff --git a/module/config/config_updater.py b/module/config/config_updater.py index 732e16152..2cad4afb8 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -70,8 +70,8 @@ class ConfigGenerator: + [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Calyx_Golden_Treasures] # calyx_crimson from tasks.rogue.keywords import KEYWORDS_ROGUE_PATH as Path - order = [Path.Destruction, Path.The_Hunt, Path.Erudition, Path.The_Harmony, - Path.Nihility, Path.Preservation, Path.Abundance] + order = [Path.Destruction, Path.Preservation, Path.The_Hunt, Path.Abundance, + Path.Erudition, Path.The_Harmony, Path.Nihility] calyx_crimson = [] for path in order: calyx_crimson += [dungeon.name for dungeon in DungeonList.instances.values() diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 10809c95d..33b6d024b 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -234,14 +234,14 @@ "Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures (Penacony))", "Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Trace: Destruction (Scalegorge Waterscape)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Trace: The Hunt (Outlying Snow Plains)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Trace: Abundance (Backwater Pass)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Trace: Erudition (Rivet Town)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Trace: The Harmony (Robot Settlement)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Trace: The Harmony (The Reverie (Dreamscape))", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Trace: Nihility (Great Mine)", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Trace: Nihility (Alchemy Commission)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Trace: Abundance (Backwater Pass)", "Stagnant_Shadow_Spike": "Ascension: Physical (Natasha / Clara / Luka / Sushang)", "Stagnant_Shadow_Perdition": "Ascension: Physical (Hanya / Argenti)", "Stagnant_Shadow_Blaze": "Ascension: Fire (Himeko / Asta / Hook)", @@ -283,14 +283,14 @@ "Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures (Penacony))", "Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Trace: Destruction (Scalegorge Waterscape)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Trace: The Hunt (Outlying Snow Plains)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Trace: Abundance (Backwater Pass)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Trace: Erudition (Rivet Town)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Trace: The Harmony (Robot Settlement)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Trace: The Harmony (The Reverie (Dreamscape))", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Trace: Nihility (Great Mine)", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Trace: Nihility (Alchemy Commission)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Trace: Abundance (Backwater Pass)" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Trace: Nihility (Alchemy Commission)" }, "NameAtDoubleRelic": { "name": "At Double Relic Event, choose dungeon", @@ -345,14 +345,14 @@ "do_not_achieve": "Don't Do This Quest", "Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Trace: Destruction (Scalegorge Waterscape)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Trace: The Hunt (Outlying Snow Plains)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Trace: Abundance (Backwater Pass)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Trace: Erudition (Rivet Town)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Trace: The Harmony (Robot Settlement)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Trace: The Harmony (The Reverie (Dreamscape))", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Trace: Nihility (Great Mine)", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Trace: Nihility (Alchemy Commission)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Trace: Abundance (Backwater Pass)" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Trace: Nihility (Alchemy Commission)" }, "StagnantShadow": { "name": "Clear Stagnant Shadow 1 times", diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index e3a2f2659..7cf46d0fd 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -234,14 +234,14 @@ "Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros (Colonipenal))", "Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Rastros: Destrucción (Desfiladero de Escamas)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Rastros: Cacería (Llanuras nevadas de las afueras)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Rastros: Abundancia (Paso del Remanso)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Rastros: Erudición (Villarremache)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Rastros: Armonía (Asentamiento robot)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Rastros: Armonía (Hotel Fantasía (paisaje onírico))", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Rastros: Nihilidad (Mina principal)", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Rastros: Nihilidad (Comisión de Alquimia)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Rastros: Abundancia (Paso del Remanso)", "Stagnant_Shadow_Spike": "Ascension: Físico (Natasha / Clara / Luka / Sushang)", "Stagnant_Shadow_Perdition": "Ascension: Físico (Hanya / Argenti)", "Stagnant_Shadow_Blaze": "Ascension: Fuego (Himeko / Asta / Hook)", @@ -283,14 +283,14 @@ "Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros (Colonipenal))", "Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Rastros: Destrucción (Desfiladero de Escamas)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Rastros: Cacería (Llanuras nevadas de las afueras)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Rastros: Abundancia (Paso del Remanso)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Rastros: Erudición (Villarremache)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Rastros: Armonía (Asentamiento robot)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Rastros: Armonía (Hotel Fantasía (paisaje onírico))", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Rastros: Nihilidad (Mina principal)", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Rastros: Nihilidad (Comisión de Alquimia)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Rastros: Abundancia (Paso del Remanso)" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Rastros: Nihilidad (Comisión de Alquimia)" }, "NameAtDoubleRelic": { "name": "En los eventos de x2 de Caverna de la corrosión", @@ -345,14 +345,14 @@ "do_not_achieve": "No hacer esta misión", "Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Rastros: Destrucción (Desfiladero de Escamas)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "Rastros: Cacería (Llanuras nevadas de las afueras)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Rastros: Abundancia (Paso del Remanso)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "Rastros: Erudición (Villarremache)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "Rastros: Armonía (Asentamiento robot)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "Rastros: Armonía (Hotel Fantasía (paisaje onírico))", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "Rastros: Nihilidad (Mina principal)", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Rastros: Nihilidad (Comisión de Alquimia)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "Rastros: Abundancia (Paso del Remanso)" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Rastros: Nihilidad (Comisión de Alquimia)" }, "StagnantShadow": { "name": "Completar Sombra paralizada 1 vez", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 79dada7a5..702f46fb8 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -234,14 +234,14 @@ "Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾・ピノコニー)", "Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "軌跡素材:壊滅(鱗淵境)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "軌跡素材:巡狩(郊外雪原)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "軌跡素材:豊穣(外縁通路)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "軌跡素材:知恵(リベットタウン)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "軌跡素材:調和(機械集落)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "軌跡素材:調和(ホテル・レバリー-夢境)", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "軌跡素材:虚無(大鉱区)", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "軌跡素材:虚無(丹鼎司)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "軌跡素材:豊穣(外縁通路)", "Stagnant_Shadow_Spike": "キャラクター昇格素材:物理(ナターシャ / クラーラ / ルカ / 素裳)", "Stagnant_Shadow_Perdition": "キャラクター昇格素材:物理(寒鴉 / アルジェンティ)", "Stagnant_Shadow_Blaze": "キャラクター昇格素材:炎(姫子 / アスター / フック)", @@ -283,14 +283,14 @@ "Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾・ピノコニー)", "Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "軌跡素材:壊滅(鱗淵境)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "軌跡素材:巡狩(郊外雪原)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "軌跡素材:豊穣(外縁通路)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "軌跡素材:知恵(リベットタウン)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "軌跡素材:調和(機械集落)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "軌跡素材:調和(ホテル・レバリー-夢境)", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "軌跡素材:虚無(大鉱区)", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "軌跡素材:虚無(丹鼎司)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "軌跡素材:豊穣(外縁通路)" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "軌跡素材:虚無(丹鼎司)" }, "NameAtDoubleRelic": { "name": "Dungeon.NameAtDoubleRelic.name", @@ -345,14 +345,14 @@ "do_not_achieve": "do_not_achieve", "Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "軌跡素材:壊滅(鱗淵境)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "軌跡素材:巡狩(郊外雪原)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "軌跡素材:豊穣(外縁通路)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "軌跡素材:知恵(リベットタウン)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "軌跡素材:調和(機械集落)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "軌跡素材:調和(ホテル・レバリー-夢境)", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "軌跡素材:虚無(大鉱区)", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "軌跡素材:虚無(丹鼎司)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "軌跡素材:豊穣(外縁通路)" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "軌跡素材:虚無(丹鼎司)" }, "StagnantShadow": { "name": "DungeonDaily.StagnantShadow.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 74d0f8d08..5e30b606d 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -234,14 +234,14 @@ "Calyx_Golden_Treasures_Penacony": "材料:信用点(藏珍之蕾•匹诺康尼)", "Calyx_Crimson_Destruction_Herta_StorageZone": "行迹材料:毁灭(收容舱段)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行迹材料:毁灭(鳞渊境)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行迹材料:巡猎(城郊雪原)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行迹材料:丰饶(边缘通路)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行迹材料:智识(铆钉镇)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行迹材料:同谐(机械聚落)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行迹材料:同谐(白日梦酒店-梦境)", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行迹材料:虚无(大矿区)", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行迹材料:虚无(丹鼎司)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行迹材料:丰饶(边缘通路)", "Stagnant_Shadow_Spike": "角色晋阶材料:物理(娜塔莎 / 克拉拉 / 卢卡 / 素裳)", "Stagnant_Shadow_Perdition": "角色晋阶材料:物理(寒鸦 / 银枝)", "Stagnant_Shadow_Blaze": "角色晋阶材料:火(姬子 / 艾丝妲 / 虎克)", @@ -283,14 +283,14 @@ "Calyx_Golden_Treasures_Penacony": "材料:信用点(藏珍之蕾•匹诺康尼)", "Calyx_Crimson_Destruction_Herta_StorageZone": "行迹材料:毁灭(收容舱段)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行迹材料:毁灭(鳞渊境)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行迹材料:巡猎(城郊雪原)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行迹材料:丰饶(边缘通路)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行迹材料:智识(铆钉镇)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行迹材料:同谐(机械聚落)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行迹材料:同谐(白日梦酒店-梦境)", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行迹材料:虚无(大矿区)", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行迹材料:虚无(丹鼎司)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行迹材料:丰饶(边缘通路)" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行迹材料:虚无(丹鼎司)" }, "NameAtDoubleRelic": { "name": "有遗器活动时,选择副本", @@ -345,14 +345,14 @@ "do_not_achieve": "不完成这个任务", "Calyx_Crimson_Destruction_Herta_StorageZone": "行迹材料:毁灭(收容舱段)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行迹材料:毁灭(鳞渊境)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行迹材料:巡猎(城郊雪原)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行迹材料:丰饶(边缘通路)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行迹材料:智识(铆钉镇)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行迹材料:同谐(机械聚落)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行迹材料:同谐(白日梦酒店-梦境)", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行迹材料:虚无(大矿区)", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行迹材料:虚无(丹鼎司)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行迹材料:丰饶(边缘通路)" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行迹材料:虚无(丹鼎司)" }, "StagnantShadow": { "name": "完成1次凝滞虚影", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 20df243c7..5ff9247a2 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -234,14 +234,14 @@ "Calyx_Golden_Treasures_Penacony": "材料:信用點(藏珍之蕾•匹諾康尼)", "Calyx_Crimson_Destruction_Herta_StorageZone": "行跡材料:毀滅(收容艙段)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行跡材料:毀滅(鱗淵境)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行跡材料:巡獵(城郊雪原)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行跡材料:豐饒(邊緣通道)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行跡材料:智識(鉚釘鎮)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行跡材料:同諧(機械聚落)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行跡材料:同諧(白日夢飯店-夢境)", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行跡材料:虛無(大礦區)", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行跡材料:虛無(丹鼎司)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行跡材料:豐饒(邊緣通道)", "Stagnant_Shadow_Spike": "角色晉階材料:物理(娜塔莎 / 克拉拉 / 盧卡 / 素裳)", "Stagnant_Shadow_Perdition": "角色晉階材料:物理(寒鴉 / 銀枝)", "Stagnant_Shadow_Blaze": "角色晉階材料:火(姬子 / 艾絲妲 / 虎克)", @@ -283,14 +283,14 @@ "Calyx_Golden_Treasures_Penacony": "材料:信用點(藏珍之蕾•匹諾康尼)", "Calyx_Crimson_Destruction_Herta_StorageZone": "行跡材料:毀滅(收容艙段)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行跡材料:毀滅(鱗淵境)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行跡材料:巡獵(城郊雪原)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行跡材料:豐饒(邊緣通道)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行跡材料:智識(鉚釘鎮)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行跡材料:同諧(機械聚落)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行跡材料:同諧(白日夢飯店-夢境)", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行跡材料:虛無(大礦區)", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行跡材料:虛無(丹鼎司)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行跡材料:豐饒(邊緣通道)" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行跡材料:虛無(丹鼎司)" }, "NameAtDoubleRelic": { "name": "有遺器活動時,選擇副本", @@ -345,14 +345,14 @@ "do_not_achieve": "不完成這個任務", "Calyx_Crimson_Destruction_Herta_StorageZone": "行跡材料:毀滅(收容艙段)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行跡材料:毀滅(鱗淵境)", + "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", "Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains": "行跡材料:巡獵(城郊雪原)", + "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行跡材料:豐饒(邊緣通道)", "Calyx_Crimson_Erudition_Jarilo_RivetTown": "行跡材料:智識(鉚釘鎮)", "Calyx_Crimson_Harmony_Jarilo_RobotSettlement": "行跡材料:同諧(機械聚落)", "Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape": "行跡材料:同諧(白日夢飯店-夢境)", "Calyx_Crimson_Nihility_Jarilo_GreatMine": "行跡材料:虛無(大礦區)", - "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行跡材料:虛無(丹鼎司)", - "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", - "Calyx_Crimson_Abundance_Jarilo_BackwaterPass": "行跡材料:豐饒(邊緣通道)" + "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行跡材料:虛無(丹鼎司)" }, "StagnantShadow": { "name": "完成1次凝滯虛影", diff --git a/module/ocr/keyword.py b/module/ocr/keyword.py index 4acfdc90e..e285674f2 100644 --- a/module/ocr/keyword.py +++ b/module/ocr/keyword.py @@ -7,7 +7,7 @@ import module.config.server as server from module.exception import ScriptError # ord('.') = 65294 -REGEX_PUNCTUATION = re.compile(r'[ ,..\'"“”,。…::;;!!??·・•*※\-—-/\\\n\t()\[\]()「」『』【】《》[]]') +REGEX_PUNCTUATION = re.compile(r'[ ,..\'"“”,。…::;;!!??·・•●〇*※\-—-/\\\n\t()\[\]()「」『』【】《》[]]') def parse_name(n): diff --git a/tasks/dungeon/keywords/dungeon.py b/tasks/dungeon/keywords/dungeon.py index 5bb82d5d8..855bb121e 100644 --- a/tasks/dungeon/keywords/dungeon.py +++ b/tasks/dungeon/keywords/dungeon.py @@ -33,76 +33,6 @@ Calyx_Golden_Treasures_Jarilo_VI = DungeonList( es='Flor de tesoros (Jarilo-VI)', plane_id=2012101, ) -Calyx_Crimson_Destruction_Herta_StorageZone = DungeonList( - id=4, - name='Calyx_Crimson_Destruction_Herta_StorageZone', - cn='毁灭之蕾•拟造花萼(赤)', - cht='毀滅之蕾•擬造花萼(赤)', - en='Bud of Destruction', - jp='疑似花萼(赤)・壊滅の蕾', - es='Flor de la Destrucción', - plane_id=2000201, -) -Calyx_Crimson_Preservation_Herta_SupplyZone = DungeonList( - id=5, - name='Calyx_Crimson_Preservation_Herta_SupplyZone', - cn='存护之蕾•拟造花萼(赤)', - cht='存護之蕾•擬造花萼(赤)', - en='Bud of Preservation', - jp='疑似花萼(赤)・存護の蕾', - es='Flor de la Conservación', - plane_id=2000301, -) -Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains = DungeonList( - id=6, - name='Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains', - cn='巡猎之蕾•拟造花萼(赤)', - cht='巡獵之蕾•擬造花萼(赤)', - en='Bud of The Hunt', - jp='疑似花萼(赤)・巡狩の蕾', - es='Flor de la Cacería', - plane_id=2010101, -) -Calyx_Crimson_Abundance_Jarilo_BackwaterPass = DungeonList( - id=7, - name='Calyx_Crimson_Abundance_Jarilo_BackwaterPass', - cn='丰饶之蕾•拟造花萼(赤)', - cht='豐饒之蕾•擬造花萼(赤)', - en='Bud of Abundance', - jp='疑似花萼(赤)・豊穣の蕾', - es='Flor de la Abundancia', - plane_id=2011101, -) -Calyx_Crimson_Erudition_Jarilo_RivetTown = DungeonList( - id=8, - name='Calyx_Crimson_Erudition_Jarilo_RivetTown', - cn='智识之蕾•拟造花萼(赤)', - cht='智識之蕾•擬造花萼(赤)', - en='Bud of Erudition', - jp='疑似花萼(赤)・知恵の蕾', - es='Flor de la Erudición', - plane_id=2012201, -) -Calyx_Crimson_Harmony_Jarilo_RobotSettlement = DungeonList( - id=9, - name='Calyx_Crimson_Harmony_Jarilo_RobotSettlement', - cn='同谐之蕾•拟造花萼(赤)', - cht='同諧之蕾•擬造花萼(赤)', - en='Bud of Harmony', - jp='疑似花萼(赤)・調和の蕾', - es='Flor de la Armonía', - plane_id=2012301, -) -Calyx_Crimson_Nihility_Jarilo_GreatMine = DungeonList( - id=10, - name='Calyx_Crimson_Nihility_Jarilo_GreatMine', - cn='虚无之蕾•拟造花萼(赤)', - cht='虛無之蕾•擬造花萼(赤)', - en='Bud of Nihility', - jp='疑似花萼(赤)・虚無の蕾', - es='Flor de la Nihilidad', - plane_id=2012101, -) Calyx_Golden_Memories_The_Xianzhou_Luofu = DungeonList( id=11, name='Calyx_Golden_Memories_The_Xianzhou_Luofu', @@ -163,15 +93,15 @@ Calyx_Golden_Treasures_Penacony = DungeonList( es='Flor de tesoros (Colonipenal)', plane_id=2031101, ) -Calyx_Crimson_Nihility_Luofu_AlchemyCommission = DungeonList( - id=17, - name='Calyx_Crimson_Nihility_Luofu_AlchemyCommission', - cn='虚无之蕾•拟造花萼(赤)', - cht='虛無之蕾•擬造花萼(赤)', - en='Bud of Nihility', - jp='疑似花萼(赤)・虚無の蕾', - es='Flor de la Nihilidad', - plane_id=2023101, +Calyx_Crimson_Destruction_Herta_StorageZone = DungeonList( + id=4, + name='Calyx_Crimson_Destruction_Herta_StorageZone', + cn='毁灭之蕾•拟造花萼(赤)', + cht='毀滅之蕾•擬造花萼(赤)', + en='Bud of Destruction', + jp='疑似花萼(赤)・壊滅の蕾', + es='Flor de la Destrucción', + plane_id=2000201, ) Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape = DungeonList( id=18, @@ -183,6 +113,56 @@ Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape = DungeonList( es='Flor de la Destrucción', plane_id=2023201, ) +Calyx_Crimson_Preservation_Herta_SupplyZone = DungeonList( + id=5, + name='Calyx_Crimson_Preservation_Herta_SupplyZone', + cn='存护之蕾•拟造花萼(赤)', + cht='存護之蕾•擬造花萼(赤)', + en='Bud of Preservation', + jp='疑似花萼(赤)・存護の蕾', + es='Flor de la Conservación', + plane_id=2000301, +) +Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains = DungeonList( + id=6, + name='Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains', + cn='巡猎之蕾•拟造花萼(赤)', + cht='巡獵之蕾•擬造花萼(赤)', + en='Bud of The Hunt', + jp='疑似花萼(赤)・巡狩の蕾', + es='Flor de la Cacería', + plane_id=2010101, +) +Calyx_Crimson_Abundance_Jarilo_BackwaterPass = DungeonList( + id=7, + name='Calyx_Crimson_Abundance_Jarilo_BackwaterPass', + cn='丰饶之蕾•拟造花萼(赤)', + cht='豐饒之蕾•擬造花萼(赤)', + en='Bud of Abundance', + jp='疑似花萼(赤)・豊穣の蕾', + es='Flor de la Abundancia', + plane_id=2011101, +) +Calyx_Crimson_Erudition_Jarilo_RivetTown = DungeonList( + id=8, + name='Calyx_Crimson_Erudition_Jarilo_RivetTown', + cn='智识之蕾•拟造花萼(赤)', + cht='智識之蕾•擬造花萼(赤)', + en='Bud of Erudition', + jp='疑似花萼(赤)・知恵の蕾', + es='Flor de la Erudición', + plane_id=2012201, +) +Calyx_Crimson_Harmony_Jarilo_RobotSettlement = DungeonList( + id=9, + name='Calyx_Crimson_Harmony_Jarilo_RobotSettlement', + cn='同谐之蕾•拟造花萼(赤)', + cht='同諧之蕾•擬造花萼(赤)', + en='Bud of Harmony', + jp='疑似花萼(赤)・調和の蕾', + es='Flor de la Armonía', + plane_id=2012301, +) Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape = DungeonList( id=19, name='Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape', @@ -193,6 +173,26 @@ Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape = DungeonList( es='Flor de la Armonía', plane_id=2031101, ) +Calyx_Crimson_Nihility_Jarilo_GreatMine = DungeonList( + id=10, + name='Calyx_Crimson_Nihility_Jarilo_GreatMine', + cn='虚无之蕾•拟造花萼(赤)', + cht='虛無之蕾•擬造花萼(赤)', + en='Bud of Nihility', + jp='疑似花萼(赤)・虚無の蕾', + es='Flor de la Nihilidad', + plane_id=2012101, +) +Calyx_Crimson_Nihility_Luofu_AlchemyCommission = DungeonList( + id=17, + name='Calyx_Crimson_Nihility_Luofu_AlchemyCommission', + cn='虚无之蕾•拟造花萼(赤)', + cht='虛無之蕾•擬造花萼(赤)', + en='Bud of Nihility', + jp='疑似花萼(赤)・虚無の蕾', + es='Flor de la Nihilidad', + plane_id=2023101, +) Stagnant_Shadow_Quanta = DungeonList( id=20, name='Stagnant_Shadow_Quanta', diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 735b93481..67033d01d 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -29,7 +29,7 @@ from tasks.dungeon.keywords import ( from tasks.dungeon.keywords.classes import DungeonEntrance from tasks.dungeon.state import DungeonState from tasks.map.interact.aim import inrange -from tasks.map.keywords import KEYWORDS_MAP_WORLD +from tasks.map.keywords import KEYWORDS_MAP_WORLD, MapPlane class DungeonTabSwitch(Switch): @@ -92,9 +92,26 @@ class OcrDungeonList(Ocr): result = re.sub('^灼之形', '燔灼之形', result) # 蛀星的旧·历战余响 result = re.sub(r'蛀星的旧.*?历战', '蛀星的旧靥•历战', result) + + # 9支援仓段 + result = result.removeprefix('9') + result = result.removeprefix('Q') return result +class OcrDungeonListCalyxCrimson(OcrDungeonList): + def _match_result(self, *args, **kwargs): + """ + Convert MapPlane object to their corresponding DungeonList object + """ + plane = super()._match_result(*args, **kwargs) + if plane is not None: + for dungeon in DungeonList.instances.values(): + if dungeon.is_Calyx_Crimson and dungeon.plane == plane: + return dungeon + return plane + + class OcrDungeonListLimitEntrance(OcrDungeonList): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -111,13 +128,21 @@ class DraggableDungeonList(DraggableList): teleports: list[OcrResultButton] = [] navigates: list[OcrResultButton] = [] - def load_rows(self, main: ModuleBase, allow_early_access=False): + def load_rows(self, main: ModuleBase, allow_early_access=False, use_plane=False): """ Args: main: allow_early_access: True to allow dungeons that are in temporarily early access during events + use_plane: True to use map planes to predict dungeons only. + Can only be True in Calyx Crimson """ relative_area = (0, 0, 1280, 120) + if use_plane: + self.keyword_class = [MapPlane, DungeonEntrance] + self.ocr_class = OcrDungeonListCalyxCrimson + else: + self.keyword_class = [DungeonList, DungeonEntrance] + self.ocr_class = OcrDungeonList super().load_rows(main=main) # Check early access dungeons @@ -158,7 +183,7 @@ class DraggableDungeonList(DraggableList): DUNGEON_NAV_LIST = DraggableDungeonNav( 'DungeonNavList', keyword_class=DungeonNav, ocr_class=OcrDungeonNav, search_button=OCR_DUNGEON_NAV) DUNGEON_LIST = DraggableDungeonList( - 'DungeonList', keyword_class=[DungeonList, DungeonEntrance], + 'DungeonList', keyword_class=[DungeonList, DungeonEntrance, MapPlane], ocr_class=OcrDungeonList, search_button=OCR_DUNGEON_LIST) From 1d5692fa45eecaa0cd9e5bc0cf060c39c4901d09 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 07:59:19 +0800 Subject: [PATCH 35/65] Fix: Handle OCR_WORLD moving up and down --- assets/share/rogue/entry/OCR_WORLD.png | Bin 15699 -> 31331 bytes tasks/rogue/assets/assets_rogue_entry.py | 8 ++++---- tasks/rogue/entry/entry.py | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/assets/share/rogue/entry/OCR_WORLD.png b/assets/share/rogue/entry/OCR_WORLD.png index 51bb5f5f70571cdff6d6b38d4efafad5652a46eb..3a87462841dab5e136611289d2fe95c1a457f626 100644 GIT binary patch literal 31331 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�-{uP#irDyH|=7+5R3 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 Vw~S$%dH5EsZ`%D>cjMkK{{#J&z<~e& literal 15699 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 E0p4YH>Hq)$ diff --git a/tasks/rogue/assets/assets_rogue_entry.py b/tasks/rogue/assets/assets_rogue_entry.py index f67636b75..4b310a520 100644 --- a/tasks/rogue/assets/assets_rogue_entry.py +++ b/tasks/rogue/assets/assets_rogue_entry.py @@ -27,10 +27,10 @@ OCR_WORLD = ButtonWrapper( name='OCR_WORLD', share=Button( file='./assets/share/rogue/entry/OCR_WORLD.png', - area=(488, 339, 718, 371), - search=(468, 319, 738, 391), - color=(45, 44, 68), - button=(488, 339, 718, 371), + area=(488, 339, 718, 395), + search=(468, 319, 738, 415), + color=(38, 35, 64), + button=(488, 339, 718, 395), ), ) THEME_DLC = ButtonWrapper( diff --git a/tasks/rogue/entry/entry.py b/tasks/rogue/entry/entry.py index c3bc9b4a4..093c1618d 100644 --- a/tasks/rogue/entry/entry.py +++ b/tasks/rogue/entry/entry.py @@ -1,7 +1,11 @@ import re from datetime import datetime, timedelta +import cv2 +import numpy as np + from module.base.timer import Timer +from module.base.utils import color_similarity_2d from module.exception import RequestHumanTakeover, ScriptError from module.logger import logger from module.ocr.ocr import Ocr @@ -67,6 +71,16 @@ def chinese_to_arabic(chinese_number: str) -> int: class OcrRogueWorld(Ocr): + def pre_process(self, image): + # Letter randomly moving up and down + # Crop to the up/down border of the white letter + center = color_similarity_2d(image, color=(255, 255, 255)) + cv2.inRange(center, 180, 255, dst=center) + center = np.where(np.sum(center, axis=1) > 200)[0] + up, down = center[0], center[-1] + image = image[up:down, :, :] + return image + def format_result(self, result: str) -> int: res = re.search(r'第([一二三四五六七八九十])世界', result) if res: From 8a1520871b55cb04f37625c875a75b5c2d5612b8 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 08:07:23 +0800 Subject: [PATCH 36/65] Upd: Map control buttons --- assets/share/map/control/A_BUTTON.png | Bin 14904 -> 13325 bytes assets/share/map/control/E_BUTTON.png | Bin 13599 -> 12233 bytes assets/share/map/control/RUN_BUTTON.png | Bin 12810 -> 11103 bytes tasks/map/assets/assets_map_control.py | 24 ++++++++++++------------ 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/assets/share/map/control/A_BUTTON.png b/assets/share/map/control/A_BUTTON.png index 46e8a9f15bf6f379b68ef982153c38a90d858fa6..b3596dff7f4ac8de8f2530459f7628f8627e2e2e 100644 GIT binary patch delta 8209 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 delta 9870 zcmYLvXH-*Z7jCdJQfDk65SR?37>a=O{t2TXh-iZJqJ$#7_i`*0r3Ix*9mIfiDWOA9 zAShKzLQm+S_Z9-lJ?Pwf11mpRE37wr@Aql@#5}9<`rLQ{5VyJa&ux9b(Ul4N1amuo zp~HO@nNR2P&n5n?Q}ws$yRg4aw=SXm@KT)NJG!TSJ0tZs=c(Too9vl?%#zlwFBYwh zEnkPe`(J8k=mU-ZdrmW)64#%+I)5)ynuGsu(|DOeX`MJ3t57_T4F_i;K%B$D~*#HihbS5KTR?i2(f zpN3JM%~dYS6>a5KPeNq+qdwgkjze70=u$VBAJI?$GyK-9Exa|Z03ON>SjpHp$6w#w z*;$#W7r%6#aN0XF2+6lS>S+1w*tjSGR=3$*)-WAjJu9hemdbaRTH6J9VXDUF>Q=^Vg} zsxKNfTniueW16eAAUiA_)Anl?(_zBR5Qv+PW6|7|@3&o7Q3FM_!wSsPac_O2;Z*pWkM&T=HTV+{@! zX?Y25b!K>{96$+An6}qTo=%ab&%EBXFo%V@Jz-eLL7BKAkn7fvOxc;NUHWi}F6zA* z67xrAZhyW>w?V0~=dxIJSC*P9vFN>?%I?nOk0+}KMkP+Ft0Rn&m=C-TgnN*?kaLjd zZ+M>P^%mI;Nuo=Ij*~KymdT-<>PY0ku4{vjm$jcCU~TQ?B^@pyA^+KRy(#PHd-YAT z8n?Zb?W9s81qpfXtG3vWSYw}bp6RueWUFKIwiR-NjOVv!Z$uY+3LwxYj_99sU^AUhr&<7K!v#Xn)0pqdLGyWFbFSD_ zgIUsG%f#(9%s^O@V4~QbQ0{T`=t{?Ps77R2zGO^0cg3yX)}zol8v=U=&Oc;3KrTb- zpR-`sdK`j-r6LDYG=JQZAetJtg~OWt%Va-p4!m_>ATmWT4~q>9i!Gq)4Xe7FH}YG?#3?H;h6HD0mbZ;A8xmORER8u~WFV(8(Zn#3O!} zPr7L5KUHk~+|4h*_~rjS6%7H0@1hh$FYVFIiw}f2ZaWk)$$jiHav9W>OtKmANON&+ zee?~X{gk!`HLYq=_U&1bn+RAw1lV|Gokx}Jdi-^gM1O;&d-g;}i8uMRZC#E)^RwkI z{F?{_gv4(7Cjk!w15FKwW_85PeYSPweD=L?TOE4?&L**WBt7zm zH+lAdyax;2?orzB5Gge)^SA>5fL57P_~rI=@nm)Fk82*f^@$+?Bz{p(ZXZbadk50RhqfPvD+vZ6h*7a9+xwlR^H_6Gxqygp3^#qzwyYh{BxI7D72Tn*e4db>dDt#A=0y4uM@(!C0hDH(fv-A7)^Q9jP zCvs0;)GP5@i9n+b3ehTi2R#`|5fKsFA}KPC#H^rAG*=hy-|QIAf>jzDd`Do3+!UPtX@`M(rq6d5=2($TAQ)7P4(3Ze`27v<-p-ZpWv>(2 z1OZ^?`){5{{vFjrdNPWNsW!&1r@jj%ll^AcCML|ObrcdQlh>u@DRpa(#=(E%wDb(QoY*{X$o5{ZKpALfb+C*SGv|3J1j*>+j8}por zkyGC8k_y~k6A84(Bw#M7zg~1>Of8qx=OXg;g%hWyrgoR*TqX{;N+#+%J7cidiFvH^ zW&F?g>lc4QljP}*odHZ+W@gElYrTz$B^j(H@`5B@AD*Px?g0?o%SL1`J6H4%^SJjB z3jRP{5Gwv(Y`yQgMY;9&BkHz;`0kDu*`EUKRiTadnAdmQ>AGW6ZBl&G)MpbsD!>2E zdGb+&YpF?v?NEtfg}%Ty{m#Zb63x^W#l(FA;%6pJ^t-m!$@@+F>Aq{VQnvTW6?T>Y zW6ET(IP@WqB`sZY$xMWqiz4bfjepp6UwgN)wxy*-$#<;*{F0-i*9j$gIXN>`W28!} zwhop0{g3k36H6^|_7ioxCupjC>s@(*E2N}tDZXAU!rkz)`h}@D$S*uVx{@m&n*L)Z z`sk)p2t5qE*$V_iU);uYRJ&d}Gc4g^2!MR;A1qtgcrA;VwpCh0{3<+Wo{!hnxd5LR zr~r$8uednb+{fM-=Ea=d*m#^|>S|HzF-K~oZD9xexA^&a`14~!Kgf6~D9DS{A@e@G z@^Vki_o=nv(KBX-^C|uf@yvZzaqff{&$1*ZWLLtnk}?v6e7#uN+0fC^viE^GD2)qn z{tID@(!~mPQs4x~&&I<24oU0sJqTalAu_Q20;EoK%r|#()3LyDB3fm4P>RYvW0W77 zV0G;ZEl%Xl&{B}|9{i=2B0S+Er~2?#|8)?GTe<&+Kn~Py7aWUUPIE;u!}*m|C2rj^ z`8aZD{bAI0%m^r}`m0VB`1a{rzl~B+kgD6Y(s{ggS)3xDs>kfJ;K%O%0Vu?W@FU-t*fnFkrH>s7#zW{Xc8x9t(t`IiYYSwvLw9<`rw`=ooN zL&K&>cTDUG4`oqS=020E|G+BzLi=t}dU7fU|4No>O1bU@Z-xa zudJ={74>VqHD#hqa%ad7r6;x7xCGjh0gcaRcz)`Ef=p5qvdJQrt0RvkvGmfI|8}!! zmrO_e27FW*7tXx}{R*Eu9o;{pr&?>hIZfTBM3|(rNrwIy9}k-F9&#D0TE!$+8B{oE z!$OOmK0xvXb_03&Te%NSBPW1`=V`G&Nu&=h(v14xpura_Syfe4Sykob<<*tud)v}- z{mZKeke6GzQ5UiiC7PSdXr&Gqza$;nJ3gUU8F?KV?|5I#Ykh9PGmr-FO*y69dES%33JX3#4?jnP|BtUq- z7vFF_4OGY1+TzqBCC5FMb)!fd;ow)#&DF*rr0Z9gmmM8k_@O)(uz$HV!Q}}eHA2PO z4|XFw620k+w^MJ`XdRY8lgIl$K0dKZ%ApVQ^-23I>um7jJjM}&gPlD*Xwj?dqOaui z4e}X24bgA~jK1on?Z~NU1k*VHL}e3KSIY}16Zv+|?Z3_5?7G)YOiWNReAi~bXT;2n zc*SZI}A4Vm1 z`~QZmtzGQbxoPj1Hh4h#lAWy*xaUG{5{xFl8A~xoImriS`bF*Vir6&7*udqAj4P^e zIL3UMtFQ$;O*t=U(lz=7Edm2+1A1yI%F6G0t+nA-P$^a|l!W@^PFwS~>Im9@LLn|7 zZ!at!xI2pg)9mhOYw%Zqoxcc-BE$fwA{UKc=x!C5A~J-;n^12M&fW z!mQb(-js79NJGMUKg#^d{6t^5ixuQ@BVJQEbAq}aRk^IznYz^aFAb8)h74%4pZzvJ zu!x&&9L(skva+^vZufg7VFu$!NL6llV%jT>*D&V)1he=46(;$l%fQIs=Ol$B>|nyz zqW4mEy{h6E{e1m$QC_eLSFcXgI#Td4X_|NMs{1F!ZC&qzC&KI8_gz)R7H1Xi*>`Pw z&3^0K+q*Yp$-ukEhw%1RJo$1I2CA9H^hZ(O-H z-*Ox=?)6iwy{-cS0yO$=D_mI))3^`Ux#Lre7E4vG^_*9rtc+qEDLok=lpK|{XZbnI z4d@jaNlM7aMGl({M$HUMYUXo$>0h6aTuzLtbLF`huW?~SN8GuQR#G1j7^rtSBnsNH zP3bkQTwo(JNP?#|G$Ppf1GdxF`Jqr1zm11Uh}YQ-1%OF3I_ZBWAkf@O7?8rs9^W90 z%29L@w=)qocMc}AU-8O18DRsu3uKn7oX0{oo-p1DY8DduB*Tb*{hJ$pgE!K+k!p{q zRaO9GFac3T`c-kUuv|B*CnpM#w**K3cwlPjlz}jj0O;j5otZ&f-!+aSEJ<~{v16`j zsz7lm4hOhBkl7QnadE1tE=zTTuEQUxWYO4 zf$29;C7(;TNwxUJ(IxrsX;T2b!9OEj$*w!qd#%V=3b4x@AQDM^eVH8VtLy9JG882TO`jBK z+Aa28mbE4n8C9lVwwY_-H|4Fqq^<>*mU&z*+KGtFHVVihhJ!^Ds18K7B+v~PpO zMDaTki;kPmt5q%&CW4WH|EPPk7z)?Fe3=GNbe(WqwjMWIigQxW0-o|Z}p8`^%`fK zL0kA=41m|t(APM&sAw9~4vWP(7_yVvU1UDJS6 zVO}}sy6LS>y}*Zx-JRg!2pSQG)y{!)CpD!B__OjfcXGYC2E|(>HKLy_OUx9sJ?0hS4>e%GSb< z$%ifH$O#y~&ThGoO*HNYXzF@rB^&Slq2M+-nMOV$0vSraGBR@J9^cEs)=quv%c=Ku z_8s^+o__^^AmReC18q;g==Sbw>W5N5!6YXsB7Ved}Ps9?Sp38`tcEtQ9T3X zP!~~J0KgDZ+f5@M5;X{Y4*X=__0joU&v0q#WeB8s#A&rIrZY(_L&kCb`(m|LybZcA z==K(Plj!fWf`^8h_J&NWoUY1C{_xXslDHWa>zI&;>;J)2xS$X`+57^;L2H6TbT(0@ zaOGl#`h|L*)qtU1dRG~$T}g2i&{MTz#=4k>fqD;Qi;&(m6>uIpC>#Px0j;{4KO?kf zZf>)VmW)FG?VCoQpM)ThGXfjCw%yrR{-?39v{bk8m8Fod1k!Y8WqRUO*?G91*6ydj!9U%Z5y;1O_bY(~hMT-r~mRQ8X@SNfeZeL7ELA_(- z&8qj5uHjlw%EpFPbeT!+0}po~Z9QSYqIFUZe+K{i|Dmg~H-z2?@99cQ&1% z#tqBs0dPXDEzw};xIf|Bc(m1-1`ff(+mQdCKlW!JzLi&cw)d|H<&OdU9ZYdLm=i#ya z*d(L2yy)KMk(9P!m?(HZH3SZUNflo*0ZbVX@{fO)&%Al*q!6^dbzr4Tpbm^{Q=c$F znvI=_wVqKjcz75m2rBbk3hQY421~LJhRaH^Oz>fJAbCGiX}tmP>`5PiW58608->|A zJmqE&rg7j+X!=hd--7g}ny*wiF9Z_^gx!2S`tm-G5uB(!r|+s=x_O@Q?b|od6d4p5 zZTjx3Z2a)$@3>px9{9qMC8xczQyXSrg<_NM1O?>%{94SM5U?f2n6JosFXL#?;*VgS z+C2kII$#4pfp+v^y=G=D&p>q%oO`2FY$uNSJF-r_tFz?JpSm!1Hn!uLeY$&hDmIEs zd}(cse~fQg)8=_@?)P{lE-{mxSl@=#V%OkKe@aHZD=64CV-188MR_a48mR8HB%ONB(vLMJMpm6N?os%r3|H~`GH2+%jgo0>ROR%Q5< z{WciK)r>V)`ri88a7_(n+TNPSe_)jA-m}6Deh&i&!Pi@j)oqXuAohZUz9dIq2fSO@ zh8TWKHMVYUZmXl-dTQG{zWf0Pm}2pDQia^dODHWkOFp;HCG`~VwXUqd{ra^g%34&C zs6F89d`vkrX_pneR*^+32J=KP2IEnWEGu_K|7R5X6{PGU0$RHSpV3poILj}A4j8O$ zhmabT7e{|%snQ0IWH(;i&3m4siRM@Eum&v)hw?_uy7JKk_?LN#y|Z)hvgsN%(UQ8b zb9EpvFkp0SOz$vdDD5^v8(^&Bj^|v1w&V&4qVwiONG({wf8vv^nKE}ekT>ngS{cZq55~xmPCWf6B;CUD!VR=y$kBmkZ}H(P@uMj)LStl+565?haFXQL zLH(Ph)hp?U(F(hDF5C`A?QlBzuBPU;GhR~Qe|#Sg)FY;6{5U+d`|ZE_h6M(mC*_m^yTNi>!j`PdcjL$ z94cnrcQqtMYMxbHMvaR=Jn;+vjd6V5EK`{io-b86F~Om2(qv6Ela+%_<+#g}90Dw4 zUyI`E%}^4WFHT2g2F@%xJ`rjg3g_<;6BA3+#^fXX8-p{JvmS>eG7iB3r-9@04K$Z& zj|;P(uDD%&m2>mQuMLFvgUo(z1d&@kXiHj}N8Xfa+aE3j{1E3D6Eo8xNNXvF=~}*TnRo z8qB98eiaIu!Nw#X1_lj|%XhfMYLCHKZYS3?H8pi#U|3CBUf-JhAudgw84U22he{b= zI0SGj{W`r0l=J|&e3NYuG}#!4){QSq|8smpMnYmE5WwxzvZyPRtq_wtaD{mc2&b4m zmtV=@bqB~=3ZF(-N4}H|fYL^SywNe& z2M?{W>s@2elPz7Ho!_el2l)CLVi454Gb2Z^Yx;u+MROu*A-&^=N;ujC za5UVm+7v|XP~OZ9zyXDvk)+;ivwEn8me2z}&;Ks_(n5;a8A5nWxr|^=PJ1jA*u-!d z78$)SFUqUlCz`s{?WH>Qr~xiXHkxQY=v62?EH{Cjf1Gi=u2$|okQ9kwP{(Xq^2P!2gRTt>!}@g#X^+~OM-+kqL@o430fz*RH7YhwbEvSP?P|_?euGNB+T-vyode1rj?%lg!reJL>drR?fQm(1Y zXW}qQ+ys#?jjgT@JJ3Vp?2m$SOj-*2`j%M0G2gU2Zhgf;54H&E>CFmDP>+PQahLy9 zl4nv~G|Keqbo<1w1ORxgsF)|+^=Cl@Y1DD?l1f2;b8~ZHy@h$B?P>v`5EM3G$Wv0c zC3MrI+#|Jx4y~G$AGu)cnjQ~BD3f_ zQoYJ@*lM9x2}MN{K(9r1UP4xd@>VhQPl)IIFOmbWLBDzN|GsVIAe@6LtCY8FNk<5C zaT|6-y78k;O-_C&-Aar@xu(sdZHhr5K@8-1i^lod$AwBtil8{9jb$j27Tvf=m+!9zu(6ng=`r4GB_D&9v$x`{qYQPfynjrf_r1qNy| z!!5P>5XGc4ybz(`FFuX?u+|_8#Af2-innjyHU{pi&{jOfn>MU`efJw!ZW=W_>${w6 zNuQ1a+cdG&xUSaUKOQt+e#k!9+6<9(*B z(=D2@MJ8CE-BdzjBhs!b#b;G!Xh%S?(xx*h0!KrG*0XV~&QVEG(PF4*GC-pQjJvnM zAgX~jp~e^-==Jic#4Vevc}|6~s8YZ8N?TaG?^y;6%@fME88RoSsOXFTyCeE~(Acy% zJI=kOTZ!dD8k__3xgRw|dCVmdFiZx)Qx3boR9FhCLBE5k^))i^WVF(L-M_b&(Jy{H zU1=Yzwp7;-Dp9Nnl%JnII@Cm`_A+| zInqE41H%PzlgdxU#lh{d8J)@EfCqJJ1l+Q?eK}j|Z@#%PB?wL>HG@o@P&>>K=U4J^ zLX3SxhwKPe0Jhx$8(+?Y9}y0XLqy-Xr+9^_G30W7bPM(%jUnpp_VDb_Ezb3i_ncQj zG0?Xb*=GFEC^R#u~$uqx?k}uFv^HiC( z&9{v;m0!MGJn^f)9=5Rce^b4}^B5gTeK-9f)pXh9F~2b@+1cqnXwNR!R{gnXy-)i5b=&Mr1BJ=IH z=%X!5Ftvbk%m2RJcR$e&%t1(dxu$Y1;|CZust49Y>@OhT*?6_G53$b(EAV&eB@QCT~#rPjAGLO@$_CY{;Pfx53*jf;! z!Hpr9!1=e2k!7W&E5U}6@*DTZJ@+S@CxIgdeS3;7n612efQD`henjG@j-Z=RyAWT^}7_(aY+Iq2^8H+WZJQs zQMHSPm=c#1y8pXwVY~ID8^Umz^Xns~6e;{4&%h^u3b9!4OBJC@191-?)1g_f^pfLI ze%%0npmj7#-K~$+aXBej;IOAf8~_CoST2xUPO9=P2OS$79qO^`t+mVJ#Yg6-tGZf4 z!i&h75q`v7`;iX+WdqXsAB(=YS*IO#N#mRPx9Z9H__)Z&y^=(fgCbmX=)o=0!6`SV z;jgA4;6CLe=kn9CLYZ=GO`piKe_>O zxyOKl#;@%RgE_y+OJPnWbJ;Vt(JDO$=+Ky-2a(QZ}u2<5sU z-z4Lu2)AetcwhVMxy<~xhB{tePj4;zBgoWFK-D$0h&)$k3F=yB!J0hygx50D)pRyG b1>*GVbM)XpPv^iq7jo~;gMUiYpS=7(5{yHK diff --git a/assets/share/map/control/E_BUTTON.png b/assets/share/map/control/E_BUTTON.png index 3fe31de38cf27272919b3d79dd6e38642468f2d5..5b6b9f73c9164ff0b8c44e6832905a4769fbd252 100644 GIT binary patch delta 7069 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 KH-7v5&;Jit2~DQ} delta 8516 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 P;B&*u!Ls^4cYpnVVoNca diff --git a/assets/share/map/control/RUN_BUTTON.png b/assets/share/map/control/RUN_BUTTON.png index d6e54c896c92d08cb3ddf34f830ca77397030d06..dd16067c3ddded262841ec5b828df308e7c7163e 100644 GIT binary patch delta 5935 zcmXw-dpw(I+Q-dwwq~~nt9_TEZDv_jODINF9Wwhi*okS4nxT?LwBk^4s52#bX4ZDl zIIKFPsbVUtYBjVZLXfmo=b#QrCMPKoXGsYOA<3Jz``&*(&*y%w=W}1z_5JmFJh z{JiH6z*mLeLjU$dCVx$YD5+kouu)QLGPtGD1%{>nV|&lApf0jH5^>*}ce<;~tD1Pl zrp(}P3CHH0Llj3g|NQy{n>6YokE4*S*NVKO5Js1sMpY}K-xB=_#gvlZEn;)VwxUE=t6POM+s`=U z-nVWWiNSJkb--3HzYYyv-+57+Q(Zz*KtDGycvc#ZsC}@u$p+;_OP(AdSKN<`y7=VD zK?}F$>{Oi$X_RQeDY!;UlZ=6_VHhW7Ikwigo?3XdPD&kjM0MW2CD7*4JX@EE4Mv{3 z^H#`Z6rg?uUbTTyOu%*2N*AQp=1ws;Ow(Us!37e;9j?!??GK$E4brb7(s_iZqWL1b zfiJ@KXQJId%~!s083*wg5g7cVN36ynXQx1Ce|%wOTab&P3X&QlUMOt8@nv zbi`p8N__C>QT|{hk2-|)IDf@xQzl|d+1}2C1qBOKoWSeKRy{sKGWWJUhTV`V2g~dc)mzX!BBms8SRYmII~h?u&gL^I0o2LdF3P|IJA1~>@Y6n zfqF7G_>EJG&DT3Cchf+hTN@nE*Fy!5Xden2%4eOmh7C<#zT#^~@-{I=6ci3RC){)3 z`4XKpy?|zz$roa`UJWT0n-Awv<$F(iRWs_*GC>XUL2Vc-HL>PAj4>GMs9(Snk|S3SnIj7tDdVySUizbBzoRfD61oC zYv7?s(F?49Nb=V!1VTtxGkU17(ijYf0?&@_O+_;c2U)B_do$zQSK*6e>xujOa>m%e z1uS8v=HASv}k0m^LLy_ok$ruVZsseVV9L z^~!31ZeEPka!N;e6>K(p>CBary0y7oJVe{X#i>EKuI_I7Ed>ju9U;JO0g~kRnRZv9 z`v1vi#TW;|Dd}?S&(GL>H8g@ayH8lgQu1R$97LI_YLfpU1sRpKYf;s3(EVid!mlIk7gq#AVTDc#sKvN_ ziQFgNpSB37<>DPYz{Eu+$KK2_%1n!thVfJZG+Z09Gg;H4D#4AGTsri%fx%1o?na4r z)W$}hlbL>tdfDCqz3ws`K1~~U1h4ZidN?^{MI?QHIx}YV=lI;_NMFjeQ^hz{lM!V1 z{d7!ZRtNn~ICrZVoO=SjY)MKapVG{;vJ*jwQ`?J+V<5ntl6`IUHbu=Nc8ZMT4{9D3 z=GQWJSNXBf{!H9f%$7jR&`sDh1c&?*;#hs`Cp|rP6jj0t2ZIbU5-?Z#<@?x zPww5UKg{vk--=ju3qV7on#knlV%)Am)g0DYN=BI#nY4`S-u01Nx|M5f0g&{icQa(8 z1TC;vt5vp@EyDX#8||9>T~?#c$HBQqXY!~x?d~oa;fCr;$I4zyO^Bsn{_Sbz?t;7} ztSii!^oEW9m?liPKn9u#J+akWXdejE=g}l9;@0NE_H2%Y>^JY8q^YZ-B_Bh@JSNChkQ`*_;AS3VhFWcjdp4rcIQ#;O?7dc#K z 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 delta 7723 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 CZH^EC diff --git a/tasks/map/assets/assets_map_control.py b/tasks/map/assets/assets_map_control.py index 64b1f9745..6aaa78af9 100644 --- a/tasks/map/assets/assets_map_control.py +++ b/tasks/map/assets/assets_map_control.py @@ -7,20 +7,20 @@ A_BUTTON = ButtonWrapper( name='A_BUTTON', share=Button( file='./assets/share/map/control/A_BUTTON.png', - area=(998, 508, 1078, 588), - search=(978, 488, 1098, 608), - color=(85, 86, 89), - button=(998, 508, 1078, 588), + area=(1023, 521, 1083, 581), + search=(1003, 501, 1103, 601), + color=(108, 109, 110), + button=(1023, 521, 1083, 581), ), ) E_BUTTON = ButtonWrapper( name='E_BUTTON', share=Button( file='./assets/share/map/control/E_BUTTON.png', - area=(875, 583, 944, 650), - search=(855, 563, 964, 670), - color=(67, 68, 71), - button=(875, 583, 944, 650), + area=(897, 592, 947, 642), + search=(877, 572, 967, 662), + color=(75, 77, 82), + button=(897, 592, 947, 642), ), ) JOYSTICK = ButtonWrapper( @@ -47,10 +47,10 @@ RUN_BUTTON = ButtonWrapper( name='RUN_BUTTON', share=Button( file='./assets/share/map/control/RUN_BUTTON.png', - area=(1125, 582, 1191, 651), - search=(1105, 562, 1211, 671), - color=(73, 76, 83), - button=(1125, 582, 1191, 651), + area=(1147, 591, 1195, 639), + search=(1127, 571, 1215, 659), + color=(105, 110, 138), + button=(1147, 591, 1195, 639), ), ) TECHNIQUE_POINT_1 = ButtonWrapper( From 6e26817e5dda48fe8f8909cc57ff71fb18e12f52 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 08:14:05 +0800 Subject: [PATCH 37/65] Upd: Map interact assets --- .../interact/DUNGEON_COMBAT_INTERACT.2.png | Bin 0 -> 6399 bytes tasks/base/daemon.py | 5 ++++ tasks/combat/assets/assets_combat_interact.py | 23 ++++++++++++------ 3 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 assets/share/combat/interact/DUNGEON_COMBAT_INTERACT.2.png diff --git a/assets/share/combat/interact/DUNGEON_COMBAT_INTERACT.2.png b/assets/share/combat/interact/DUNGEON_COMBAT_INTERACT.2.png new file mode 100644 index 0000000000000000000000000000000000000000..5e96aa5d2ae82fb2330571788b3028c95ed9c107 GIT binary patch literal 6399 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 Date: Wed, 7 Feb 2024 12:41:53 +0800 Subject: [PATCH 38/65] Fix: DUNGEON_LIST.use_plane is never set --- tasks/dungeon/ui.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 67033d01d..84d5bd7cc 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -128,16 +128,18 @@ class DraggableDungeonList(DraggableList): teleports: list[OcrResultButton] = [] navigates: list[OcrResultButton] = [] - def load_rows(self, main: ModuleBase, allow_early_access=False, use_plane=False): + # use_plane: True to use map planes to predict dungeons only. + # Can only be True in Calyx Crimson + use_plane = False + + def load_rows(self, main: ModuleBase, allow_early_access=False): """ Args: main: allow_early_access: True to allow dungeons that are in temporarily early access during events - use_plane: True to use map planes to predict dungeons only. - Can only be True in Calyx Crimson """ relative_area = (0, 0, 1280, 120) - if use_plane: + if self.use_plane: self.keyword_class = [MapPlane, DungeonEntrance] self.ocr_class = OcrDungeonListCalyxCrimson else: @@ -470,6 +472,7 @@ class DungeonUI(DungeonState): out: page_guide, Survival_Index, nav including dungeon, dungeon insight """ logger.hr('Dungeon insight', level=2) + DUNGEON_LIST.use_plane = bool(dungeon.is_Calyx_Crimson) # Insight dungeon DUNGEON_LIST.insight_row(dungeon, main=self) # Check if dungeon unlocked @@ -508,6 +511,7 @@ class DungeonUI(DungeonState): out: COMBAT_PREPARE, FORGOTTEN_HALL_CHECK """ logger.hr('Dungeon enter', level=2) + DUNGEON_LIST.use_plane = bool(dungeon.is_Calyx_Crimson) skip_first_load = True while 1: if skip_first_screenshot: From da0a1c16ff0770af3c3608582119f69a2dd59358 Mon Sep 17 00:00:00 2001 From: Zero <98764734+X-Zero-L@users.noreply.github.com> Date: Wed, 7 Feb 2024 21:10:44 +0800 Subject: [PATCH 39/65] Fix: support assets (#307) --- .../combat/support/COMBAT_SUPPORT_ADD.png | Bin 7172 -> 7436 bytes .../combat/support/COMBAT_SUPPORT_LIST.png | Bin 5300 -> 6569 bytes .../support/COMBAT_SUPPORT_LIST_GRID.png | Bin 116365 -> 95304 bytes .../support/COMBAT_SUPPORT_LIST_SCROLL.png | Bin 7142 -> 6359 bytes tasks/combat/assets/assets_combat_support.py | 32 +++++++++--------- tasks/combat/support.py | 5 +-- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/assets/share/combat/support/COMBAT_SUPPORT_ADD.png b/assets/share/combat/support/COMBAT_SUPPORT_ADD.png index 586c9e0e5fb6a42d9dde88e8ed7390b876e019fc..48f0e0e63d8a8de2f9cc533a5442834effc3ed38 100644 GIT binary patch delta 2372 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 delta 2095 zcmXX{3sh3s8b)i(CZ|$o%15O4ddt>STH}xp2Aw9enjYp&$VaKYbQ0f4Dx{~bcV$hQ zvu-nWeR2&GIs{sTFI03Yt?7zGilhi=K2Q))646As`{X@qowd*U_xT_D`@a9*g#rKc z`^5u7txY=|NkX9o?Y}kNt-n5!(%gh<>Pm`njp>mZRr-3l{~NCYVi&yxgUE7*6Cx@gR#isv+epnM@W}9Vk$}zwK>~ z9^Dd<$t>-T@Ba5*It){&RP}HNlrQe>C3Q}$_b5Wyf-@ERIc`73JnG$=IYR{xrmQ>Q z%5(%e@ajV9nsyl8S=;io5;89WcZ2ve@#W87@h-mpSBG-#{QNwDC5A)jBa2Y5!%9WE znUUw@g_#kRM#I*%EolW?8C)*6^A0+iMPR#_G!m3wBGk9T>X*ax8&m{P6f|CuC4Z#V zYQfo9#ep9u1uhqQDscwUAvbZ6uRNlc5$a}Y<@5PAHa04Np;#)#hM&4&e*m=_c!xZb z%jJVjqy!$1CuWAxRhk9`hrl97U6?Z%#N3|1XpKh0%ba?9>JHjJqZ$D~3DF>qqvr{` z@xF7x8&}HKfJ{v9wuJ|rW)9wEpqiKGrRsWV3JZ{3QBlD#Y*zrpRFjhs z^Qc!-^;XC<`%%TJwJFX8u!<9Ts)gB6gFzBYyLG9(ZUxT$jI0Zql7@ty%8xV8HxTEi z2Y6{CzelxXr*{Lr&ueATx>lq7auMdzAHPy&I@YMiUf<=Vk9N8^IWb`v2m_B7Pm1X3 z-%iIk>oM(VE3$#?H=AL&&0=1nOjZ@Z3r%y?PVraSZk!LeS2N5L?>Pvgh zX0ZU}QFuk(QnD=V`4?n0yMchmM@L6PGODf>Lss=smJJg1ldi2Sv)L@bX=|11?d(7?s9V_x>cuUE+3dk2jr0EPaPENkWovAPzd z+qx@pOIga@QO}s#mJdQi_GERxm~)nILz^-lLNuGdA&}{ow@~H9pMFYN7%3n^()wg% zeE2G^l8%>r^RVW48R5;n-7F4=GuW6;_qBGUhk1P12Z2Kl?+T#IO{Rrb!7zbyCepig z?(aotY<=Zb{p+a4v=LgRR3bTz_<~qm(B`;>;e4{>Y*s~vaHxr-2J+%~R%SmyxK7+x zhPnK<`jh_7@~?P@2*RYp;RS?R8kn+)qI8R7{S33<)7i??Q`{_F440L8+9u{L#Pz0aZF( z?dF*5swj4lU?3eB4RgJr5+G?7oldVgR-%XaqFU1fOMGp=_elc_rlgMeRsmz%uq0EU65y$_4ezT0K;<9sW+(D{6k9$xi zewEI<>oN}(`H`zr1;hEK$)NLLmA@{F=#He%T zU2_#p#}c5wc$A5;*OY)96S-s`62Ef{{zy{XPp25 diff --git a/assets/share/combat/support/COMBAT_SUPPORT_LIST.png b/assets/share/combat/support/COMBAT_SUPPORT_LIST.png index d22e1c0d101ecff3aa428534e3b6fcc4fd0468e7..9917bea76ec83ffa7db716e3893ff5d430841d0a 100644 GIT binary patch literal 6569 zcmeHLZBr9h6kZS&P(Tq2iX@D!qD7@*B_IllC^8~cu|f?m+K5z95)2xFBv7qYi-6TC zNwpSqvU&b@b^d*->%x%ZrN z{+q-&5BG)c004NzZ;Rap0Mn6A=hvFN__05-6z>P*{0I;EKd6%ch|Q8 z{+D(K?V+vt`aVu-m+uqmAixNzs|oK&KK;z9lU{Gh--dAP;rQr$&V)u(GV|8(2Ga51~$HRD@Ha4 zfKT3l6Ji1r02joReC0F;9sSc~BWhgdVUrjMm=dsXKs11nfRTW`4%ickHg>e>a(A|%^Ky{NB+fk=VEi3zKv5Fh zN`l+WmSK3Ju9ON#a&1W@5{bbMZ(KdIy^$d31MMbpCeJ9L4U#QdA4eF$>(pSMz^^hS z6IXen{z4JdN;{H!&nALqB4{O!oLr}jMjo#y_`?oK@++27K3-aN8!%1Shu3r$bUo=N zg`VN72h@3z4WaVn@&pdX`kyYX@YdXl|@XoeOwHFf8NrSa1}V?@X809bpW}z(+m^e6osm$>8nD=5%ab!q zWn8c@haFvPS7=!|t{gvtK>DzsX4{K06OMCfpI^zh9!ulrjc9sPrMQo+CeWX6HZ};2 zns=&pQ!lAP#B~eFabDFBZTWO7Vh(40!Lb(WXqQr5Thq4IqxlFvbb9;!`&8Ok=oI2s ztuy_lkLGH1u~2l}#-WdP8s2UX5pgFI_d{cnXa^Y4UC+;?8#=6DzPL1`Eu2$0e1`}% z=y7yj^-m~-0@?zkHQrNkpNi$jv}RQezGD68OL)9HNm$p=wk~N};%ai0op(al*YdYK zyM_^lW5R=m0jfl_lOjzx&~rF^s-WQ$)*kLS3=@|cuc{tqOUhF+3bNP{)PrqH;4%Vu zjRg8wK>C=-(3jItmRy@ClBmQ11Mhi_c@H{Abz$zPCndK6f%(L}b7v(a2=0O0S1aa$7F=L77=>tTS}iIOrJ=85+vIt<2GA#w6FA zm0+r4W;4<+27vNeP9vUsf}DMQSEc!}Sgf(4t^@M?$PpiReBq}X1;b?XfG)}lT^Sb- zSn*Xi<$pYchO2(;(x^9ZttD5&fzB?a%TF znrD(;mV1dTHPZ?+$_kQwT9OBd?`zcmuDImZKHt%=Zozw-5&#sC@*5(AIt{#|qW?*H zJF#^Me3prZ9k6J+6QyHkg6cXj6$#6}n?~tClpz!dX#7iAwelY0WD}PwoR_qIwVv;= zn|mMO6sb}hO}gadqN>?!F^f5&*Xz@HQ7BkB9s%pAOA+2lt`%4;mirgE3EGuhJtw-D z*AXCKS`W7TG$`6Q`^|E-ib$;eD@Edi}Ia`Y@X;YbuK55>@2Yt%QIY zTr$jx8N3plGPHJvq&kwoY-(ks)T3urqKuoOsN{izc_R|_M&VeAbyxoD?#f+(pJRII W)qriSy4KH8*5kJ%#@5H|JM|A&ZpYvN literal 5300 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 VP9;8;ecWIm$_IV2>G;>*{uj3=o)`cC diff --git a/assets/share/combat/support/COMBAT_SUPPORT_LIST_GRID.png b/assets/share/combat/support/COMBAT_SUPPORT_LIST_GRID.png index 3029cfbb8de6826880a0cff856bf658caa8114d8..a9839d3716e3d3f0fff58fd87e73f78469ba087f 100644 GIT binary patch literal 95304 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 literal 116365 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%0A>7%wT7js+_2TXX$hWo||Vvl=ED`c|M41m90 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 diff --git a/assets/share/combat/support/COMBAT_SUPPORT_LIST_SCROLL.png b/assets/share/combat/support/COMBAT_SUPPORT_LIST_SCROLL.png index aea5bb872acf235568f8d16fd0bb587911c8edfd..1e4779af371bfc47fb6491cdc29cb9658c905e39 100644 GIT binary patch literal 6359 zcmeHLZBSI_6@K>vSWpPX!B91@rVQf@E#0vl>#8i9RIQtA#AZ5tv?A*?$mJkzV`4HBHKIgr6?|!&A znKsiu;r`$*``-7w=RD^*&pCI0y25)&3AFvb#1>sCL`SPVWY-_yk6=B()}U@Wc4 zwECf+>}tHx_gKrKlE19Eu&fQLyTtf&d6(zuRY-?Ri7T8JepYko5jUBd-ESD z==sohw({gA=N#Bz>pB)?)4d{Ipj&blQ{rZ9U>f>&vrGOHr2B&u9{brNMwg(#$D#qvlpg@J@)F8nvcsTzZjUF zupdIgwdb(qjUN5LH1_}guc~ChfEW;I<)6YS&-t7~Ka~X4A zxlEwl)dyEH;IYxsjS%JqdliM%> z|3nO)DcURWHNx0AJOxRpidcO{TpA$X@+kUa&cTLAaXDU|0_iAsU8#t!qJmB_>~og^4a zE!n6g`@K)AfK1wADua%>l#GSdK4PL6+wgn~@OTb*G?({B3rE%DdQy{qH#<1Dz#cK6tySSJNeac8iE4u-iGIX#6K8p9 zbW!_|4o9&A%LuYXrAOOfl|6Ut28Gg0v32D9kk}qOV8b_JmDbx%s?WY_1X9bQ*MNjF zw&RK{5K^Z#p2pUrhMo*aIk2Ip0_}lk9;ponule$EIP@*zf|&9mN<1l?hu7Js30R7OBL_k zLiWlciuhi=x$VBabGnWUi8|Qb4nED8;J4LkNOz;tVF-uko~#I8l-hb9rjg~S26?WC z;5pUVD#uABh~m;_3j77Y->M@4=r_Ta?o! zwG67_k)iK&^~XZ!NRIYB!wq&*0}D1EE-#&2Uw#o$a}oZdmFNcj!zpM!mOY`2iH`Gm zoKxR(E9`M;g5pd4u4`AKj9iG(ENQHC#+Mnp#1u4oM=!Q}!K&U6>SmR+LIA?Y6wdt) zgI)EvbPtN+MCgE6HT{;)nJS=PHHJGN26Wsvhq0~bZSIO~aoB67HunUz(IRRYCPqTN zi)vPyEDxBB;KX{W+naEWx5XVL+ssQ?Y9KiB?U$KTQL?QY zhGy`7P(SW;*qR)B@yI^_Zo`OAeRzuz45wiqm*~K&Q_!naf}Nz2LzPJhF1kw41;v=x zRLc9>jh6N3U_+e(R)OCSh%ZwQiO(oaT(rM`ST$@#5wuF%n> zPh&Z!V2CTEntkIzjv5TM#O}@kYX(xLeUuPww+?J_ZLgX3Ix_6HgH9b{6&YGs#cx`= za~DaQPyb9%Gz7`e?5VOD#=NTxkO1S0IOjU%b@)qVk$C}HLF2Yy>TLD@l;WWG4V`I3 zCBA0_x_YR3+dA!rH}Bt#pq}Kg)Y*72OG8uLna^Zvcu=14u>n^te`9cc@&mvTDge5{ zQ!<_Lm|WENYN~;uibz@F8b$4+X=(FG@PZQ;E%uH3G00p+V3m>=q(xF@2JKu~iURLI zHOn`$`3K8SP2YMDSRL*OAD6!B-wy+)<&E+;($}Rv;hugcJw0wNIr&)hVFq#Gnqf$s vUHl4vBniBveMu_LX60+bzSlRky6lQicO1EMY4q=Fs2WXc)~{}P*s}XSVOf1r literal 7142 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 II(E;$0nNJ*fdBvi diff --git a/tasks/combat/assets/assets_combat_support.py b/tasks/combat/assets/assets_combat_support.py index c5a3d4ecd..c27e78bcc 100644 --- a/tasks/combat/assets/assets_combat_support.py +++ b/tasks/combat/assets/assets_combat_support.py @@ -7,40 +7,40 @@ COMBAT_SUPPORT_ADD = ButtonWrapper( name='COMBAT_SUPPORT_ADD', share=Button( file='./assets/share/combat/support/COMBAT_SUPPORT_ADD.png', - area=(1032, 649, 1132, 680), - search=(1012, 629, 1152, 700), - color=(228, 228, 228), - button=(1032, 649, 1132, 680), + area=(1057, 649, 1112, 678), + search=(1037, 629, 1132, 698), + color=(213, 214, 214), + button=(1057, 649, 1112, 678), ), ) COMBAT_SUPPORT_LIST = ButtonWrapper( name='COMBAT_SUPPORT_LIST', share=Button( file='./assets/share/combat/support/COMBAT_SUPPORT_LIST.png', - area=(57, 637, 100, 680), - search=(37, 617, 120, 700), - color=(212, 213, 215), - button=(57, 637, 100, 680), + area=(67, 645, 93, 669), + search=(47, 625, 113, 689), + color=(204, 205, 205), + button=(67, 645, 93, 669), ), ) COMBAT_SUPPORT_LIST_GRID = ButtonWrapper( name='COMBAT_SUPPORT_LIST_GRID', share=Button( file='./assets/share/combat/support/COMBAT_SUPPORT_LIST_GRID.png', - area=(64, 115, 159, 634), - search=(44, 95, 179, 654), - color=(119, 108, 132), - button=(64, 115, 159, 634), + area=(64, 158, 155, 627), + search=(44, 138, 175, 647), + color=(117, 107, 124), + button=(64, 158, 155, 627), ), ) COMBAT_SUPPORT_LIST_SCROLL = ButtonWrapper( name='COMBAT_SUPPORT_LIST_SCROLL', share=Button( file='./assets/share/combat/support/COMBAT_SUPPORT_LIST_SCROLL.png', - area=(448, 112, 452, 610), - search=(428, 92, 472, 630), - color=(127, 133, 150), - button=(448, 112, 452, 610), + area=(448, 156, 452, 592), + search=(428, 136, 472, 612), + color=(130, 133, 153), + button=(448, 156, 452, 592), ), ) COMBAT_SUPPORT_SELECTED = ButtonWrapper( diff --git a/tasks/combat/support.py b/tasks/combat/support.py index 57f0c86df..8ea5523ba 100644 --- a/tasks/combat/support.py +++ b/tasks/combat/support.py @@ -1,5 +1,6 @@ import cv2 import numpy as np +from py import log from scipy import signal from module.base.button import Button, ButtonWrapper @@ -55,7 +56,7 @@ class SupportCharacter: return SupportCharacter._image_cache[self.name] img = load_image(f"assets/character/{self.name}.png") - scaled_img = cv2.resize(img, (85, 82)) + scaled_img = cv2.resize(img, (86, 81)) SupportCharacter._image_cache[self.name] = scaled_img logger.info(f"Character {self.name} image cached") return scaled_img @@ -301,7 +302,7 @@ class CombatSupport(UI): self.device.screenshot() # End - if self.match_template(COMBAT_SUPPORT_SELECTED): + if self.appear(COMBAT_SUPPORT_SELECTED, similarity=0.75): return True if interval.reached(): From 4bb0cd6ef6cfb6aa043d6716e5de95c34abd9a3b Mon Sep 17 00:00:00 2001 From: Zebartin <16185081+Zebartin@users.noreply.github.com> Date: Wed, 7 Feb 2024 21:43:20 +0800 Subject: [PATCH 40/65] Add: Add i18n auto generation for assignments (#308) --- dev_tools/keyword_extract.py | 15 +- dev_tools/keywords/assignment.py | 123 ++++++++++++++ module/config/argument/argument.yaml | 8 +- module/config/config_updater.py | 21 ++- module/config/i18n/en-US.json | 64 +++---- module/config/i18n/es-ES.json | 104 ++++++------ module/config/i18n/ja-JP.json | 96 +++++------ module/config/i18n/zh-CN.json | 88 +++++----- module/config/i18n/zh-TW.json | 96 +++++------ tasks/assignment/keywords/__init__.py | 1 + tasks/assignment/keywords/classes.py | 5 + tasks/assignment/keywords/entry_detailed.py | 176 ++++++++++++++++++++ 12 files changed, 548 insertions(+), 249 deletions(-) create mode 100644 dev_tools/keywords/assignment.py create mode 100644 tasks/assignment/keywords/entry_detailed.py diff --git a/dev_tools/keyword_extract.py b/dev_tools/keyword_extract.py index b42a0bec1..5b2cc2947 100644 --- a/dev_tools/keyword_extract.py +++ b/dev_tools/keyword_extract.py @@ -307,19 +307,8 @@ class KeywordExtract: self.clear_keywords() def generate_assignments(self): - self.load_keywords(['空间站特派']) - self.write_keywords( - keyword_class='AssignmentEventGroup', - output_file='./tasks/assignment/keywords/event_group.py' - ) - for file_name, class_name, output_file in ( - ('ExpeditionGroup.json', 'AssignmentGroup', './tasks/assignment/keywords/group.py'), - ('ExpeditionData.json', 'AssignmentEntry', './tasks/assignment/keywords/entry.py'), - ('ActivityExpedition.json', 'AssignmentEventEntry', './tasks/assignment/keywords/event_entry.py'), - ): - file = os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', file_name) - self.load_keywords(deep_get(data, 'Name.Hash') for data in read_file(file).values()) - self.write_keywords(keyword_class=class_name, output_file=output_file) + from dev_tools.keywords.assignment import GenerateAssignment + GenerateAssignment()() def generate_map_planes(self): from dev_tools.keywords.map_world import GenerateMapWorld diff --git a/dev_tools/keywords/assignment.py b/dev_tools/keywords/assignment.py new file mode 100644 index 000000000..30dadcb25 --- /dev/null +++ b/dev_tools/keywords/assignment.py @@ -0,0 +1,123 @@ +from functools import cache +from typing import Iterable + +from dev_tools.keywords.base import UI_LANGUAGES, GenerateKeyword +from module.config.utils import deep_get + + +@cache +def get_assignment_entry_data(): + """ + Returns: + dict: key - assignment text_id + value - text_id of reward items + """ + expedition_namehash_to_id = { + deep_get(expedition, 'Name.Hash'): deep_get(expedition, 'ExpeditionID') + for expedition in GenerateKeyword.read_file('./ExcelOutput/ExpeditionData.json').values() + } + expedition_id_to_reward_id = { + deep_get(expedition, '4.2.ExpeditionID'): deep_get(expedition, '4.2.RewardID') + for expedition in GenerateKeyword.read_file('./ExcelOutput/ExpeditionReward.json').values() + } + reward_id_to_item_ids = { + deep_get(reward, 'RewardID'): [ + v for k, v in reward.items() + if k.startswith('ItemID') + ] + for reward in GenerateKeyword.read_file('./ExcelOutput/RewardData.json').values() + } + item_id_to_namehash = { + deep_get(item, 'ID'): deep_get(item, 'ItemName.Hash') + for item in GenerateKeyword.read_file('./ExcelOutput/ItemConfig.json').values() + } + item_name_remap = { + '旅情见闻': '角色经验材料', + '稀薄以太': '光锥经验材料' + } + ret = dict() + for expedition_namehash, expedition_id in expedition_namehash_to_id.items(): + reward_id = expedition_id_to_reward_id[expedition_id] + item_ids = reward_id_to_item_ids[reward_id] + item_names = [item_id_to_namehash[x] for x in item_ids] + if len(item_names) == 1: + item = GenerateKeyword.find_keyword(item_names[0], lang='cn')[1] + if item in item_name_remap: + item_names = [GenerateKeyword.find_keyword( + item_name_remap[item], lang='cn')[0]] + ret[expedition_namehash] = item_names + return ret + + +class GenerateAssignment(GenerateKeyword): + def generate(self): + GenerateAssignmentGroup()() + GenerateAssignmentEntry()() + GenerateAssignmentEventGroup()() + GenerateAssignmentEventEntry()() + GenerateAssignmentEntryDetailed()() + + +class GenerateAssignmentGroup(GenerateKeyword): + output_file = './tasks/assignment/keywords/group.py' + + def iter_keywords(self) -> Iterable[dict]: + for group in self.read_file('./ExcelOutput/ExpeditionGroup.json').values(): + yield dict(text_id=deep_get(group, 'Name.Hash')) + + +class GenerateAssignmentEntry(GenerateKeyword): + output_file = './tasks/assignment/keywords/entry.py' + + def iter_keywords(self) -> Iterable[dict]: + for k in get_assignment_entry_data().keys(): + yield dict(text_id=k) + + +class GenerateAssignmentEntryDetailed(GenerateKeyword): + output_file = './tasks/assignment/keywords/entry_detailed.py' + + def iter_keywords(self) -> Iterable[dict]: + for assignment_id, reward_ids in get_assignment_entry_data().items(): + yield dict( + text_id=assignment_id, + reward_ids=reward_ids + ) + + def iter_rows(self) -> Iterable[dict]: + for keyword in super().iter_rows(): + reward_ids = keyword.pop('reward_ids') + for lang in UI_LANGUAGES: + assignment_name = keyword[lang] + reward_name = ' & '.join( + self.find_keyword(reward_id, lang=lang)[1] + for reward_id in reward_ids + ) + name_format = '{reward_name} ({assignment_name})' if lang in { + 'en', 'es'} else '{reward_name}({assignment_name})' + keyword[lang] = name_format.format( + reward_name=reward_name, + assignment_name=assignment_name + ) + yield keyword + + +class GenerateAssignmentEventGroup(GenerateKeyword): + output_file = './tasks/assignment/keywords/event_group.py' + + def iter_keywords(self) -> Iterable[dict]: + yield dict(text_id=self.find_keyword('空间站特派', lang='cn')[0]) + + +class GenerateAssignmentEventEntry(GenerateKeyword): + output_file = './tasks/assignment/keywords/event_entry.py' + + def iter_keywords(self) -> Iterable[dict]: + for expedition in self.read_file('./ExcelOutput/ActivityExpedition.json').values(): + yield dict(text_id=deep_get(expedition, 'Name.Hash')) + + +if __name__ == "__main__": + from dev_tools.keywords.base import TextMap + TextMap.DATA_FOLDER = '../StarRailData' + GenerateAssignment()() diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 66b0eff29..871437c39 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -182,16 +182,16 @@ Assignment: # Options in Name_x will be injected in config updater Name_1: value: Nameless_Land_Nameless_People - option: [ Nameless_Land_Nameless_People, ] + option: [ ] Name_2: value: Akashic_Records - option: [ Nameless_Land_Nameless_People, ] + option: [ ] Name_3: value: The_Invisible_Hand - option: [ Nameless_Land_Nameless_People, ] + option: [ ] Name_4: value: Nine_Billion_Names - option: [ Nameless_Land_Nameless_People, ] + option: [ ] Duration: value: 20 option: [ 4, 8, 12, 20 ] diff --git a/module/config/config_updater.py b/module/config/config_updater.py index 2cad4afb8..4d204d697 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -115,6 +115,11 @@ class ConfigGenerator: 'option_bold': ['achievable'], 'option_light': ['not_supported'], }) + # Insert assignments + from tasks.assignment.keywords import AssignmentEntry + assignments = [entry.name for entry in AssignmentEntry.instances.values()] + for i in range(4): + option_add(keys=f'Assignment.Name_{i + 1}.option', options=assignments) # Load for path, value in deep_iter(raw, depth=2): @@ -459,6 +464,14 @@ class ConfigGenerator: value = deep_get(new, keys=['AchievableQuest', copy_from, option]) deep_set(new, keys=['AchievableQuest', quest.name, option], value=value) + # Assignments + from tasks.assignment.keywords import AssignmentEntryDetailed + for entry in AssignmentEntryDetailed.instances.values(): + entry: AssignmentEntryDetailed + value = entry.__getattribute__(ingame_lang) + for i in range(4): + deep_set(new, keys=['Assignment', f'Name_{i + 1}', entry.name], value=value) + # Echo of War dungeons = [d for d in DungeonList.instances.values() if d.is_Echo_of_War] for dungeon in dungeons: @@ -604,20 +617,12 @@ class ConfigGenerator: update('./webapp/packages/main/public/deploy.yaml.tpl', tpl) - def insert_assignment(self): - from tasks.assignment.keywords import AssignmentEntry - assignments = [entry.name for entry in AssignmentEntry.instances.values()] - for i in range(4): - deep_set(self.argument, keys=f'Assignment.Name_{i + 1}.option', value=assignments) - deep_set(self.args, keys=f'Assignment.Assignment.Name_{i + 1}.option', value=assignments) - @timer def generate(self): _ = self.args _ = self.menu _ = self.stored # _ = self.event - self.insert_assignment() # self.insert_server() write_file(filepath_args(), self.args) write_file(filepath_args('menu'), self.menu) diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 33b6d024b..363b470d8 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -773,19 +773,19 @@ "Born_to_Obey": "Ancient Part (Born to Obey)", "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", "The_Invisible_Hand": "Credit (The Invisible Hand)", "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Virtual Particle & Solid Water (Spring of Life)", - "The_Land_of_Gold": "Protein Rice & Basic Ingredients (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Jade Abacus Unit & Discarded Ingenium Parts (Legend of the Puppet Master)", - "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" }, "Name_2": { "name": "Assignment 2 Preference", @@ -796,19 +796,19 @@ "Born_to_Obey": "Ancient Part (Born to Obey)", "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", "The_Invisible_Hand": "Credit (The Invisible Hand)", "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Virtual Particle & Solid Water (Spring of Life)", - "The_Land_of_Gold": "Protein Rice & Basic Ingredients (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Jade Abacus Unit & Discarded Ingenium Parts (Legend of the Puppet Master)", - "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" }, "Name_3": { "name": "Assignment 3 Preference", @@ -819,19 +819,19 @@ "Born_to_Obey": "Ancient Part (Born to Obey)", "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", "The_Invisible_Hand": "Credit (The Invisible Hand)", "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Virtual Particle & Solid Water (Spring of Life)", - "The_Land_of_Gold": "Protein Rice & Basic Ingredients (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Jade Abacus Unit & Discarded Ingenium Parts (Legend of the Puppet Master)", - "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" }, "Name_4": { "name": "Assignment 4 Preference", @@ -842,19 +842,19 @@ "Born_to_Obey": "Ancient Part (Born to Obey)", "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", "The_Invisible_Hand": "Credit (The Invisible Hand)", "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Virtual Particle & Solid Water (Spring of Life)", - "The_Land_of_Gold": "Protein Rice & Basic Ingredients (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Jade Abacus Unit & Discarded Ingenium Parts (Legend of the Puppet Master)", - "The_Wages_of_Humanity": "Extract of Medicinal Herbs & Human-Height Auspicious Crops (The Wages of Humanity)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" }, "Duration": { "name": "Dispatch Duration", diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index 7cf46d0fd..565a26617 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -768,93 +768,93 @@ "name": "Preferencia de Encargo 1", "help": "", "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucci´pon del destructor)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", "Born_to_Obey": "Componente antiguo (Creados para obedecer)", "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", - "Akashic_Records": "Material de EXP de cono de luz (Los Registros de Akasha)", - "The_Invisible_Hand": "Créditos (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto y Metal (Abandonado e insultado)", - "Spring_of_Life": "Partícula virtual y Agua sólida (La fuente de la vida)", - "The_Land_of_Gold": "Arroz protéico e Ingredientes básicos (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso y Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Unidad de ábaco de jade y Componentes mecánicos abandonados (La leyenda del titiritero)", - "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "The_Invisible_Hand": "Crédito (La mano invisible)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" }, "Name_2": { "name": "Preferencia de Encargo 2", "help": "", "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucci´pon del destructor)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", "Born_to_Obey": "Componente antiguo (Creados para obedecer)", "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", - "Akashic_Records": "Material de EXP de cono de luz (Los Registros de Akasha)", - "The_Invisible_Hand": "Créditos (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto y Metal (Abandonado e insultado)", - "Spring_of_Life": "Partícula virtual y Agua sólida (La fuente de la vida)", - "The_Land_of_Gold": "Arroz protéico e Ingredientes básicos (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso y Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Unidad de ábaco de jade y Componentes mecánicos abandonados (La leyenda del titiritero)", - "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "The_Invisible_Hand": "Crédito (La mano invisible)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" }, "Name_3": { "name": "Preferencia de Encargo 3", "help": "", "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucci´pon del destructor)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", "Born_to_Obey": "Componente antiguo (Creados para obedecer)", "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", - "Akashic_Records": "Material de EXP de cono de luz (Los Registros de Akasha)", - "The_Invisible_Hand": "Créditos (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto y Metal (Abandonado e insultado)", - "Spring_of_Life": "Partícula virtual y Agua sólida (La fuente de la vida)", - "The_Land_of_Gold": "Arroz protéico e Ingredientes básicos (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso y Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Unidad de ábaco de jade y Componentes mecánicos abandonados (La leyenda del titiritero)", - "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "The_Invisible_Hand": "Crédito (La mano invisible)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" }, "Name_4": { "name": "Preferencia de Encargo 4", "help": "", "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucci´pon del destructor)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", "Born_to_Obey": "Componente antiguo (Creados para obedecer)", "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", - "Akashic_Records": "Material de EXP de cono de luz (Los Registros de Akasha)", - "The_Invisible_Hand": "Créditos (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto y Metal (Abandonado e insultado)", - "Spring_of_Life": "Partícula virtual y Agua sólida (La fuente de la vida)", - "The_Land_of_Gold": "Arroz protéico e Ingredientes básicos (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso y Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Unidad de ábaco de jade y Componentes mecánicos abandonados (La leyenda del titiritero)", - "The_Wages_of_Humanity": "Extracto de hierbas medicinales y Cosecha tan alta como una persona (La paga de la humanidad)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "The_Invisible_Hand": "Crédito (La mano invisible)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" }, "Duration": { "name": "Duración del encargo", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 702f46fb8..147956a39 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -773,19 +773,19 @@ "Born_to_Obey": "古代パーツ(生まれながらに服従する)", "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People": "キャラクターの経験値素材(無名の地、無名の人)", - "Akashic_Records": "光円錐強化素材(アーカーシャの記録)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素と金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "仮想粒子と固形純水(生命の泉)", - "The_Land_of_Gold": "タンパク米と基本食材(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体と種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "玉兆単元&廃棄された機巧部品(傀儡師伝説)", - "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" }, "Name_2": { "name": "依頼 2", @@ -796,19 +796,19 @@ "Born_to_Obey": "古代パーツ(生まれながらに服従する)", "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People": "キャラクターの経験値素材(無名の地、無名の人)", - "Akashic_Records": "光円錐強化素材(アーカーシャの記録)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素と金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "仮想粒子と固形純水(生命の泉)", - "The_Land_of_Gold": "タンパク米と基本食材(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体と種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "玉兆単元&廃棄された機巧部品(傀儡師伝説)", - "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" }, "Name_3": { "name": "依頼 3", @@ -819,19 +819,19 @@ "Born_to_Obey": "古代パーツ(生まれながらに服従する)", "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People": "キャラクターの経験値素材(無名の地、無名の人)", - "Akashic_Records": "光円錐強化素材(アーカーシャの記録)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素と金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "仮想粒子と固形純水(生命の泉)", - "The_Land_of_Gold": "タンパク米と基本食材(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体と種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "玉兆単元&廃棄された機巧部品(傀儡師伝説)", - "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" }, "Name_4": { "name": "依頼 4", @@ -842,19 +842,19 @@ "Born_to_Obey": "古代パーツ(生まれながらに服従する)", "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People": "キャラクターの経験値素材(無名の地、無名の人)", - "Akashic_Records": "光円錐強化素材(アーカーシャの記録)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素と金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "仮想粒子と固形純水(生命の泉)", - "The_Land_of_Gold": "タンパク米と基本食材(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体と種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "玉兆単元&廃棄された機巧部品(傀儡師伝説)", - "The_Wages_of_Humanity": "薬草抽出物&一人稲(人類扶養)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" }, "Duration": { "name": "派遣時間", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 5e30b606d..f9889c70e 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -773,19 +773,19 @@ "Born_to_Obey": "古代零件(生而服从)", "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", - "Akashic_Records": "光锥强化材料(阿卡夏记录)", + "Akashic_Records": "光锥经验材料(阿卡夏记录)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素&金属(被废弃与损害的)", - "Spring_of_Life": "虚粒子&固态净水(生命之泉)", - "The_Land_of_Gold": "蛋白米&基本食材(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体&种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "玉兆单元&废弃机巧零件(偃师传说)", - "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" }, "Name_2": { "name": "第2个委托选择", @@ -796,19 +796,19 @@ "Born_to_Obey": "古代零件(生而服从)", "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", - "Akashic_Records": "光锥强化材料(阿卡夏记录)", + "Akashic_Records": "光锥经验材料(阿卡夏记录)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素&金属(被废弃与损害的)", - "Spring_of_Life": "虚粒子&固态净水(生命之泉)", - "The_Land_of_Gold": "蛋白米&基本食材(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体&种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "玉兆单元&废弃机巧零件(偃师传说)", - "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" }, "Name_3": { "name": "第3个委托选择", @@ -819,19 +819,19 @@ "Born_to_Obey": "古代零件(生而服从)", "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", - "Akashic_Records": "光锥强化材料(阿卡夏记录)", + "Akashic_Records": "光锥经验材料(阿卡夏记录)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素&金属(被废弃与损害的)", - "Spring_of_Life": "虚粒子&固态净水(生命之泉)", - "The_Land_of_Gold": "蛋白米&基本食材(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体&种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "玉兆单元&废弃机巧零件(偃师传说)", - "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" }, "Name_4": { "name": "第4个委托选择", @@ -842,19 +842,19 @@ "Born_to_Obey": "古代零件(生而服从)", "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", - "Akashic_Records": "光锥强化材料(阿卡夏记录)", + "Akashic_Records": "光锥经验材料(阿卡夏记录)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素&金属(被废弃与损害的)", - "Spring_of_Life": "虚粒子&固态净水(生命之泉)", - "The_Land_of_Gold": "蛋白米&基本食材(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体&种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "玉兆单元&废弃机巧零件(偃师传说)", - "The_Wages_of_Humanity": "药草提取物&一人嘉禾(赡养人类)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" }, "Duration": { "name": "派遣时长", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 5ff9247a2..a8515349b 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -773,19 +773,19 @@ "Born_to_Obey": "古代零件(生而服從)", "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People": "角色經驗材料(無名之地,無名之人)", - "Akashic_Records": "光錐強化材料(阿卡夏記錄)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素&金屬(被廢棄與損害的)", - "Spring_of_Life": "虛粒子&固態淨水(生命之泉)", - "The_Land_of_Gold": "蛋白米&基本食材(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體&種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "玉兆單元&廢棄機巧零件(偃師傳說)", - "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" }, "Name_2": { "name": "第2個委託選擇", @@ -796,19 +796,19 @@ "Born_to_Obey": "古代零件(生而服從)", "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People": "角色經驗材料(無名之地,無名之人)", - "Akashic_Records": "光錐強化材料(阿卡夏記錄)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素&金屬(被廢棄與損害的)", - "Spring_of_Life": "虛粒子&固態淨水(生命之泉)", - "The_Land_of_Gold": "蛋白米&基本食材(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體&種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "玉兆單元&廢棄機巧零件(偃師傳說)", - "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" }, "Name_3": { "name": "第3個委託選擇", @@ -819,19 +819,19 @@ "Born_to_Obey": "古代零件(生而服從)", "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People": "角色經驗材料(無名之地,無名之人)", - "Akashic_Records": "光錐強化材料(阿卡夏記錄)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素&金屬(被廢棄與損害的)", - "Spring_of_Life": "虛粒子&固態淨水(生命之泉)", - "The_Land_of_Gold": "蛋白米&基本食材(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體&種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "玉兆單元&廢棄機巧零件(偃師傳說)", - "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" }, "Name_4": { "name": "第4個委託選擇", @@ -842,19 +842,19 @@ "Born_to_Obey": "古代零件(生而服從)", "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "A_Startling_Night_Terror", - "Tranquility_of_Vimala_bhumi": "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People": "角色經驗材料(無名之地,無名之人)", - "Akashic_Records": "光錐強化材料(阿卡夏記錄)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素&金屬(被廢棄與損害的)", - "Spring_of_Life": "虛粒子&固態淨水(生命之泉)", - "The_Land_of_Gold": "蛋白米&基本食材(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體&種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "玉兆單元&廢棄機巧零件(偃師傳說)", - "The_Wages_of_Humanity": "藥草萃取物&一人嘉禾(贍養人類)", - "Fragments_of_Illusory_Dreams": "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver": "Scalpel_and_Screwdriver" + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" }, "Duration": { "name": "派遣時間", diff --git a/tasks/assignment/keywords/__init__.py b/tasks/assignment/keywords/__init__.py index 9d3e39402..ab95755a7 100644 --- a/tasks/assignment/keywords/__init__.py +++ b/tasks/assignment/keywords/__init__.py @@ -1,4 +1,5 @@ import tasks.assignment.keywords.entry as KEYWORDS_ASSIGNMENT_ENTRY +import tasks.assignment.keywords.entry_detailed as KEYWORDS_ASSIGNMENT_ENTRY_DETAILED import tasks.assignment.keywords.group as KEYWORDS_ASSIGNMENT_GROUP import tasks.assignment.keywords.event_entry as KEYWORDS_ASSIGNMENT_EVENT_ENTRY import tasks.assignment.keywords.event_group as KEYWORDS_ASSIGNMENT_EVENT_GROUP diff --git a/tasks/assignment/keywords/classes.py b/tasks/assignment/keywords/classes.py index e5a7c774d..cbb2cd008 100644 --- a/tasks/assignment/keywords/classes.py +++ b/tasks/assignment/keywords/classes.py @@ -20,6 +20,11 @@ class AssignmentEntry(Keyword): return super().__hash__() +@dataclass(repr=False) +class AssignmentEntryDetailed(Keyword): + instances: ClassVar = {} + + @dataclass(repr=False) class AssignmentEventGroup(AssignmentGroup): instances: ClassVar = {} diff --git a/tasks/assignment/keywords/entry_detailed.py b/tasks/assignment/keywords/entry_detailed.py new file mode 100644 index 000000000..418e8f578 --- /dev/null +++ b/tasks/assignment/keywords/entry_detailed.py @@ -0,0 +1,176 @@ +from .classes import AssignmentEntryDetailed + +# This file was auto-generated, do not modify it manually. To generate: +# ``` python -m dev_tools.keyword_extract ``` + +Nine_Billion_Names = AssignmentEntryDetailed( + id=1, + name='Nine_Billion_Names', + cn='熄灭原核(九十亿个名字)', + cht='熄滅原核(九十億個名字)', + en='Extinguished Core (Nine Billion Names)', + jp='消滅した原核(九十億の御名)', + es='Núcleo apagado (Nueve mil millones de nombres)', +) +Destruction_of_the_Destroyer = AssignmentEntryDetailed( + id=2, + name='Destruction_of_the_Destroyer', + cn='掠夺的本能(毁灭者的覆灭)', + cht='掠奪的本能(毀滅者的覆滅)', + en="Thief's Instinct (Destruction of the Destroyer)", + jp='略奪の本能(壊滅者の覆没)', + es='Instinto del ladrón (La destrucción del destructor)', +) +Winter_Soldiers = AssignmentEntryDetailed( + id=3, + name='Winter_Soldiers', + cn='铁卫扣饰(寒冬的战士们)', + cht='鐵衛扣飾(寒冬的戰士們)', + en='Silvermane Badge (Winter Soldiers)', + jp='シルバーメインの釦(寒冬の戦士たち)', + es='Pin del guardia (Los guerreros del invierno)', +) +Born_to_Obey = AssignmentEntryDetailed( + id=4, + name='Born_to_Obey', + cn='古代零件(生而服从)', + cht='古代零件(生而服從)', + en='Ancient Part (Born to Obey)', + jp='古代パーツ(生まれながらに服従する)', + es='Componente antiguo (Creados para obedecer)', +) +Root_Out_the_Turpitude = AssignmentEntryDetailed( + id=5, + name='Root_Out_the_Turpitude', + cn='永寿幼芽(根除恶孽)', + cht='永壽幼芽(根除惡孽)', + en='Immortal Scionette (Root Out the Turpitude)', + jp='永寿の萌芽(悪孽を根絶やしに)', + es='Brote verde inmortal (La raíz del mal)', +) +Fire_Lord_Inflames_Blades_of_War = AssignmentEntryDetailed( + id=6, + name='Fire_Lord_Inflames_Blades_of_War', + cn='工造机杼(火帝动炉销剑戟)', + cht='工造機杼(火帝動爐銷劍戟)', + en="Artifex's Module (Fire Lord Inflames Blades of War)", + jp='工造機関(剣戟を焼却する火帝炉)', + es='Componente artificial mecánico (Prendan los fuelles, fundan las armas)', +) +A_Startling_Night_Terror = AssignmentEntryDetailed( + id=7, + name='A_Startling_Night_Terror', + cn='蓄梦元件(劫梦惊魂)', + cht='蓄夢元件(劫夢驚魂)', + en='Dream Collection Component (A Startling Night Terror)', + jp='ドリームコレクションパーツ(魂震える悪夢)', + es='Componente del acumulador de sueños (Pesadilla aterradora)', +) +Tranquility_of_Vimala_bhumi = AssignmentEntryDetailed( + id=8, + name='Tranquility_of_Vimala_bhumi', + cn='思绪末屑(离垢清净)', + cht='思緒末屑(離垢清淨)', + en='Tatters of Thought (Tranquility of Vimala-bhumi)', + jp='思考の粉末(離垢清浄)', + es='Jirones de pensamientos (Limpieza y purificación)', +) +Nameless_Land_Nameless_People = AssignmentEntryDetailed( + id=9, + name='Nameless_Land_Nameless_People', + cn='角色经验材料(无名之地,无名之人)', + cht='角色經驗素材(無名之地,無名之人)', + en='Character EXP Material (Nameless Land, Nameless People)', + jp='キャラクター経験値素材(無名の地、無名の人)', + es='Material de EXP de personaje (Lugar anónimo, personas anónimas)', +) +Akashic_Records = AssignmentEntryDetailed( + id=10, + name='Akashic_Records', + cn='光锥经验材料(阿卡夏记录)', + cht='光錐經驗素材(阿卡夏紀錄)', + en='Light Cone EXP Material (Akashic Records)', + jp='光円錐経験値素材(アーカーシャの記録)', + es='Material de EXP de conos de luz (Los Registros de Akasha)', +) +The_Invisible_Hand = AssignmentEntryDetailed( + id=11, + name='The_Invisible_Hand', + cn='信用点(看不见的手)', + cht='信用點(看不見的手)', + en='Credit (The Invisible Hand)', + jp='信用ポイント(見えざる手)', + es='Crédito (La mano invisible)', +) +Abandoned_and_Insulted = AssignmentEntryDetailed( + id=12, + name='Abandoned_and_Insulted', + cn='燃素 & 金属(被废弃与损害的)', + cht='燃素 & 金屬(被廢棄與損害的)', + en='Phlogiston & Metal (Abandoned and Insulted)', + jp='燃素 & 金属(捨てられしものと傷つけられしもの)', + es='Flogisto & Metal (Abandonado e insultado)', +) +Spring_of_Life = AssignmentEntryDetailed( + id=13, + name='Spring_of_Life', + cn='固态净水 & 虚粒子(生命之泉)', + cht='固態淨水 & 虛粒子(生命之泉)', + en='Solid Water & Virtual Particle (Spring of Life)', + jp='固形純水 & 仮想粒子(生命の泉)', + es='Agua sólida & Partícula virtual (La fuente de la vida)', +) +The_Land_of_Gold = AssignmentEntryDetailed( + id=14, + name='The_Land_of_Gold', + cn='基本食材 & 蛋白米(黄金大地)', + cht='基本食材 & 蛋白米(黃金大地)', + en='Basic Ingredients & Protein Rice (The Land of Gold)', + jp='基本食材 & タンパク米(黄金の大地)', + es='Ingredientes básicos & Arroz proteico (Tierra de oportunidades)', +) +The_Blossom_in_the_Storm = AssignmentEntryDetailed( + id=15, + name='The_Blossom_in_the_Storm', + cn='气态流体 & 种子(风暴中怒放的花)', + cht='氣態流體 & 種子(風暴中怒放的花)', + en='Gaseous Liquid & Seed (The Blossom in the Storm)', + jp='気態流体 & 種子(嵐の中で咲き誇る花)', + es='Líquido gaseoso & Semilla (Flores en la tormenta)', +) +Legend_of_the_Puppet_Master = AssignmentEntryDetailed( + id=16, + name='Legend_of_the_Puppet_Master', + cn='废弃机巧零件 & 玉兆单元(偃师传说)', + cht='廢棄機巧零件 & 玉兆單元(偃師傳說)', + en='Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)', + jp='廃棄された機巧部品 & 玉兆単元(傀儡師伝説)', + es='Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)', +) +The_Wages_of_Humanity = AssignmentEntryDetailed( + id=17, + name='The_Wages_of_Humanity', + cn='一人嘉禾 & 药草提取物(赡养人类)', + cht='一人嘉禾 & 藥草萃取物(贍養人類)', + en='Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)', + jp='一人稲 & 薬草抽出物(人類扶養)', + es='Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)', +) +Fragments_of_Illusory_Dreams = AssignmentEntryDetailed( + id=18, + name='Fragments_of_Illusory_Dreams', + cn='安逸 & 碎梦(幻梦的残片)', + cht='安逸 & 碎夢(幻夢的殘片)', + en='Tranquility & Broken Dreams (Fragments of Illusory Dreams)', + jp='安逸 & 砕けた夢(幻夢の残片)', + es='Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)', +) +Scalpel_and_Screwdriver = AssignmentEntryDetailed( + id=19, + name='Scalpel_and_Screwdriver', + cn='锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)', + cht='鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)', + en='Rusty Gear & Old Molar (Scalpel and Screwdriver)', + jp='錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)', + es='Engranaje oxidado & Muela vieja (Bisturí y destornillador)', +) From 7e8963d88ca5e0dc090aa567f09c53f6654b5edc Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Wed, 7 Feb 2024 22:07:40 +0800 Subject: [PATCH 41/65] I18n: Update relic sets --- module/config/config_updater.py | 12 ++++++++ module/config/i18n/en-US.json | 6 ++-- module/config/i18n/es-ES.json | 12 ++++---- module/config/i18n/ja-JP.json | 54 ++++++++++++++++----------------- module/config/i18n/zh-CN.json | 6 ++-- module/config/i18n/zh-TW.json | 6 ++-- 6 files changed, 54 insertions(+), 42 deletions(-) diff --git a/module/config/config_updater.py b/module/config/config_updater.py index 4d204d697..e71ef205a 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -399,6 +399,13 @@ class ConfigGenerator: 'en': 'Trace: {path} ({plane})', 'es': 'Rastros: {path} ({plane})', } + i18n_relic = { + 'cn': '({dungeon})', + 'cht': '({dungeon})', + 'jp': '({dungeon})', + 'en': ' ({dungeon})', + 'es': ' ({dungeon})', + } from tasks.dungeon.keywords import DungeonList, DungeonDetailed for dungeon in DungeonList.instances.values(): dungeon: DungeonList = dungeon @@ -421,6 +428,11 @@ class ConfigGenerator: path = dungeon.Calyx_Crimson_Path.__getattribute__(ingame_lang) deep_set(new, keys=['Dungeon', 'Name', dungeon.name], value=i18n_crimson[ingame_lang].format(path=path, plane=plane)) + if dungeon.is_Cavern_of_Corrosion: + value = deep_get(new, keys=['Dungeon', 'Name', dungeon.name], default='') + suffix = i18n_relic[ingame_lang].format(dungeon=dungeon_name) + if not value.endswith(suffix): + deep_set(new, keys=['Dungeon', 'Name', dungeon.name], value=f'{value}{suffix}') # Stagnant shadows with character names for dungeon in DungeonDetailed.instances.values(): diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 363b470d8..f071fade4 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -266,7 +266,7 @@ "Cavern_of_Corrosion_Path_of_Conflagration": "Relics: Fire Set & Imaginary Set (Path of Conflagration)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Relics: HP Set & SPD Set (Path of Elixir Seekers)", "Cavern_of_Corrosion_Path_of_Darkness": "Relics: Pursuit Set & Dot Set (Path of Darkness)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "Relics: Debuff Set & Break Effect Set (Path of Dreamdive)" }, "NameAtDoubleCalyx": { "name": "At Double Calyx Event, choose dungeon", @@ -304,7 +304,7 @@ "Cavern_of_Corrosion_Path_of_Conflagration": "Relics: Fire Set & Imaginary Set (Path of Conflagration)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Relics: HP Set & SPD Set (Path of Elixir Seekers)", "Cavern_of_Corrosion_Path_of_Darkness": "Relics: Pursuit Set & Dot Set (Path of Darkness)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "Relics: Debuff Set & Break Effect Set (Path of Dreamdive)" }, "Team": { "name": "Dungeon Team", @@ -387,7 +387,7 @@ "Cavern_of_Corrosion_Path_of_Conflagration": "Relics: Fire Set & Imaginary Set (Path of Conflagration)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Relics: HP Set & SPD Set (Path of Elixir Seekers)", "Cavern_of_Corrosion_Path_of_Darkness": "Relics: Pursuit Set & Dot Set (Path of Darkness)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "Relics: Debuff Set & Break Effect Set (Path of Dreamdive)" } }, "DungeonSupport": { diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index 565a26617..41deed116 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -261,12 +261,12 @@ "Cavern_of_Corrosion_Path_of_Gelid_Wind": "Artefactos: Hielo y Viento (Senda del viento gélido)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "Artefactos: Físico y Efecto de Ruptura (Senda de los puños rápidos)", "Cavern_of_Corrosion_Path_of_Drifting": "Artefactos: Curación y Pistolera de la espiga silvestre (Senda de la deriva)", - "Cavern_of_Corrosion_Path_of_Providence": "Artefactos: Guardia de la nieve y Cuántico (Senda de al providencia)", + "Cavern_of_Corrosion_Path_of_Providence": "Artefactos: Guardia de la nieve y Cuántico (Senda de al providencia) (Senda de la providencia)", "Cavern_of_Corrosion_Path_of_Holy_Hymn": "Artefactos: Defensa y Trueno (Senda del himno sagrado)", "Cavern_of_Corrosion_Path_of_Conflagration": "Artefactos: Fuego e Imaginario (Senda de la conflagración)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Artefactos: HP y SPD (Senda de los elixires)", "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "Artefactos: Debuff y Efecto de Ruptura (Senda de los sueños)" }, "NameAtDoubleCalyx": { "name": "En los eventos de x2 de Cáliz", @@ -299,12 +299,12 @@ "Cavern_of_Corrosion_Path_of_Gelid_Wind": "Artefactos: Hielo y Viento (Senda del viento gélido)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "Artefactos: Físico y Efecto de Ruptura (Senda de los puños rápidos)", "Cavern_of_Corrosion_Path_of_Drifting": "Artefactos: Curación y Pistolera de la espiga silvestre (Senda de la deriva)", - "Cavern_of_Corrosion_Path_of_Providence": "Artefactos: Guardia de la nieve y Cuántico (Senda de al providencia)", + "Cavern_of_Corrosion_Path_of_Providence": "Artefactos: Guardia de la nieve y Cuántico (Senda de al providencia) (Senda de la providencia)", "Cavern_of_Corrosion_Path_of_Holy_Hymn": "Artefactos: Defensa y Trueno (Senda del himno sagrado)", "Cavern_of_Corrosion_Path_of_Conflagration": "Artefactos: Fuego e Imaginario (Senda de la conflagración)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Artefactos: HP y SPD (Senda de los elixires)", "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "Artefactos: Debuff y Efecto de Ruptura (Senda de los sueños)" }, "Team": { "name": "Equipo de mazmorra", @@ -382,12 +382,12 @@ "Cavern_of_Corrosion_Path_of_Gelid_Wind": "Artefactos: Hielo y Viento (Senda del viento gélido)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "Artefactos: Físico y Efecto de Ruptura (Senda de los puños rápidos)", "Cavern_of_Corrosion_Path_of_Drifting": "Artefactos: Curación y Pistolera de la espiga silvestre (Senda de la deriva)", - "Cavern_of_Corrosion_Path_of_Providence": "Artefactos: Guardia de la nieve y Cuántico (Senda de al providencia)", + "Cavern_of_Corrosion_Path_of_Providence": "Artefactos: Guardia de la nieve y Cuántico (Senda de al providencia) (Senda de la providencia)", "Cavern_of_Corrosion_Path_of_Holy_Hymn": "Artefactos: Defensa y Trueno (Senda del himno sagrado)", "Cavern_of_Corrosion_Path_of_Conflagration": "Artefactos: Fuego e Imaginario (Senda de la conflagración)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Artefactos: HP y SPD (Senda de los elixires)", "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "Artefactos: Debuff y Efecto de Ruptura (Senda de los sueños)" } }, "DungeonSupport": { diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 147956a39..666ff6344 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -258,15 +258,15 @@ "Stagnant_Shadow_Roast": "キャラクター昇格素材:量子(花火)", "Stagnant_Shadow_Mirage": "キャラクター昇格素材:虚数(ヴェルト / 羅刹 / 御空)", "Stagnant_Shadow_Puppetry": "キャラクター昇格素材:虚数(丹恒・飲月 / Dr.レイシオ)", - "Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路", - "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路", - "Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路", - "Cavern_of_Corrosion_Path_of_Providence": "侵蝕トンネル・睿治の路", - "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路", - "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路", - "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路", - "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路", - "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路" + "Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路(侵蝕トンネル・霜風の路)", + "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路(侵蝕トンネル・迅拳の路)", + "Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路(侵蝕トンネル・漂泊の路)", + "Cavern_of_Corrosion_Path_of_Providence": "侵蝕トンネル・睿治の路(侵蝕トンネル・睿治の路)", + "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路(侵蝕トンネル・聖頌の路)", + "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路(侵蝕トンネル・野焔の路)", + "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路(侵蝕トンネル・薬使の路)", + "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路(侵蝕トンネル・幽冥の路)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路(侵蝕トンネル・夢潜の路)" }, "NameAtDoubleCalyx": { "name": "Dungeon.NameAtDoubleCalyx.name", @@ -296,15 +296,15 @@ "name": "Dungeon.NameAtDoubleRelic.name", "help": "Dungeon.NameAtDoubleRelic.help", "do_not_participate": "do_not_participate", - "Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路", - "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路", - "Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路", - "Cavern_of_Corrosion_Path_of_Providence": "侵蝕トンネル・睿治の路", - "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路", - "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路", - "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路", - "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路", - "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路" + "Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路(侵蝕トンネル・霜風の路)", + "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路(侵蝕トンネル・迅拳の路)", + "Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路(侵蝕トンネル・漂泊の路)", + "Cavern_of_Corrosion_Path_of_Providence": "侵蝕トンネル・睿治の路(侵蝕トンネル・睿治の路)", + "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路(侵蝕トンネル・聖頌の路)", + "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路(侵蝕トンネル・野焔の路)", + "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路(侵蝕トンネル・薬使の路)", + "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路(侵蝕トンネル・幽冥の路)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路(侵蝕トンネル・夢潜の路)" }, "Team": { "name": "Dungeon.Team.name", @@ -379,15 +379,15 @@ "name": "DungeonDaily.CavernOfCorrosion.name", "help": "DungeonDaily.CavernOfCorrosion.help", "do_not_achieve": "do_not_achieve", - "Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路", - "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路", - "Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路", - "Cavern_of_Corrosion_Path_of_Providence": "侵蝕トンネル・睿治の路", - "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路", - "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路", - "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路", - "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路", - "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路" + "Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路(侵蝕トンネル・霜風の路)", + "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路(侵蝕トンネル・迅拳の路)", + "Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路(侵蝕トンネル・漂泊の路)", + "Cavern_of_Corrosion_Path_of_Providence": "侵蝕トンネル・睿治の路(侵蝕トンネル・睿治の路)", + "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路(侵蝕トンネル・聖頌の路)", + "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路(侵蝕トンネル・野焔の路)", + "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路(侵蝕トンネル・薬使の路)", + "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路(侵蝕トンネル・幽冥の路)", + "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路(侵蝕トンネル・夢潜の路)" } }, "DungeonSupport": { diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index f9889c70e..be799b4a7 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -266,7 +266,7 @@ "Cavern_of_Corrosion_Path_of_Conflagration": "遗器:火套+虚数套(野焰之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遗器:生命套+速度套(药使之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套(幽冥之径•侵蚀隧洞)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "遗器:负面套+击破套(梦潜之径•侵蚀隧洞)" }, "NameAtDoubleCalyx": { "name": "有双倍花活动时,选择副本", @@ -304,7 +304,7 @@ "Cavern_of_Corrosion_Path_of_Conflagration": "遗器:火套+虚数套(野焰之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遗器:生命套+速度套(药使之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套(幽冥之径•侵蚀隧洞)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "遗器:负面套+击破套(梦潜之径•侵蚀隧洞)" }, "Team": { "name": "打本队伍", @@ -387,7 +387,7 @@ "Cavern_of_Corrosion_Path_of_Conflagration": "遗器:火套+虚数套(野焰之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遗器:生命套+速度套(药使之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套(幽冥之径•侵蚀隧洞)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "遗器:负面套+击破套(梦潜之径•侵蚀隧洞)" } }, "DungeonSupport": { diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index a8515349b..7e0af0ca2 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -266,7 +266,7 @@ "Cavern_of_Corrosion_Path_of_Conflagration": "遺器:火套+虛數套(野焰之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遺器:生命套+速度套(藥使之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套(幽冥之徑•侵蝕隧洞)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "遺器:負面套+擊破套(夢潛之徑•侵蝕隧洞)" }, "NameAtDoubleCalyx": { "name": "有雙倍花活動時,選擇副本", @@ -304,7 +304,7 @@ "Cavern_of_Corrosion_Path_of_Conflagration": "遺器:火套+虛數套(野焰之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遺器:生命套+速度套(藥使之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套(幽冥之徑•侵蝕隧洞)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "遺器:負面套+擊破套(夢潛之徑•侵蝕隧洞)" }, "Team": { "name": "打本隊伍", @@ -387,7 +387,7 @@ "Cavern_of_Corrosion_Path_of_Conflagration": "遺器:火套+虛數套(野焰之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遺器:生命套+速度套(藥使之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套(幽冥之徑•侵蝕隧洞)", - "Cavern_of_Corrosion_Path_of_Dreamdive": "Cavern_of_Corrosion_Path_of_Dreamdive" + "Cavern_of_Corrosion_Path_of_Dreamdive": "遺器:負面套+擊破套(夢潛之徑•侵蝕隧洞)" } }, "DungeonSupport": { From 6692b77db4ce93a44a3266f20d5fa1f01b64961e Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 10 Feb 2024 01:53:59 +0800 Subject: [PATCH 42/65] Fix: Optimize imports (fixed #314) --- tasks/combat/support.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tasks/combat/support.py b/tasks/combat/support.py index 8ea5523ba..8c63d4f23 100644 --- a/tasks/combat/support.py +++ b/tasks/combat/support.py @@ -1,18 +1,17 @@ import cv2 import numpy as np -from py import log from scipy import signal -from module.base.button import Button, ButtonWrapper +from module.base.button import Button, ButtonWrapper from module.base.timer import Timer -from module.base.utils import area_size, crop, rgb2luma, load_image, crop +from module.base.utils import area_size, crop, load_image, rgb2luma from module.logger import logger from module.ui.scroll import Scroll from tasks.base.assets.assets_base_popup import POPUP_CANCEL from tasks.base.ui import UI from tasks.combat.assets.assets_combat_support import COMBAT_SUPPORT_ADD, COMBAT_SUPPORT_LIST, \ - COMBAT_SUPPORT_LIST_SCROLL, COMBAT_SUPPORT_SELECTED, COMBAT_SUPPORT_LIST_GRID -from tasks.combat.assets.assets_combat_team import COMBAT_TEAM_SUPPORT, COMBAT_TEAM_DISMISSSUPPORT + COMBAT_SUPPORT_LIST_GRID, COMBAT_SUPPORT_LIST_SCROLL, COMBAT_SUPPORT_SELECTED +from tasks.combat.assets.assets_combat_team import COMBAT_TEAM_DISMISSSUPPORT, COMBAT_TEAM_SUPPORT def get_position_in_original_image(position_in_croped_image, crop_area): From 766a9db07b18458872f0ac7650dbb27fdda02601 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 10 Feb 2024 04:37:31 +0800 Subject: [PATCH 43/65] Fix: Calyx_Golden_Treasures is not migrated (#315) --- tasks/dungeon/dungeon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/dungeon/dungeon.py b/tasks/dungeon/dungeon.py index 247065993..20d0c5081 100644 --- a/tasks/dungeon/dungeon.py +++ b/tasks/dungeon/dungeon.py @@ -211,7 +211,7 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat): if self.has_double_rogue_event(): rogue = self.get_double_event_remain() if self.has_double_calyx_event(): - self._dungeon_nav_goto(KEYWORDS_DUNGEON_LIST.Calyx_Golden_Treasures) + self._dungeon_nav_goto(KEYWORDS_DUNGEON_LIST.Calyx_Golden_Treasures_Jarilo_VI) calyx = self.get_double_event_remain() if self.has_double_relic_event(): self._dungeon_nav_goto(KEYWORDS_DUNGEON_LIST.Cavern_of_Corrosion_Path_of_Gelid_Wind) From 6b9aa3b076e2b94e423a4b5d0e6a3a8435eeb379 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 10 Feb 2024 04:53:01 +0800 Subject: [PATCH 44/65] Fix: Handle missing world tab --- tasks/dungeon/ui.py | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 84d5bd7cc..22b3aeb4f 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -431,14 +431,17 @@ class DungeonUI(DungeonState): def _dungeon_world_set(self, dungeon: DungeonList, skip_first_screenshot=True): """ Switch worlds in Calyx_Golden + + Returns: + bool: True if success to set """ logger.hr('Dungeon world set', level=2) if not dungeon.is_Calyx_Golden: logger.warning(f'Dungeon {dungeon} is not Calyx Golden, no need to set world') - return + return False if dungeon.world is None: logger.error(f'Dungeon {dungeon} does not belongs to any world') - return + return False dic_world_button = { KEYWORDS_MAP_WORLD.Jarilo_VI: CALYX_WORLD_1, KEYWORDS_MAP_WORLD.The_Xianzhou_Luofu: CALYX_WORLD_2, @@ -447,7 +450,7 @@ class DungeonUI(DungeonState): button = dic_world_button.get(dungeon.world) if button is None: logger.error(f'Dungeon {dungeon} with world {dungeon.world} has no corresponding world button') - return + return False logger.info(f'Dungeon world set {dungeon.world}') while 1: @@ -459,12 +462,38 @@ class DungeonUI(DungeonState): # End if self.image_color_count(button, color=(18, 18, 18), threshold=180, count=50): logger.info(f'Dungeon world at {dungeon.world}') - break + return True # Click if self.ui_page_appear(page_guide, interval=2): self.device.click(button) continue + def _dungeon_world_set_wrapper(self, dungeon: DungeonList, skip_first_screenshot=True): + """ + Switch worlds in Calyx_Golden with error handling + If world tab is not unlocked, fallback to Jarilo dungeons + """ + button = CALYX_WORLD_1 + tab = False + # Selected tab + if self.image_color_count(button, color=(18, 18, 18), threshold=180, count=50): + tab = True + # Unselected tab + if self.image_color_count(button, color=(134, 134, 134), threshold=180, count=50): + tab = True + logger.attr('WorldTab', tab) + + if not tab: + logger.warning('World tab is not unlocked, fallback to Jarilo dungeons') + if dungeon.is_Calyx_Golden_Memories: + dungeon = KEYWORDS_DUNGEON_LIST.Calyx_Golden_Treasures_Jarilo_VI + if dungeon.is_Calyx_Golden_Aether: + dungeon = KEYWORDS_DUNGEON_LIST.Calyx_Golden_Aether_Jarilo_VI + if dungeon.is_Calyx_Golden_Treasures: + dungeon = KEYWORDS_DUNGEON_LIST.Calyx_Golden_Treasures_Jarilo_VI + + return self._dungeon_world_set(dungeon, skip_first_screenshot=skip_first_screenshot) + def _dungeon_insight(self, dungeon: DungeonList): """ Pages: @@ -641,7 +670,7 @@ class DungeonUI(DungeonState): if dungeon.is_Calyx_Golden: self._dungeon_nav_goto(dungeon) self._dungeon_wait_until_dungeon_list_loaded() - self._dungeon_world_set(dungeon) + self._dungeon_world_set_wrapper(dungeon) self._dungeon_wait_until_dungeon_list_loaded() self._dungeon_insight(dungeon) self._dungeon_enter(dungeon) From 282ab6da72c3eabfac5fc6ea1de418eef1a804d9 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 12 Feb 2024 23:29:21 +0800 Subject: [PATCH 45/65] Chore: _dungeon_nav_goto now receive nav input --- module/ocr/keyword.py | 2 +- tasks/dungeon/dungeon.py | 6 +++--- tasks/dungeon/ui.py | 22 +++++++++++----------- tasks/dungeon/weekly.py | 4 ++-- tasks/forgotten_hall/ui.py | 4 ++-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/module/ocr/keyword.py b/module/ocr/keyword.py index e285674f2..3593b1d46 100644 --- a/module/ocr/keyword.py +++ b/module/ocr/keyword.py @@ -7,7 +7,7 @@ import module.config.server as server from module.exception import ScriptError # ord('.') = 65294 -REGEX_PUNCTUATION = re.compile(r'[ ,..\'"“”,。…::;;!!??·・•●〇*※\-—-/\\\n\t()\[\]()「」『』【】《》[]]') +REGEX_PUNCTUATION = re.compile(r'[ ,..\'"“”,。…::;;!!??·・•●〇°*※\-—-/\\\n\t()\[\]()「」『』【】《》[]]') def parse_name(n): diff --git a/tasks/dungeon/dungeon.py b/tasks/dungeon/dungeon.py index 20d0c5081..6c7e5a60a 100644 --- a/tasks/dungeon/dungeon.py +++ b/tasks/dungeon/dungeon.py @@ -4,7 +4,7 @@ from tasks.battle_pass.keywords import KEYWORDS_BATTLE_PASS_QUEST from tasks.combat.combat import Combat from tasks.daily.keywords import KEYWORDS_DAILY_QUEST from tasks.dungeon.event import DungeonEvent -from tasks.dungeon.keywords import DungeonList, KEYWORDS_DUNGEON_LIST, KEYWORDS_DUNGEON_TAB +from tasks.dungeon.keywords import DungeonList, KEYWORDS_DUNGEON_LIST, KEYWORDS_DUNGEON_NAV, KEYWORDS_DUNGEON_TAB from tasks.dungeon.stamina import DungeonStamina @@ -211,10 +211,10 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat): if self.has_double_rogue_event(): rogue = self.get_double_event_remain() if self.has_double_calyx_event(): - self._dungeon_nav_goto(KEYWORDS_DUNGEON_LIST.Calyx_Golden_Treasures_Jarilo_VI) + self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Calyx_Golden) calyx = self.get_double_event_remain() if self.has_double_relic_event(): - self._dungeon_nav_goto(KEYWORDS_DUNGEON_LIST.Cavern_of_Corrosion_Path_of_Gelid_Wind) + self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Cavern_of_Corrosion) relic = self.get_double_event_remain() with self.config.multi_set(): self.config.stored.DungeonDouble.calyx = calyx diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 22b3aeb4f..ba0a14e11 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -351,17 +351,17 @@ class DungeonUI(DungeonState): logger.info('No Echo_of_War in list skip waiting') return False - def _dungeon_nav_goto(self, dungeon: DungeonList, skip_first_screenshot=True): + def _dungeon_nav_goto(self, nav: DungeonNav, skip_first_screenshot=True): """ Equivalent to `DUNGEON_NAV_LIST.select_row(dungeon.dungeon_nav, main=self)` but with tricks to be faster Args: - dungeon: + nav: skip_first_screenshot: """ logger.hr('Dungeon nav goto', level=2) - logger.info(f'Dungeon nav goto {dungeon.dungeon_nav}') + logger.info(f'Dungeon nav goto {nav}') # Wait rows while 1: @@ -402,11 +402,11 @@ class DungeonUI(DungeonState): else: # To start from any list states. logger.info('DUNGEON_NAV_LIST not at top') - DUNGEON_NAV_LIST.select_row(dungeon.dungeon_nav, main=self) + DUNGEON_NAV_LIST.select_row(nav, main=self) return True # Check the first page - if dungeon.dungeon_nav in [ + if nav in [ KEYWORDS_DUNGEON_NAV.Simulated_Universe, KEYWORDS_DUNGEON_NAV.Calyx_Golden, KEYWORDS_DUNGEON_NAV.Calyx_Crimson, @@ -415,9 +415,9 @@ class DungeonUI(DungeonState): KEYWORDS_DUNGEON_NAV.Forgotten_Hall, KEYWORDS_DUNGEON_NAV.Pure_Fiction, ]: - button = DUNGEON_NAV_LIST.keyword2button(dungeon.dungeon_nav) + button = DUNGEON_NAV_LIST.keyword2button(nav) if button: - DUNGEON_NAV_LIST.select_row(dungeon.dungeon_nav, main=self, insight=False) + DUNGEON_NAV_LIST.select_row(nav, main=self, insight=False) return True # Check the second page @@ -425,7 +425,7 @@ class DungeonUI(DungeonState): DUNGEON_NAV_LIST.drag_page('down', main=self) # No skip_first_screenshot since drag_page is just called if self._dungeon_wait_until_echo_or_war_stabled(skip_first_screenshot=False): - DUNGEON_NAV_LIST.select_row(dungeon.dungeon_nav, main=self, insight=False) + DUNGEON_NAV_LIST.select_row(nav, main=self, insight=False) return True def _dungeon_world_set(self, dungeon: DungeonList, skip_first_screenshot=True): @@ -636,7 +636,7 @@ class DungeonUI(DungeonState): if self.appear(SURVIVAL_INDEX_LOADED): logger.info('Already at nav Simulated_Universe') else: - self._dungeon_nav_goto(KEYWORDS_DUNGEON_LIST.Simulated_Universe_World_1) + self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Simulated_Universe) def dungeon_goto(self, dungeon: DungeonList): """ @@ -662,13 +662,13 @@ class DungeonUI(DungeonState): or dungeon.is_Stagnant_Shadow \ or dungeon.is_Cavern_of_Corrosion \ or dungeon.is_Echo_of_War: - self._dungeon_nav_goto(dungeon) + self._dungeon_nav_goto(dungeon.dungeon_nav) self._dungeon_wait_until_dungeon_list_loaded() self._dungeon_insight(dungeon) self._dungeon_enter(dungeon) return True if dungeon.is_Calyx_Golden: - self._dungeon_nav_goto(dungeon) + self._dungeon_nav_goto(dungeon.dungeon_nav) self._dungeon_wait_until_dungeon_list_loaded() self._dungeon_world_set_wrapper(dungeon) self._dungeon_wait_until_dungeon_list_loaded() diff --git a/tasks/dungeon/weekly.py b/tasks/dungeon/weekly.py index d0f1962bf..a5d549065 100644 --- a/tasks/dungeon/weekly.py +++ b/tasks/dungeon/weekly.py @@ -3,7 +3,7 @@ from module.ocr.ocr import DigitCounter from tasks.daily.keywords import KEYWORDS_DAILY_QUEST from tasks.dungeon.assets.assets_dungeon_ui import OCR_DUNGEON_LIST, OCR_WEEKLY_LIMIT from tasks.dungeon.dungeon import Dungeon -from tasks.dungeon.keywords import DungeonList, KEYWORDS_DUNGEON_TAB +from tasks.dungeon.keywords import DungeonList, KEYWORDS_DUNGEON_NAV, KEYWORDS_DUNGEON_TAB from tasks.dungeon.ui import DUNGEON_LIST @@ -53,7 +53,7 @@ class WeeklyDungeon(Dungeon): self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index) # Equivalent to self.dungeon_goto(dungeon), but check limit remains DUNGEON_LIST.search_button = OCR_DUNGEON_LIST - self._dungeon_nav_goto(dungeon) + self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Echo_of_War) # Check limit remain = self.get_weekly_remain() diff --git a/tasks/forgotten_hall/ui.py b/tasks/forgotten_hall/ui.py index 595e4ea6d..a07c08753 100644 --- a/tasks/forgotten_hall/ui.py +++ b/tasks/forgotten_hall/ui.py @@ -10,7 +10,7 @@ from module.ocr.keyword import Keyword from module.ocr.ocr import Ocr, OcrResultButton from module.ui.draggable_list import DraggableList from tasks.base.assets.assets_base_page import FORGOTTEN_HALL_CHECK, MAP_EXIT -from tasks.dungeon.keywords import DungeonList, KEYWORDS_DUNGEON_LIST, KEYWORDS_DUNGEON_TAB +from tasks.dungeon.keywords import DungeonList, KEYWORDS_DUNGEON_LIST, KEYWORDS_DUNGEON_NAV, KEYWORDS_DUNGEON_TAB from tasks.dungeon.ui import DungeonUI from tasks.forgotten_hall.assets.assets_forgotten_hall_nav import * from tasks.forgotten_hall.assets.assets_forgotten_hall_ui import * @@ -187,7 +187,7 @@ class ForgottenHallUI(DungeonUI, ForgottenHallTeam): logger.info('Already in forgotten hall') else: self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Treasures_Lightward) - self._dungeon_nav_goto(dungeon) + self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Forgotten_Hall) self.stage_choose(dungeon) logger.info(f'Stage list select: {stage_keyword}') From 5682ca4891b3f4931158073074a9241f1ac32aa6 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 13 Feb 2024 00:25:04 +0800 Subject: [PATCH 46/65] Fix: Init position in Luofu_Cloudford_F1_X281Y873 --- route/rogue/Combat/Luofu_Cloudford_F1.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/route/rogue/Combat/Luofu_Cloudford_F1.py b/route/rogue/Combat/Luofu_Cloudford_F1.py index 71f1dbae2..a89d53f6e 100644 --- a/route/rogue/Combat/Luofu_Cloudford_F1.py +++ b/route/rogue/Combat/Luofu_Cloudford_F1.py @@ -120,6 +120,8 @@ class Route(RouteBase): Luofu_Cloudford_F1_X281Y873 is the same as Luofu_Cloudford_F1_X283Y865 but for wrong spawn point detected """ + # Re-init position to be the same as origin + self.minimap.init_position(position=(283.4, 865.3), locked=True) self.clear_enemy(enemy) @locked_position From 4d64ec02527995025869714eb24f506e8254a720 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 13 Feb 2024 01:05:38 +0800 Subject: [PATCH 47/65] Upd: MAP_LOADING.SEARCH --- .../combat/interact/MAP_LOADING.SEARCH.png | Bin 8528 -> 8848 bytes tasks/combat/assets/assets_combat_interact.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/share/combat/interact/MAP_LOADING.SEARCH.png b/assets/share/combat/interact/MAP_LOADING.SEARCH.png index 9a1c84aa5aef70d35196c332210fa476759c825a..ffccbd6d10a3f7a93bd36fe06182cc7b66a2cc60 100644 GIT binary patch delta 3650 zcmXY!dpy(q-^W*7rC;iDyHZ?N;lAg(NfuW>p`3QfmZDLF$}y4iC=J8*?f3IYL#17e z7UeI_xwUli^6^ysSmU;pYVKXtwM)b+oDKGj3$RDwR$=L5Ci;~yhqe-@bA zMIndxM&ke5aHz~2HGeMjx<%w%?Tc`YkojKRLbrKwWA+Vlb`Tt2@|SwhNGnc*pD)Rc z5wXhE>?vUpFAnX!`tif|oOS<&MAZSbxD6s5oKCDfSYxNUZ-3@B)iZ!t;jO@slA>`7 z_SNUE+fl?(gfbiVNken ziTrO%@yKv`jp{lU>M~GO;RYK!dl?S~r$gWcMbAUPU?8oPy|K}Vn(^CtOyUI&$oS~Z z<$ZCCSu|f4kVzjnNcMyFYk}Hz54)OPM(EtqnF{;Xw!7PL0+nxMnGAu-*QmJ9RLQb- z%l1Z_WWc^lZ)D&13lnt^8ZIO+tK=o}h?!x*Nyw3+RNNYG+}$wXMZo_o!5d;$xSEWD z^8gVHFQ$!$ zM!G*?Bbq~{7{z9COt1-5l-py_5Q(G^a6o$K%nSFD92V zT{H8_x9;QHS0mn+BD0N+pGW43xe6ih_1TPtGm@01p|`N`#5dj??A#U|KXmnm%+d^{ zbLbDyDP=SAV%kb=dg*VF!87LWM=K{b9yC79a+rX*Iruo(KrcK**N(P@_w?9)Ye=lw zDxl7BND0`<8KhFq&T88UW68K6;7#hQe9JiKj`-1+$<-Xl9NjLfTsn8h7D3exZg-R#ge z_y{gy>k1{~JOd*cVN&hQ@q~3Gr?X@Gm1-G7%_XA}+bDT%)8i`^HQg=SX2&st6-(9H z*ickYMZ63<40;48eX`m+)Z3l%Y7QdsUTU>{UQ z$j(`P%o3+;3^Gl}Q$$pIhca_#6JvLy&X-fjTm;l)@Is z8=fLEBBz@S!NvvgB|Np1lxB&D9W9qWHUM-mMHHUAF9LQSb=vb^d;Z*W;L*3T869`E6SGpj)idGwZPq-wiORELmqh!Yw9KPatP^#h$z9(N9|yy;b>v57EF-`ScDE zyYeo#Ca2*l;vDKEG-d~HKqC5hx63AoWpR-{I61w?#5W=!A_9Ad8;;n1vNap=Gf4U5 z3MZM}F?G`!i?*e9i!(_}*8sBTCG#R;;gmqb?@>gJxa2Pb-YvL5)=xe*(SzsME-)$3Htk zbG}uZ=H${|`+3YT{VVMh?O~A*Va5R2it4FO+Qr`u9$cR>HKpAVpJ3<$D-DXCxdo1i zv2dnxc&bER^1=7ql5hhPghp??cY=p+54({xAs}z!F{OXP+e&~XOIMa5-J|?z2n`1@ zqK&~I+4pxBxt)pA z#-^mD@z-isj{R^Yu)mRQ^28EB@nj<*UO~q-Unl(U0V{qhcf*3uZi(v=MDLU+hxWab zLEQRhpcWOjIP##zvXRaAbSJnzv@9^?48o$2VGl;1sUQ=iUKxju|0wH6sU2x)yqQ%Q z5gLu2jCUVbaVab)c$vgcWG67Z;;`Sy_FG+*7VK6`QqminSzm8&-=`jh@cM+Y>pF-r zBiZR7_X zBNNsw6b^l8D$%DA_)T{l9M9fNjkN&tnl10o|84!lttf+%h^7VsFSVw}&lXK(HgiO> z9Agt3sV-1`C3J`f%XaAgWSXM~W~84M;BadSSsKJO3=DT1KBxg=0a`78?t6EenEP_t z(k3rz#hFzvNtxMpVZKEzh`6%E25qavSSs>ZfNX(*8;5 zbZqGtF&nwhWi$6m9qyS7o-sM2G2CymeLzOAb5}d?&Hq{*5yI0z93`ig8qy#cStZNT zDYt*`e-uuKfk5GFEGzzi079qPMUmYXTN)4;VGkbxB+IWgFf)u8!q~ej;&M)*e4&e@ zdEDd-q$6JXp69w5!qT~c2=v5u8&6k47<%)YuQ)%c{+Pbey(iVruE1f%2^BMI)0UXg zjog`^*Pi3>0l$O6c~c+gPHplvX&=vqQ8wsfjlCC(4jNjmhII=Z#}JT;8w_j7kz6u6eKcoTv(8~2Hk0=iKWr6c^_DY%2`WQ<9a*BCikiL|b!rv& za;3`o3tFQ9_qjeuNd|jZL>oU?+1KQ<*6$#(>I-;wWnoknI1LP@ow^+~bviwZ$Le!z znVD)vt!nDXnQp<1duUPRGkXAD2o7KeUbt}fH^cO-$SEosDHl|&6YC>$e=+#R!#@;rC~!9Kt?5lGdPDbsE#7+Q;c^cM$-B&bFAcc5M#+01OliP! z$@CKJv5_n7qCCW^(?P-#iT zA33NeEw7h8K4Y2&8@F-oqgptg@>`=2S-N7AkKNFfEzmU`(gn-7%Z9w$MWD@;o5~C@ zBVlTA5CKH;FE6C@8A&$e*NkBR{fpwuWi}(BZ0j0s7r&L$F0;_NAdc{;_hJSFMy!m? zj;u-Ng=6vVm4{shlBAjdlB{UL*}<|$2st*iBaJsPE02x7!lv?KA8IMg0xkblhci_u~Ym@g_OI@en14;o1c>sR2~T1LwKWTLrJ zAlsfzSU=lxY1%#r>mPOsoLzpdjv6l;uZD{12)-0b1(K$perf-KAIsURIiv&=x6vVb z3E;sL4Xcm0PtZE!t>}I;+|%j3^NUn$X8q+~K=P}zdyjy^D|@$!8d*i_v$MH)sy4AX zQ9z&$dvuWU#z~cQ@yELv*-I0h{@{5Rw%rksck+*9q02f|4V+u?ctqxbk{t*vNzo?0tvIHQD1|8OgGi_v+fzaOyGYXY=dyic;Tz!2y;6 z=RkGpjcv=<#I&OLl^o#iy@k(@w=``xEujB2tKkl1GEQRdR8;YQ(E~|uO`Y2ZnwZwh zNaB8()L9=GU_JQquD@GI&MeC~iAL96MfpUsYIl4Z*rv1E&8-+neZ(h#xV-jh)GukJ zVPki$LD3nE4HijD_$L{Z`MZevZ5IqD^9f%WnBUjH_Iz7RbDK5vruX?>!5o1eGn(m^ zNwiQKh*;fDa3Cc}(_O50zj(2zk}h3bX&(B!9BG*NVCD7v-d*i2)3Z1?;3?^@3H5I2!TDhBQQUV^Q%UtIUI^<|mHz}oDZsta_hAg9B|(lS=bE6onGxaGx( zH>?xt>P#ayad=F88ZO>jISi}Re;fx@)Rh9Eu9>@ZdUB_K9jL*oU}Gqy2-iHA*Q@{0 z0K4Jk81M1_b6$*|7A_2%ij)VXPc{`1>d&yjQ43G4hU zS8Wswwi~0(lcbZRwf=j)Ojjs_>9&Nb)@lVVN*yaElq{7HcE%a$P{w}84TGga%I_HA gr{9t~cA@(~gKb_zw?2G00aBhTaA#Q6MgM>QAA#PR@Bjb+ delta 3321 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 XnnS-H{zy}OG=MYC?*A@F1pM(I1CHW5 diff --git a/tasks/combat/assets/assets_combat_interact.py b/tasks/combat/assets/assets_combat_interact.py index 5cbe5a27c..c122037bc 100644 --- a/tasks/combat/assets/assets_combat_interact.py +++ b/tasks/combat/assets/assets_combat_interact.py @@ -37,7 +37,7 @@ MAP_LOADING = ButtonWrapper( share=Button( file='./assets/share/combat/interact/MAP_LOADING.png', area=(644, 367, 662, 389), - search=(639, 347, 667, 394), + search=(639, 357, 667, 405), color=(159, 141, 149), button=(644, 367, 662, 389), ), From 1bcef3071b150bf320d5ebd97c034b8d2d8a7a95 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 13 Feb 2024 01:22:35 +0800 Subject: [PATCH 48/65] Fix: IndexError in OcrRogueWorld --- tasks/rogue/entry/entry.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasks/rogue/entry/entry.py b/tasks/rogue/entry/entry.py index 093c1618d..dfccf7637 100644 --- a/tasks/rogue/entry/entry.py +++ b/tasks/rogue/entry/entry.py @@ -77,6 +77,8 @@ class OcrRogueWorld(Ocr): center = color_similarity_2d(image, color=(255, 255, 255)) cv2.inRange(center, 180, 255, dst=center) center = np.where(np.sum(center, axis=1) > 200)[0] + if len(center) < 2: + return image up, down = center[0], center[-1] image = image[up:down, :, :] return image From e96a5ef1da6e1effee22fa1360142b12f5c82608 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:05:33 +0800 Subject: [PATCH 49/65] Fix: [EN] Use roman numbers in dungeon keywords (fixed #325) --- dev_tools/keywords/base.py | 10 +++++++--- dev_tools/keywords/dungeon_list.py | 9 ++++++++- tasks/dungeon/keywords/dungeon.py | 18 +++++++++--------- tasks/dungeon/ui.py | 2 +- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/dev_tools/keywords/base.py b/dev_tools/keywords/base.py index c8804f49e..e44f0ac61 100644 --- a/dev_tools/keywords/base.py +++ b/dev_tools/keywords/base.py @@ -144,7 +144,10 @@ class GenerateKeyword: pass def convert_name(self, text: str, keyword: dict) -> str: - return text_to_variable(text) + return text_to_variable(replace_templates(text)) + + def convert_keyword(self, text: str, lang: str) -> str: + return replace_templates(text) def iter_rows(self) -> t.Iterable[dict]: for keyword in self.iter_keywords(): @@ -163,11 +166,12 @@ class GenerateKeyword: base.update(keyword) # Name _, name = self.find_keyword(text_id, lang='en') - name = self.convert_name(replace_templates(name), keyword=base) + name = self.convert_name(name, keyword=base) base['name'] = name # Translations for lang in UI_LANGUAGES: - value = replace_templates(self.find_keyword(text_id, lang=lang)[1]) + value = self.find_keyword(text_id, lang=lang)[1] + value = self.convert_keyword(value, lang=lang) base[lang] = value return base diff --git a/dev_tools/keywords/dungeon_list.py b/dev_tools/keywords/dungeon_list.py index 334331b4d..9711c070c 100644 --- a/dev_tools/keywords/dungeon_list.py +++ b/dev_tools/keywords/dungeon_list.py @@ -73,6 +73,14 @@ class GenerateDungeonList(GenerateKeyword): text = f'{text}_{plane.name}' return text + def convert_keyword(self, text: str, lang: str) -> str: + text = super().convert_keyword(text, lang=lang) + # Bud of Memories (Jarilo-Ⅵ) + # Use roman numbers instead + text = re.sub(r'-[VⅤ][IⅠ]', '-Ⅵ', text) + + return text + def iter_rows(self) -> t.Iterable[dict]: dungeons = list(super().iter_rows()) calyx = [] @@ -88,7 +96,6 @@ class GenerateDungeonList(GenerateKeyword): ] for keyword in order: condition = lambda x: x['name'].startswith(keyword) - print([d for d in dungeons]) calyx += [d for d in dungeons if condition(d)] dungeons = [d for d in dungeons if not condition(d)] dungeons = calyx + dungeons diff --git a/tasks/dungeon/keywords/dungeon.py b/tasks/dungeon/keywords/dungeon.py index 855bb121e..a0281f6bc 100644 --- a/tasks/dungeon/keywords/dungeon.py +++ b/tasks/dungeon/keywords/dungeon.py @@ -8,9 +8,9 @@ Calyx_Golden_Memories_Jarilo_VI = DungeonList( name='Calyx_Golden_Memories_Jarilo_VI', cn='回忆之蕾•雅利洛-Ⅵ', cht='回憶之蕾•雅利洛-Ⅵ', - en='Bud of Memories (Jarilo-VI)', - jp='回憶の蕾・ヤリーロ-VI', - es='Flor de los recuerdos (Jarilo-VI)', + en='Bud of Memories (Jarilo-Ⅵ)', + jp='回憶の蕾・ヤリーロ-Ⅵ', + es='Flor de los recuerdos (Jarilo-Ⅵ)', plane_id=2010101, ) Calyx_Golden_Aether_Jarilo_VI = DungeonList( @@ -18,9 +18,9 @@ Calyx_Golden_Aether_Jarilo_VI = DungeonList( name='Calyx_Golden_Aether_Jarilo_VI', cn='以太之蕾•雅利洛-Ⅵ', cht='乙太之蕾•雅利洛-Ⅵ', - en='Bud of Aether (Jarilo-VI)', - jp='エーテルの蕾・ヤリーロ-VI', - es='Flor de éter (Jarilo-VI)', + en='Bud of Aether (Jarilo-Ⅵ)', + jp='エーテルの蕾・ヤリーロ-Ⅵ', + es='Flor de éter (Jarilo-Ⅵ)', plane_id=2011101, ) Calyx_Golden_Treasures_Jarilo_VI = DungeonList( @@ -28,9 +28,9 @@ Calyx_Golden_Treasures_Jarilo_VI = DungeonList( name='Calyx_Golden_Treasures_Jarilo_VI', cn='藏珍之蕾•雅利洛-Ⅵ', cht='藏珍之蕾•雅利洛-Ⅵ', - en='Bud of Treasures (Jarilo-VI)', - jp='秘蔵の蕾・ヤリーロ-VI', - es='Flor de tesoros (Jarilo-VI)', + en='Bud of Treasures (Jarilo-Ⅵ)', + jp='秘蔵の蕾・ヤリーロ-Ⅵ', + es='Flor de tesoros (Jarilo-Ⅵ)', plane_id=2012101, ) Calyx_Golden_Memories_The_Xianzhou_Luofu = DungeonList( diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index ba0a14e11..d290fadc9 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -80,7 +80,7 @@ class OcrDungeonNav(Ocr): class OcrDungeonList(Ocr): def after_process(self, result): # 乙太之蕾•雅利洛-Ⅵ - result = result.replace('-VI', '-Ⅵ') + result = re.sub(r'-[VⅤ][IⅠ]', '-Ⅵ', result) result = super().after_process(result) From e1ae0c17b57b0c9cde5f8af88d8d463b35b26e6a Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 17 Feb 2024 21:27:27 +0800 Subject: [PATCH 50/65] Fix: Remove random prefix in ocr result --- tasks/dungeon/ui.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index d290fadc9..457e739fa 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -94,8 +94,8 @@ class OcrDungeonList(Ocr): result = re.sub(r'蛀星的旧.*?历战', '蛀星的旧靥•历战', result) # 9支援仓段 - result = result.removeprefix('9') - result = result.removeprefix('Q') + for word in 'Q9α': + result = result.removeprefix(word) return result From 4fb1c85d98592de1cc5b5ca1ba97f61513ef829d Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 17 Feb 2024 21:28:54 +0800 Subject: [PATCH 51/65] Fix: Wait echo of war list loaded --- tasks/dungeon/weekly.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks/dungeon/weekly.py b/tasks/dungeon/weekly.py index a5d549065..359b9ba59 100644 --- a/tasks/dungeon/weekly.py +++ b/tasks/dungeon/weekly.py @@ -54,6 +54,7 @@ class WeeklyDungeon(Dungeon): # Equivalent to self.dungeon_goto(dungeon), but check limit remains DUNGEON_LIST.search_button = OCR_DUNGEON_LIST self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Echo_of_War) + self._dungeon_wait_until_dungeon_list_loaded() # Check limit remain = self.get_weekly_remain() From 617be88a714ffe81f0a0a7bae303d57202622715 Mon Sep 17 00:00:00 2001 From: Yinhr <110515845+Yinhaoran1128@users.noreply.github.com> Date: Sun, 18 Feb 2024 00:10:49 +0800 Subject: [PATCH 52/65] Fix: Check indexes before using min() (#330) --- tasks/dungeon/ui.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 457e739fa..6d42aeb42 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -165,6 +165,11 @@ class DraggableDungeonList(DraggableList): indexes = [self.keyword2index(row.matched_keyword) for row in self.cur_buttons] indexes = [index for index in indexes if index] + + if not indexes: + logger.warning(f'No valid rows loaded into {self}') + return + self.cur_min = min(indexes) self.cur_max = max(indexes) logger.attr(self.name, f'{self.cur_min} - {self.cur_max}') From 87c322a21b328d044513accec975a56874f10934 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 19 Feb 2024 01:40:57 +0800 Subject: [PATCH 53/65] Dev: Dungeon IDs of calyx crimson are not sorted --- dev_tools/keywords/dungeon_list.py | 4 ++++ tasks/dungeon/keywords/dungeon.py | 32 +++++++++++++++--------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/dev_tools/keywords/dungeon_list.py b/dev_tools/keywords/dungeon_list.py index 9711c070c..d18451619 100644 --- a/dev_tools/keywords/dungeon_list.py +++ b/dev_tools/keywords/dungeon_list.py @@ -100,5 +100,9 @@ class GenerateDungeonList(GenerateKeyword): dungeons = [d for d in dungeons if not condition(d)] dungeons = calyx + dungeons + self.keyword_index = 0 for row in dungeons: + # Re-sort ID + self.keyword_index += 1 + row['id'] = self.keyword_index yield row diff --git a/tasks/dungeon/keywords/dungeon.py b/tasks/dungeon/keywords/dungeon.py index a0281f6bc..52ef19cf1 100644 --- a/tasks/dungeon/keywords/dungeon.py +++ b/tasks/dungeon/keywords/dungeon.py @@ -34,7 +34,7 @@ Calyx_Golden_Treasures_Jarilo_VI = DungeonList( plane_id=2012101, ) Calyx_Golden_Memories_The_Xianzhou_Luofu = DungeonList( - id=11, + id=4, name='Calyx_Golden_Memories_The_Xianzhou_Luofu', cn='回忆之蕾•仙舟「罗浮」', cht='回憶之蕾•仙舟「羅浮」', @@ -44,7 +44,7 @@ Calyx_Golden_Memories_The_Xianzhou_Luofu = DungeonList( plane_id=2021101, ) Calyx_Golden_Aether_The_Xianzhou_Luofu = DungeonList( - id=12, + id=5, name='Calyx_Golden_Aether_The_Xianzhou_Luofu', cn='以太之蕾•仙舟「罗浮」', cht='乙太之蕾•仙舟「羅浮」', @@ -54,7 +54,7 @@ Calyx_Golden_Aether_The_Xianzhou_Luofu = DungeonList( plane_id=2022101, ) Calyx_Golden_Treasures_The_Xianzhou_Luofu = DungeonList( - id=13, + id=6, name='Calyx_Golden_Treasures_The_Xianzhou_Luofu', cn='藏珍之蕾•仙舟「罗浮」', cht='藏珍之蕾•仙舟「羅浮」', @@ -64,7 +64,7 @@ Calyx_Golden_Treasures_The_Xianzhou_Luofu = DungeonList( plane_id=2022201, ) Calyx_Golden_Memories_Penacony = DungeonList( - id=14, + id=7, name='Calyx_Golden_Memories_Penacony', cn='回忆之蕾•匹诺康尼', cht='回憶之蕾•匹諾康尼', @@ -74,7 +74,7 @@ Calyx_Golden_Memories_Penacony = DungeonList( plane_id=2031301, ) Calyx_Golden_Aether_Penacony = DungeonList( - id=15, + id=8, name='Calyx_Golden_Aether_Penacony', cn='以太之蕾•匹诺康尼', cht='乙太之蕾•匹諾康尼', @@ -84,7 +84,7 @@ Calyx_Golden_Aether_Penacony = DungeonList( plane_id=2031201, ) Calyx_Golden_Treasures_Penacony = DungeonList( - id=16, + id=9, name='Calyx_Golden_Treasures_Penacony', cn='藏珍之蕾•匹诺康尼', cht='藏珍之蕾•匹諾康尼', @@ -94,7 +94,7 @@ Calyx_Golden_Treasures_Penacony = DungeonList( plane_id=2031101, ) Calyx_Crimson_Destruction_Herta_StorageZone = DungeonList( - id=4, + id=10, name='Calyx_Crimson_Destruction_Herta_StorageZone', cn='毁灭之蕾•拟造花萼(赤)', cht='毀滅之蕾•擬造花萼(赤)', @@ -104,7 +104,7 @@ Calyx_Crimson_Destruction_Herta_StorageZone = DungeonList( plane_id=2000201, ) Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape = DungeonList( - id=18, + id=11, name='Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape', cn='毁灭之蕾•拟造花萼(赤)', cht='毀滅之蕾•擬造花萼(赤)', @@ -114,7 +114,7 @@ Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape = DungeonList( plane_id=2023201, ) Calyx_Crimson_Preservation_Herta_SupplyZone = DungeonList( - id=5, + id=12, name='Calyx_Crimson_Preservation_Herta_SupplyZone', cn='存护之蕾•拟造花萼(赤)', cht='存護之蕾•擬造花萼(赤)', @@ -124,7 +124,7 @@ Calyx_Crimson_Preservation_Herta_SupplyZone = DungeonList( plane_id=2000301, ) Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains = DungeonList( - id=6, + id=13, name='Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains', cn='巡猎之蕾•拟造花萼(赤)', cht='巡獵之蕾•擬造花萼(赤)', @@ -134,7 +134,7 @@ Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains = DungeonList( plane_id=2010101, ) Calyx_Crimson_Abundance_Jarilo_BackwaterPass = DungeonList( - id=7, + id=14, name='Calyx_Crimson_Abundance_Jarilo_BackwaterPass', cn='丰饶之蕾•拟造花萼(赤)', cht='豐饒之蕾•擬造花萼(赤)', @@ -144,7 +144,7 @@ Calyx_Crimson_Abundance_Jarilo_BackwaterPass = DungeonList( plane_id=2011101, ) Calyx_Crimson_Erudition_Jarilo_RivetTown = DungeonList( - id=8, + id=15, name='Calyx_Crimson_Erudition_Jarilo_RivetTown', cn='智识之蕾•拟造花萼(赤)', cht='智識之蕾•擬造花萼(赤)', @@ -154,7 +154,7 @@ Calyx_Crimson_Erudition_Jarilo_RivetTown = DungeonList( plane_id=2012201, ) Calyx_Crimson_Harmony_Jarilo_RobotSettlement = DungeonList( - id=9, + id=16, name='Calyx_Crimson_Harmony_Jarilo_RobotSettlement', cn='同谐之蕾•拟造花萼(赤)', cht='同諧之蕾•擬造花萼(赤)', @@ -164,7 +164,7 @@ Calyx_Crimson_Harmony_Jarilo_RobotSettlement = DungeonList( plane_id=2012301, ) Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape = DungeonList( - id=19, + id=17, name='Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape', cn='同谐之蕾•拟造花萼(赤)', cht='同諧之蕾•擬造花萼(赤)', @@ -174,7 +174,7 @@ Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape = DungeonList( plane_id=2031101, ) Calyx_Crimson_Nihility_Jarilo_GreatMine = DungeonList( - id=10, + id=18, name='Calyx_Crimson_Nihility_Jarilo_GreatMine', cn='虚无之蕾•拟造花萼(赤)', cht='虛無之蕾•擬造花萼(赤)', @@ -184,7 +184,7 @@ Calyx_Crimson_Nihility_Jarilo_GreatMine = DungeonList( plane_id=2012101, ) Calyx_Crimson_Nihility_Luofu_AlchemyCommission = DungeonList( - id=17, + id=19, name='Calyx_Crimson_Nihility_Luofu_AlchemyCommission', cn='虚无之蕾•拟造花萼(赤)', cht='虛無之蕾•擬造花萼(赤)', From ca39c060621294976ed2299b00cb97c7fb19593b Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 19 Feb 2024 01:43:05 +0800 Subject: [PATCH 54/65] Fix: limit_entrance has no effect on calyx crimson dungeons --- tasks/dungeon/ui.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 6d42aeb42..fd0bfd9ee 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -118,6 +118,10 @@ class OcrDungeonListLimitEntrance(OcrDungeonList): self.button = ClickButton((*self.button.area[:3], self.button.area[3] - 70)) +class OcrDungeonListCalyxCrimsonLimitEntrance(OcrDungeonListCalyxCrimson, OcrDungeonListLimitEntrance): + pass + + class DraggableDungeonNav(DraggableList): # 0.5 is the magic number to reach bottom in 1 swipe # but relax we still have retires when magic doesn't work @@ -131,6 +135,8 @@ class DraggableDungeonList(DraggableList): # use_plane: True to use map planes to predict dungeons only. # Can only be True in Calyx Crimson use_plane = False + # limit_entrance: True to ensure the teleport button is insight + limit_entrance = False def load_rows(self, main: ModuleBase, allow_early_access=False): """ @@ -141,10 +147,16 @@ class DraggableDungeonList(DraggableList): relative_area = (0, 0, 1280, 120) if self.use_plane: self.keyword_class = [MapPlane, DungeonEntrance] - self.ocr_class = OcrDungeonListCalyxCrimson + if self.limit_entrance: + self.ocr_class = OcrDungeonListCalyxCrimsonLimitEntrance + else: + self.ocr_class = OcrDungeonListCalyxCrimson else: self.keyword_class = [DungeonList, DungeonEntrance] - self.ocr_class = OcrDungeonList + if self.limit_entrance: + self.ocr_class = OcrDungeonListLimitEntrance + else: + self.ocr_class = OcrDungeonList super().load_rows(main=main) # Check early access dungeons @@ -525,10 +537,10 @@ class DungeonUI(DungeonState): DUNGEON_LIST.drag_vector = (-0.4, -0.2) # Keyword loaded is reversed else: DUNGEON_LIST.drag_vector = (0.2, 0.4) - DUNGEON_LIST.ocr_class = OcrDungeonListLimitEntrance + DUNGEON_LIST.limit_entrance = True DUNGEON_LIST.insight_row(dungeon, main=self) DUNGEON_LIST.drag_vector = DraggableList.drag_vector - DUNGEON_LIST.ocr_class = OcrDungeonList + DUNGEON_LIST.limit_entrance = False DUNGEON_LIST.load_rows(main=self) # Check if dungeon unlocked for entrance in DUNGEON_LIST.navigates: From c7159e77c3c8de29fbe87f548ee1b83cc3d1f1f0 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 19 Feb 2024 17:50:49 +0800 Subject: [PATCH 55/65] Upd: Add MAIN_GOTO_CHARACTER under purple screen --- .../share/base/page/MAIN_GOTO_CHARACTER.2.png | Bin 0 -> 6855 bytes tasks/base/assets/assets_base_page.py | 23 ++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 assets/share/base/page/MAIN_GOTO_CHARACTER.2.png diff --git a/assets/share/base/page/MAIN_GOTO_CHARACTER.2.png b/assets/share/base/page/MAIN_GOTO_CHARACTER.2.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf008360eb8746091ab43899279215a4222d35b GIT binary patch literal 6855 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 Date: Mon, 19 Feb 2024 18:11:57 +0800 Subject: [PATCH 56/65] Fix: Wait world tab before falling back --- tasks/dungeon/ui.py | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index fd0bfd9ee..8bf8bd27c 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -490,16 +490,28 @@ class DungeonUI(DungeonState): Switch worlds in Calyx_Golden with error handling If world tab is not unlocked, fallback to Jarilo dungeons """ + # Wait world tab button = CALYX_WORLD_1 tab = False - # Selected tab - if self.image_color_count(button, color=(18, 18, 18), threshold=180, count=50): - tab = True - # Unselected tab - if self.image_color_count(button, color=(134, 134, 134), threshold=180, count=50): - tab = True - logger.attr('WorldTab', tab) + timeout = Timer(0.6, count=3).start() + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + # End + if timeout.reached(): + break + # Selected tab + if self.image_color_count(button, color=(18, 18, 18), threshold=180, count=50): + tab = True + break + # Unselected tab + if self.image_color_count(button, color=(134, 134, 134), threshold=180, count=50): + tab = True + break + logger.attr('WorldTab', tab) if not tab: logger.warning('World tab is not unlocked, fallback to Jarilo dungeons') if dungeon.is_Calyx_Golden_Memories: @@ -509,7 +521,8 @@ class DungeonUI(DungeonState): if dungeon.is_Calyx_Golden_Treasures: dungeon = KEYWORDS_DUNGEON_LIST.Calyx_Golden_Treasures_Jarilo_VI - return self._dungeon_world_set(dungeon, skip_first_screenshot=skip_first_screenshot) + self._dungeon_world_set(dungeon, skip_first_screenshot=skip_first_screenshot) + return dungeon def _dungeon_insight(self, dungeon: DungeonList): """ @@ -687,7 +700,7 @@ class DungeonUI(DungeonState): if dungeon.is_Calyx_Golden: self._dungeon_nav_goto(dungeon.dungeon_nav) self._dungeon_wait_until_dungeon_list_loaded() - self._dungeon_world_set_wrapper(dungeon) + dungeon = self._dungeon_world_set_wrapper(dungeon) self._dungeon_wait_until_dungeon_list_loaded() self._dungeon_insight(dungeon) self._dungeon_enter(dungeon) From 3ae48fedd8e96e9344e1f0691e3c74c9ca13223f Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 23 Feb 2024 12:36:17 +0800 Subject: [PATCH 57/65] Upd: [EN] OCR_DOUBLE_EVENT_REMAIN --- .../dungeon/event/OCR_DOUBLE_EVENT_REMAIN.png | Bin 13922 -> 12896 bytes tasks/dungeon/assets/assets_dungeon_event.py | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/share/dungeon/event/OCR_DOUBLE_EVENT_REMAIN.png b/assets/share/dungeon/event/OCR_DOUBLE_EVENT_REMAIN.png index c540a448d6066ea2d3caf8c373855b4fedd07462..216c47be34d70d7e17f64161a6e7836516f94157 100644 GIT binary patch literal 12896 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Ⓢ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 JDwJNo{~vgeZBPIJ literal 13922 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 Date: Fri, 23 Feb 2024 23:45:17 +0800 Subject: [PATCH 58/65] Fix: Limit click area of combat states (#339) --- assets/share/combat/state/COMBAT_AUTO.BUTTON.png | Bin 0 -> 6737 bytes .../combat/state/COMBAT_SPEED_2X.BUTTON.png | Bin 0 -> 6959 bytes tasks/combat/assets/assets_combat_state.py | 4 ++-- tasks/combat/state.py | 3 ++- 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 assets/share/combat/state/COMBAT_AUTO.BUTTON.png create mode 100644 assets/share/combat/state/COMBAT_SPEED_2X.BUTTON.png diff --git a/assets/share/combat/state/COMBAT_AUTO.BUTTON.png b/assets/share/combat/state/COMBAT_AUTO.BUTTON.png new file mode 100644 index 0000000000000000000000000000000000000000..b736577b777c0fc0f1aa97e7af8ddc89c1e1cbd0 GIT binary patch literal 6737 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.2s after clicking the button to avoid random noice + if self._combat_click_interval.current() >= 0.15 and not self._combat_click_interval.reached(): logger.info('Combat on going, _combat_auto_checked') self._combat_auto_checked = True return False From 9d263306d77dc51ca12af82e92d578e3aa52e953 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 23 Feb 2024 23:46:36 +0800 Subject: [PATCH 59/65] Upd: Add RuanMei as ranged character --- tasks/character/keywords/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks/character/keywords/__init__.py b/tasks/character/keywords/__init__.py index cf96673b8..cde9badfe 100644 --- a/tasks/character/keywords/__init__.py +++ b/tasks/character/keywords/__init__.py @@ -6,6 +6,7 @@ from tasks.character.keywords.classes import CharacterList, CombatType DICT_SORTED_RANGES = { # Mage, hit instantly, no trajectories 'Mage': [ + RuanMei, DanHengImbibitorLunae, Welt, FuXuan, From 78207563211eb879e42ab42ea7e6a510a5b0c4ed Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 24 Feb 2024 00:41:01 +0800 Subject: [PATCH 60/65] Add: Able to use support characters in weekly (#296) --- config/template.json | 4 ++ module/config/argument/args.json | 61 ++++++++++++++++++++++++++++ module/config/argument/default.yaml | 6 +++ module/config/argument/override.yaml | 7 ++++ module/config/argument/task.yaml | 1 + module/config/i18n/en-US.json | 20 ++++----- module/config/i18n/es-ES.json | 20 ++++----- module/config/i18n/ja-JP.json | 18 ++++---- module/config/i18n/zh-CN.json | 2 +- module/config/i18n/zh-TW.json | 2 +- tasks/dungeon/weekly.py | 3 +- 11 files changed, 111 insertions(+), 33 deletions(-) diff --git a/config/template.json b/config/template.json index 8661bc5e7..72e91bb2a 100644 --- a/config/template.json +++ b/config/template.json @@ -173,6 +173,10 @@ "Weekly": { "Name": "Echo_of_War_Divine_Seed", "Team": 1 + }, + "DungeonSupport": { + "Use": "do_not_use", + "Character": "FirstCharacter" } }, "Rogue": { diff --git a/module/config/argument/args.json b/module/config/argument/args.json index ce370b787..85586dacc 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1276,6 +1276,67 @@ 9 ] } + }, + "DungeonSupport": { + "Use": { + "type": "select", + "value": "do_not_use", + "option": [ + "always_use", + "do_not_use" + ] + }, + "Character": { + "type": "select", + "value": "FirstCharacter", + "option": [ + "FirstCharacter", + "Argenti", + "Arlan", + "Asta", + "Bailu", + "BlackSwan", + "Blade", + "Bronya", + "Clara", + "DanHeng", + "DanHengImbibitorLunae", + "DrRatio", + "FuXuan", + "Gepard", + "Guinaifen", + "Hanya", + "Herta", + "Himeko", + "Hook", + "Huohuo", + "JingYuan", + "Jingliu", + "Kafka", + "Luka", + "Luocha", + "Lynx", + "March7th", + "Misha", + "Natasha", + "Pela", + "Qingque", + "RuanMei", + "Sampo", + "Seele", + "Serval", + "SilverWolf", + "Sushang", + "Tingyun", + "TopazNumby", + "TrailblazerDestruction", + "TrailblazerPreservation", + "Welt", + "Xueyi", + "Yanqing", + "Yukong" + ] + } } }, "Rogue": { diff --git a/module/config/argument/default.yaml b/module/config/argument/default.yaml index 46b01f65c..c61b6d474 100644 --- a/module/config/argument/default.yaml +++ b/module/config/argument/default.yaml @@ -22,3 +22,9 @@ Assignment: Freebies: Scheduler: Enable: true + +# ==================== Weekly ==================== + +Weekly: + DungeonSupport: + Use: do_not_use diff --git a/module/config/argument/override.yaml b/module/config/argument/override.yaml index 4657d6590..bb458f39e 100644 --- a/module/config/argument/override.yaml +++ b/module/config/argument/override.yaml @@ -30,3 +30,10 @@ DataUpdate: value: true option: [ true, ] option_bold: [ true, ] + +# ==================== Weekly ==================== + +Weekly: + DungeonSupport: + Use: + option: [ always_use, do_not_use ] diff --git a/module/config/argument/task.yaml b/module/config/argument/task.yaml index 4fddcf5fc..34a1a102c 100644 --- a/module/config/argument/task.yaml +++ b/module/config/argument/task.yaml @@ -54,6 +54,7 @@ Weekly: Weekly: - Scheduler - Weekly + - DungeonSupport Rogue: - Scheduler - RogueWorld diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index f071fade4..35706dd1e 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -223,13 +223,13 @@ "Name": { "name": "Dungeon Name", "help": "Default dungeon setting", - "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-VI))", + "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-Ⅵ))", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: Character EXP (Bud of Memories (The Xianzhou Luofu))", "Calyx_Golden_Memories_Penacony": "Material: Character EXP (Bud of Memories (Penacony))", - "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-VI))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-Ⅵ))", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: Light Cone EXP (Bud of Aether (The Xianzhou Luofu))", "Calyx_Golden_Aether_Penacony": "Material: Light Cone EXP (Bud of Aether (Penacony))", - "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-VI))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-Ⅵ))", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Credit (Bud of Treasures (The Xianzhou Luofu))", "Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures (Penacony))", "Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)", @@ -272,13 +272,13 @@ "name": "At Double Calyx Event, choose dungeon", "help": "Return to the default dungeon settings after double times exhausted", "do_not_participate": "Dont participate in event", - "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-VI))", + "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-Ⅵ))", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: Character EXP (Bud of Memories (The Xianzhou Luofu))", "Calyx_Golden_Memories_Penacony": "Material: Character EXP (Bud of Memories (Penacony))", - "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-VI))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-Ⅵ))", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: Light Cone EXP (Bud of Aether (The Xianzhou Luofu))", "Calyx_Golden_Aether_Penacony": "Material: Light Cone EXP (Bud of Aether (Penacony))", - "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-VI))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-Ⅵ))", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Credit (Bud of Treasures (The Xianzhou Luofu))", "Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures (Penacony))", "Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)", @@ -329,13 +329,13 @@ "name": "Clear Calyx Golden 1 times", "help": "", "do_not_achieve": "Don't Do This Quest", - "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-VI))", + "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-Ⅵ))", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: Character EXP (Bud of Memories (The Xianzhou Luofu))", "Calyx_Golden_Memories_Penacony": "Material: Character EXP (Bud of Memories (Penacony))", - "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-VI))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-Ⅵ))", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: Light Cone EXP (Bud of Aether (The Xianzhou Luofu))", "Calyx_Golden_Aether_Penacony": "Material: Light Cone EXP (Bud of Aether (Penacony))", - "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-VI))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-Ⅵ))", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Credit (Bud of Treasures (The Xianzhou Luofu))", "Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures (Penacony))" }, @@ -404,7 +404,7 @@ }, "Character": { "name": "Support Character", - "help": "Select a friend support character, if not found, select the default (first) role", + "help": "Select a friend support character, if not found, select the default (first) role\nSupport character should not be the same as the character in the team, recommended to prioritize friends.", "FirstCharacter": "First Character", "Argenti": "Argenti", "Arlan": "Arlan", diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index 41deed116..255b71091 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -223,13 +223,13 @@ "Name": { "name": "Nombre de la Mazmorra", "help": "Ajustes predeterminados de las mazmorras", - "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-VI))", + "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-Ⅵ))", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: EXP de personaje (Flor de los recuerdos (El Luofu de Xianzhou))", "Calyx_Golden_Memories_Penacony": "Material: EXP de personaje (Flor de los recuerdos (Colonipenal))", - "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-VI))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-Ⅵ))", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: EXP de conos de luz (Flor de éter (El Luofu de Xianzhou))", "Calyx_Golden_Aether_Penacony": "Material: EXP de conos de luz (Flor de éter (Colonipenal))", - "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-VI))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-Ⅵ))", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Créditos (Flor de tesoros (El Luofu de Xianzhou))", "Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros (Colonipenal))", "Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)", @@ -272,13 +272,13 @@ "name": "En los eventos de x2 de Cáliz", "help": "Se volverán a los ajustes predeterminados una vez se acaben los intentos del evento", "do_not_participate": "No participar en el evento", - "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-VI))", + "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-Ⅵ))", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: EXP de personaje (Flor de los recuerdos (El Luofu de Xianzhou))", "Calyx_Golden_Memories_Penacony": "Material: EXP de personaje (Flor de los recuerdos (Colonipenal))", - "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-VI))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-Ⅵ))", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: EXP de conos de luz (Flor de éter (El Luofu de Xianzhou))", "Calyx_Golden_Aether_Penacony": "Material: EXP de conos de luz (Flor de éter (Colonipenal))", - "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-VI))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-Ⅵ))", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Créditos (Flor de tesoros (El Luofu de Xianzhou))", "Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros (Colonipenal))", "Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)", @@ -329,13 +329,13 @@ "name": "Completar Cáliz (oro) 1 vez", "help": "", "do_not_achieve": "No hacer esta misión", - "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-VI))", + "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-Ⅵ))", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: EXP de personaje (Flor de los recuerdos (El Luofu de Xianzhou))", "Calyx_Golden_Memories_Penacony": "Material: EXP de personaje (Flor de los recuerdos (Colonipenal))", - "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-VI))", + "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-Ⅵ))", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: EXP de conos de luz (Flor de éter (El Luofu de Xianzhou))", "Calyx_Golden_Aether_Penacony": "Material: EXP de conos de luz (Flor de éter (Colonipenal))", - "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-VI))", + "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-Ⅵ))", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Créditos (Flor de tesoros (El Luofu de Xianzhou))", "Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros (Colonipenal))" }, @@ -404,7 +404,7 @@ }, "Character": { "name": "Personaje de apoyo", - "help": "Selecciona qué personaje de apoyo de un amigo se usará. Si no se encuentra, se seleccionará al predeterminado.", + "help": "Selecciona qué personaje de apoyo de un amigo se usará. Si no se encuentra, se seleccionará al predeterminado.\nEl personaje de apoyo no debe ser el mismo que el personaje del equipo, se recomienda priorizar a los amigos.", "FirstCharacter": "Primer personaje", "Argenti": "Argenti", "Arlan": "Arlan", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 666ff6344..eda548e63 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -223,13 +223,13 @@ "Name": { "name": "Dungeon.Name.name", "help": "Dungeon.Name.help", - "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-VI):", + "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-Ⅵ):", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "素材:役割経験(回憶の蕾・仙舟羅浮):", "Calyx_Golden_Memories_Penacony": "素材:役割経験(回憶の蕾・ピノコニー):", - "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-VI):", + "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-Ⅵ):", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "素材:武器経験(エーテルの蕾・仙舟羅浮):", "Calyx_Golden_Aether_Penacony": "素材:武器経験(エーテルの蕾・ピノコニー):", - "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-VI)", + "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-Ⅵ)", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "素材:クレジット(秘蔵の蕾・仙舟羅浮)", "Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾・ピノコニー)", "Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)", @@ -272,13 +272,13 @@ "name": "Dungeon.NameAtDoubleCalyx.name", "help": "Dungeon.NameAtDoubleCalyx.help", "do_not_participate": "do_not_participate", - "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-VI):", + "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-Ⅵ):", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "素材:役割経験(回憶の蕾・仙舟羅浮):", "Calyx_Golden_Memories_Penacony": "素材:役割経験(回憶の蕾・ピノコニー):", - "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-VI):", + "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-Ⅵ):", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "素材:武器経験(エーテルの蕾・仙舟羅浮):", "Calyx_Golden_Aether_Penacony": "素材:武器経験(エーテルの蕾・ピノコニー):", - "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-VI)", + "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-Ⅵ)", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "素材:クレジット(秘蔵の蕾・仙舟羅浮)", "Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾・ピノコニー)", "Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)", @@ -329,13 +329,13 @@ "name": "DungeonDaily.CalyxGolden.name", "help": "DungeonDaily.CalyxGolden.help", "do_not_achieve": "do_not_achieve", - "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-VI):", + "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-Ⅵ):", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "素材:役割経験(回憶の蕾・仙舟羅浮):", "Calyx_Golden_Memories_Penacony": "素材:役割経験(回憶の蕾・ピノコニー):", - "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-VI):", + "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-Ⅵ):", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "素材:武器経験(エーテルの蕾・仙舟羅浮):", "Calyx_Golden_Aether_Penacony": "素材:武器経験(エーテルの蕾・ピノコニー):", - "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-VI)", + "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-Ⅵ)", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "素材:クレジット(秘蔵の蕾・仙舟羅浮)", "Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾・ピノコニー)" }, diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index be799b4a7..52539cc65 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -404,7 +404,7 @@ }, "Character": { "name": "好友支援角色", - "help": "选择好友支援角色,未找到则选择默认(第一个)角色", + "help": "选择好友支援角色,未找到则选择默认(第一个)角色\n支援角色不要与队伍中的角色重复,建议置顶好友角色", "FirstCharacter": "支援列表第一个角色", "Argenti": "银枝", "Arlan": "阿兰", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 7e0af0ca2..4e180d426 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -404,7 +404,7 @@ }, "Character": { "name": "好友支援角色", - "help": "選擇好友支援角色,未找到則選擇默認(第一個)角色", + "help": "選擇好友支援角色,未找到則選擇默認(第一個)角色\n支援角色不要與隊伍中的角色重複,建議置頂好友角色", "FirstCharacter": "支援列表第一個角色", "Argenti": "銀枝", "Arlan": "阿蘭", diff --git a/tasks/dungeon/weekly.py b/tasks/dungeon/weekly.py index 359b9ba59..846104f47 100644 --- a/tasks/dungeon/weekly.py +++ b/tasks/dungeon/weekly.py @@ -15,8 +15,7 @@ class WeeklyDungeon(Dungeon): skip_ui_switch: bool = False): if team is None: team = self.config.Weekly_Team - # No support - support_character = '' + skip_ui_switch = True return super()._dungeon_run( dungeon=dungeon, team=team, wave_limit=wave_limit, From 14e3a9a73a61f4bf0ea4ed30835e2965fd398d54 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 24 Feb 2024 00:44:56 +0800 Subject: [PATCH 61/65] Fix: Handle character died (#317) --- tasks/combat/combat.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index d14e4fc39..ab97419ce 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -265,8 +265,12 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo self.device.click(COMBAT_EXIT) self.interval_reset(COMBAT_AGAIN) continue + # Dropped light cone from weekly if self.handle_get_light_cone(): continue + # Having any character died + if self.handle_popup_confirm(): + continue def combat_exit(self, skip_first_screenshot=True): """ From 18981f4e5b4b8ddf3d40afc0b2ff5ef61b8c70e6 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 24 Feb 2024 01:35:32 +0800 Subject: [PATCH 62/65] Fix: Remove noice from the text "In Progress" --- tasks/rogue/entry/entry.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tasks/rogue/entry/entry.py b/tasks/rogue/entry/entry.py index dfccf7637..4a7bd2410 100644 --- a/tasks/rogue/entry/entry.py +++ b/tasks/rogue/entry/entry.py @@ -76,7 +76,17 @@ class OcrRogueWorld(Ocr): # Crop to the up/down border of the white letter center = color_similarity_2d(image, color=(255, 255, 255)) cv2.inRange(center, 180, 255, dst=center) - center = np.where(np.sum(center, axis=1) > 200)[0] + # print(np.count_nonzero(center, axis=1)) + # World 8 + # [ 0 0 0 0 0 0 0 2 23 24 22 21 23 29 44 47 38 37 31 32 33 33 31 34 + # 34 44 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + # 0 0 0 0 0 0 0 0] + # In Progress + # World 8 + # [ 0 0 0 1 0 3 6 5 3 3 3 1 2 0 0 1 2 0 0 0 0 0 0 0 + # 0 0 0 2 22 24 22 21 23 29 45 46 39 36 30 32 32 32 31 34 34 44 34 0 + # 0 0 0 0 0 0 0 0] + center = np.where(np.count_nonzero(center, axis=1) > 10)[0] if len(center) < 2: return image up, down = center[0], center[-1] From 94dca8b9cef1671742c90823e9f6d687dbe9bac4 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 24 Feb 2024 17:26:22 +0800 Subject: [PATCH 63/65] Refactor: Select next support character --- .../combat/support/SUPPORT_SELECTED.2.png | Bin 0 -> 5828 bytes .../combat/support/SUPPORT_SELECTED.3.png | Bin 0 -> 5861 bytes .../combat/support/SUPPORT_SELECTED.4.png | Bin 0 -> 5999 bytes .../support/SUPPORT_SELECTED.SEARCH.png | Bin 0 -> 11754 bytes .../share/combat/support/SUPPORT_SELECTED.png | Bin 0 -> 5833 bytes tasks/combat/assets/assets_combat_support.py | 33 +++++++ tasks/combat/support.py | 92 +++++------------- 7 files changed, 60 insertions(+), 65 deletions(-) create mode 100644 assets/share/combat/support/SUPPORT_SELECTED.2.png create mode 100644 assets/share/combat/support/SUPPORT_SELECTED.3.png create mode 100644 assets/share/combat/support/SUPPORT_SELECTED.4.png create mode 100644 assets/share/combat/support/SUPPORT_SELECTED.SEARCH.png create mode 100644 assets/share/combat/support/SUPPORT_SELECTED.png diff --git a/assets/share/combat/support/SUPPORT_SELECTED.2.png b/assets/share/combat/support/SUPPORT_SELECTED.2.png new file mode 100644 index 0000000000000000000000000000000000000000..1b74ed76d0968aaa6b63dbc4759cc7afd61f640f GIT binary patch literal 5828 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 E0fB1~c>n+a literal 0 HcmV?d00001 diff --git a/assets/share/combat/support/SUPPORT_SELECTED.3.png b/assets/share/combat/support/SUPPORT_SELECTED.3.png new file mode 100644 index 0000000000000000000000000000000000000000..716dedc85df603dfe1c43666f03d0f87d3d38bc8 GIT binary patch literal 5861 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 literal 0 HcmV?d00001 diff --git a/assets/share/combat/support/SUPPORT_SELECTED.4.png b/assets/share/combat/support/SUPPORT_SELECTED.4.png new file mode 100644 index 0000000000000000000000000000000000000000..c46abcc9d769920b670c5b9f84a5ac53b9c5d2a6 GIT binary patch literal 5999 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 GJo-P*A9z&& literal 0 HcmV?d00001 diff --git a/assets/share/combat/support/SUPPORT_SELECTED.SEARCH.png b/assets/share/combat/support/SUPPORT_SELECTED.SEARCH.png new file mode 100644 index 0000000000000000000000000000000000000000..10a1f29b5e548dd650f1d3d22ef4c3a548bf3f9b GIT binary patch literal 11754 zcmeIYc{tQx_&tH(4RjRBf7r^TsXQ$@+{5kN#VkM-M5>lZs80ms`rxwO9AiDI|l z-m?p@Z(e(|gIzy0YAEAKnaj!OsEhZ_FDX-ndvo5022D~ZD_tvFkW(Vy4F{N*JEOq_ ze!YI&%L{(J5PZ!FVo>1e5xs*9S{1;-Ji=6pf%pkzDFXq1}z>{f6ia*|r+eYkTaSGJO;vHY7GCpKX)pE=z3T_n(;} z4ILQzD zBcgF&dSJcs0Rto0Y1BN~Z9hERiN@BU-ul+Ky|w|}7U0^zlC69XTgFB9mY}8kfy%2| zLTS%UzMa@7$i8hGMeOqPD%n5xH8$i2F{Jxp3vhP5Cuj=Xc&7CySdxC8<5p(^mJ&OhnGr1%5D%KYieP;tVOy_>~oa(-{#GZ%?vp|Hz$3+=2hNuad~i;K+PhYx_asiJhmI|KbGMpYtW1 z+gxkSqhp17Z*5&TKp5rr)D4on@A#(YEtC-tf@)LyzzMe_7w*^7bdk6CQFtG=8-5 z{qtV}x9XRuAw#wo2TijQxC|7XHHR6q)8$S*&3JRZ@paly);CeA=@-vF7itTBa0yCF+Dv!mtNb(ib3YcgX#)Ri}UX z$X>U-!FzM~2zzCo8op#|Pk#FCf^3(Zz*CneoKG<3RuT&mA$#KMxe`?qEfT{L$!{*0 zdz))^1ismJA=jKU*UlpJrLK9g$)DG3KY4OHUhgxnczwK}$<*I8&ZPOgeP*@&+RbGr zj(2zO=w{s2&%EG7__{ad0MA!B=V_}`on98`aVfVa=Puj4TbeNRV_FgLlLYn$ks`uK8Edkx1WzO^do9vuy z6;_f}U_JhDulq4&r>P$gokrcBTrX>#x;^-6SHrdP_}Xikt!FY1mmQ);y8KZL;MKUA zhY`G-r_k@*>vqEN@^!hMtlF$Ef2+kC6WpF%EpIJp_xbVTn^bS!ue|RQu__&Sw=~D< z-<3V9F?X_c@Lvq>AHQFh)SVR4z?5_@iI(@oLc=1^V&0-F?@Z^Vaj9{SPD^(a0n3!_ zDXJ+ArLXc+@@xH4JO;RjxZ}jz#OKXCyN^w*POwirn_#A>EI2NREqE+6@B1OhwXajn zM=iw5$M=VyJGOE>Yf$0y>)O|!$1Gh0T%LQU&MNZ0Jo~VLE7>oZ*UTd)I>$3Ts3CEf zpIYAbzI{G3r6Q#_|F_4_z8~seLUUKn9ZeDVZu?n%^5onU&1&ezk3Xq7DLJ2JAChJ4 z{OqjlR;q-Ii}8ojI%Pe+_0-yssv3eFR5jF{mz&1W8ecUS(u2|?t6x@&45(L&hINKL z4P#kNTTxqXSc_Y%84R4^nKoi_Kz&3FqpBkKBZ|>(Xko^ujM*%TOfgIq%re_G_MF{;E~K_s5%o?EXw1|M%I2Bp;`O;ocV?ct^&X z8q)kvSSwmT3{k%Gge&=-=J2ikr%Yt{jE8eP&+Xeib35gZu}<}im>1`Z2xSH*9*v}0 zBrYiTsfB7UU%P9p>-$xn&Dc~jFn;f&52CZ@EKYa!=QaPn@mpFY0iS@+H08LSR3h0W zOE^L>zA7pCnB#BYh)2D^iWMW(QP+*LaH9VH7R>r{HrX$dYU9sqf@~ndf$xK|L8GW)AB0;*QeS-8?H6H zOIkA-vNAQFaSiO9i8Z~|mYuCFdDBuM@pZ!Y2G4@Iiyxf!I3`{(pL9*`u(1f2;7zp8 z!{)szSbVEnHZo*sWZw}oAL!BD-ETmsr;O{5XN`O2(X49<4XRvEcC_4`;>Z`6ju{rP z_b}-9c^>3CAKO^cSl@_NbX26+{3y-qnR$LZb0H`-+_u4DEkBn~{rgaNXHB1f@a&FT z`}U~yPbN%MzLyNJbgR+{o%d{`-t3FxzbsH*GZNNUrsr?`B`q#EJD6obXL8)t2jkvb zSX1+k&BOF~jF7%6b~pux=}w_M^M8-MD6!+y$>EQO2VRB*|1lYT-t@WmbK}6%aKb$6 zxPG8yn`(`3o^+;1hWhiW$|vBSG-vFoU9dSKP$*9ifF=b=8qGO_ac zMZX0KuRlB0u-7&yE}(F=x_j*(%QEM`@RIc+XQBsb(ShjD{MnjwatB*v+Iqr9d*oo7 z-VePFQC-oPxKv?b0S^AEnJZ0?2Xo%#>~5|Pv)Bk6_s%5`tPQQ4ZMItdHMMQ&esfJh z;Okkh$=uh4s&%4u!j(;d>eDY*^P74?C(9m0p0IE*_;Ke+$|Dp?kDDRom zCocqaPxN`@DYyg*Ppw=m9H_rfu_BdnCCPf8R7iZIU?TEcT<(~d9J`S@ueq-Hk!&x` z3sI)uYh})#?uf=^oHsK+`LMiH^yHn~m-o02Moau$)Xp_A7ZdR~btEEdPXQOpgWZ3~ z!@X;7D_mUs?EDr~$blni@-^ubw>@E zx~aG>#^|eL>&J^^Cz!n->8rk{TOXsVpA-&HXQPT2(So+2n4g8N;T(`Ua&IvzHp-l0 zvzL;8b?}w*(AQc_wm=d*x`1C!mCVWu&9tu>#ceW>bS0(}=$)<=>ExI?)c&8e@0S3hW6mI?PL z;Sb$2`s*Iyn1f30m&@^{<F7z=|nowtU_DF)mZ+_PFG!$cJz#asPd} z>bv*sA?eY=R?CQ{M4>YOWkOPvs1M>sLlHorphF%hOYekAnOp;QOkEy)1%5T>Ilj-& z5QLt8v4d31){6)OqTmB1G+xB?@BDa2+*%*TSAdkNli~XjPR+FdxL$VKpGMFn(Z4`d z^7C8sSc;nei1%vxy{S+c$J@FjC}`QKul>y8rq1G{|MD;c%grfl4g^jp|8w1RRMKUH zfa@zB6{|m9)Q9TB*qoJ8M>r>#XTYf^cW$`gM6-KC{m5Da5-o7!7GpG`rIeK3`ifhX zr|&W$=!_mM7cc|hAj^S7T(PVdT2LAzQP*8z{~6I)&~S6fgAbfo@8p4>p$^SA;P7ZR z3R%RHq!V(#tmOVrM6K=gF)dJCxt#1(+JYF|xuKuQpo#}Pa_6;!*Rgex@oH~jleRcKg#1IUa=Yu( zuuV(CH5-$atHUxka^ct$A3(KfRw3g}gUF$nz?mYwjb+Y_#FD3LiYP?wzYJ6Rn?uQ* z;S1>+Q{Rl&`g-iv$bE>IhlFqy4J2A6Sv~H=%(p5{KXT3L2iitsaCm^P2`92v0gWYW z<2@QO^Ef@EPOX1B2D3`l=3K9B-soM~7_tvYOksgk+zi->fej^|>F%!nXWrGrNj5z9 zzqA``u9Xt1D6M+JYwKMD%ZoA^A)oSF`_l2R9f(q*LVx4BSm0y0@=VY8`)p2}upkT}(>7 zSnbo5RNq214KFD3hj{4WIh)v3T9@$0b(xKM$(p6ajkTtl`J}^X0W%Hu>%y4um7eBw z%^FqTRn|E(WA*vgxUji#`;8!ju}&Mz+JuW{@Ct=c6F}`PZVs!XXXsDRJN0SXK=5jE z7=;i{7MNVW7hJvEQ5d$|p1%GwM`ON|P(2?y89XrCtQo$sMhjn`O^=I8@hl(fn+&6& zIZt3`8TJF8pDfrLbz@8LxfF^!LN* zAyXe&%nWkL>6!~gaaDsHn8i%ZAnKmNvSYuQA>iXe>-*G4jo1I)Nnbj=u`Im$IW9Ya z3cVXC6m-pZ6)n6-r;_t2Apeihcz~Y!~gutO_m8Ao2Lpx`#)wUt{jRN4xT9LsvJ?YUo^H~CT|Q4zzR|< zo}Dl=g3vrM090QepSgF*1FIh+!w2tgEY(yv!U;opz-e`7IXQf|Yoo7bV+ga+q_iT_ z&V+z476_5j*CuvTcSFMV9mExO(uq+C`2Cm5AX3hOx2!ArM9J^Q{F=vRO^1*nKHW`7 zODN&Q3dv2Uv1EydV zZVk)*Z%`-pa$tV4VEy$$S4Vh@i_~P7<@`J*Tbq4BoYP2^7P5$-Bjs0HMoHECJ>TBv znvUP;*-OHEH>o;6E~?jYko}W8Go>fHi={emG^XUEVBbN+ZsO$gEatM}mBvO|AgxRe z*+F9qKYK%Qv(-b#36&RX%$5)@-UA`3v4oSV?>J!E0y8$^2ii5E0Co7CTL@?TDCu(* zQYu$LZ_nCD8r6SIMC24Blq{ns%Q9ktRRPjz$MgeoKaJ8?sEE`L<%G~p(Qfj55F%AP$T*#7ZTSIRU=;ZfNk`m;ZVXHp#Di<&9O9hrE!RE+hbcs zFJhl7XQ2-4E?a@xfQc>KXaCKjOcVO9-Uat1?)0K`>!w!D(Pv2;_%9;$F>?PF9 z+S1We4vqDE3WO#`;op&_^qQ$&|BbmNvc1(&3K_aX>p5yM3l3us4D~L}if2ca$TGun zqcw&qQ(>zt4IVwx#T@Fb(a$Pw?;{WQ96i2tIMR|$+42SA357i~tUmprwv^jyD}xuA zp=EGFoe1_j@W94VH2Yc~Dj+x`XO6NY4XLlSZB|m9AAs`>MzIPG;c;7rtU$%$P5ldV z=b;fu3D-8=F1LUZsvgI5{l>z(WN<_iq%$<1fq~zW^HVP))AZlnn~2kk`4MW;g~T~l z9}k_;ucD2g$+zK1#!1BCI1s`#*F@9JilR0&GQ-8PPXQbTmZx{g6LX&_k@d#{xXR>4 zdeqh`mTb=m!4(=_qL6@L%DF@HV+GlL1BH8!*~2O z=~wlb`VL5PZgaJxb(7_FYo_uxYUj)F+{0awc?=Low1l_%x_*h4^B!1l*GXSO7e=C= z(qAL3hB!ovWs|_9Z9A6Y;>!Y)TBpDBV@G0oiY;<1`F}OIiWBgz_&|9^`F%~WIcCWb z&W&bl3imYyWoJ%I)WK(V{?RoMw~RgQe7wx-dytT_4-t~hZAG3_GpK7SO7O;vS9soS zpPpXsZiTZgMw`g+pd0Ar_u5uHxP}Qe>n~X7?LCGd#PXH}hrfk~XHWJ`P%DDZ6kOUH z?6(bxcfT#&e=sZi*^kt>dIviV`sGAlRh%x%*+6>nj9s|NjNdkI#AuySU3Jh49L`&k29_!_i{$e<7 zVhA*@hxv`euTS(LJiYLEtHiltdmceFwA3nsl@2>}Q&C3wYZNi_@*oE|z|KMJd)~p0 zaK}Ffg1h$Ftb84`R(26X!e57(WX91>6@_23nMr)ymz<_tU|4FUj}=mJgd$;o0u)}w&1SDJjA-|s zgoNyz#KU=*@fy6hpA0fD2hy>7MjcmJkyYPNi=-0CDP*HBptp+Mhm{DIKsiH9vSM!S zfFxSSP|DfdhwW-r-pFJ-!pZvWMD%5f^D;CLU?fQ3`SmW}uh2?~gEeUerbYr))M_omYtmuOC_Mhu3o-&szxLBTy@ZrN*$`b>X8W##FmBC-ColD@L z!vv^|Dv3()zc}D%gQo9icnB2s^y;q&1yhw@uR@DEaG{huwKPI*w0R0)0J;DriEj9@}` zY6^haB9h(vt(JaW;vxwM8tBk#K!YR&XBnoBpp+@X4E-Dg>BOQ@7z0{^C}oj-4{@1F z|JaF;B0&Jx{-U^bpP;Aq91>0w0G`gHQGJvQ@LyaX1A4(FF(`4Xak!p%n*lp6(Q=Cc z+hfgy_zq^5b|;aa`>x_=_=}ql*VVIs_;c9nNgNU#@Vcc;{_V)g8DW=q@0$Vb zuFZ9%NPcG`om=mlaPoPC7g#_;%OJbUh|Rg)h1Pgt3hcT{$G78IYWtLB`JfH7P$=cQ z9=GU+XW21OY0aW)bf794Iru^?%%a;bR!DgH(W|l?n6xif@fTE%sYlQfwHVDrDywCn zo8RFSw7?6|+L74Xk~2ttHiAoitO!}tRnVV@O6@VqPGEL+iqnRBngoIBzk3}}2o7Cm zB6Y~Mq*N>U-|orp4M$wWzMVLh1=~9!{B9@)y4t6v8!on|=pZ*9F9neR`{40f@+7?@ z;Kt=wI#xl$^vTfk^m;AVKGvWtR6yXQZ6J;WI zo`r)MZ$afnCe{0e@H>7QR6Y*!{@I-E`#nVDb)FlRlF z??j}Axt>ozS^R^J#g?L{4y}y1R;75qp;g%iZ|HW_K~=QQqXOjrGfPg1^@vK>>UsS;i zl=ys-PVTfvOmZC+(1A+dPjrn#)Hw}e|A-Ihiw|Eq_g-b*_fw3qDGFij4*KV6q=N+@ z4e>V{@pUzW#r(N~>fE0d@9kfC@=2Z8BC28c*|^ns3c=@gR-!m!z`uR38qsy0B25+I z);x%(NkH(s1`$%=*8sk)ygWbuW+LqJ{H4Y(VeS%YoOfM=bM+j=6&HGoyPc85T~s{h zZBUnr73HHTeeN)Z^SBobZ#UZ!Mv_k@tA)oqrJN+^w2G9$dPP4vpwxm&SDbgS0^AZ; z%!N~%@f<#vx!3djcqCK;CWv4phS5Dy67qVsbP8EZMVzAzo2voVurZGyP5smFYzdO1&>EbNzm(51ims4A1IRuXzzpkY8 z$z!6rKA1}$uH@#%Ic;|AQY@r|e=D>COJ7gjA^d_;yG~YOZVb*$l^Pc8 z51Q0iTszf(0R2=-1cHvU2)K-J;oMka?K^UN*S>iEeH9Le5cZ7#3M6|A;7xxfN7#Lj zL5EU2`8OZ$=jQicz&fQSUI~YSKHEvy$w!5@DvqUZqKiPYl(Actg~>I0lO#T zP;dIJ&vS?qomog{2UyCaXW?11m0n|OK}aR*+_GMOb>5-AYq|s7Pq6N@bR6NsL6jo* zN1a&Ibo$^!?~9HB%naoanwHbon--NB!~;1(+`Q2iipxe+IkXE$@UCcOeIKYas5{Q$ zo-!Eq&H5k`Bb5Me)C~wBX+2N_nAv6h>fRCf;hO>p7;!_PiL_`~4v#ARDRx+XtBb#u@B zbFN_ZA$~IjsuT7)Jm0EP=B%EAt`l==M_6nCaxyVRPmSdvk|Tj5n-BK_nBOZh?iPL}nT`R(ODY3M;Rd~JX{ zQCx>#$Za+)HB6BRhvuH?qbt8R(A(^zjZfr>H=;R@yCIo4`u@pJLd?8y+fhiy@~jhf z@n=ZaLXcwUlj1;!)kp!%p3#o&Q;rfGSo({QGVzLlLj+<=?FY)}kY6OvJT(X}=Jo|w z=x2(#i(794hL@R@a}rFcq3hNNCoP%Hba*Q`D>Lx3)Pv%ovF;SAaW@3H$|-55$NDzs zAE4{_e7@B5iC0~XxpCe|$c;YVG`}t$MZMUevS6F)ns_5N!E{siPz54f|Kn4XJdve| z(m8TlfKo&+XhHuSORwTm_F$-X98l^YHr`Eb4DpA=(uNXNY$E4)6nB__rmG zrT^)(l_|ftKl1-C1wSb&Han%~FkI$ac?j{}um4^u8deNiXC!7l{2<`?On{e3M2akg$utc=LHJJJw*$1!hl zUe+K=E?r4~yd9|^|Gl(u%c0$?k$7nMPqr?=$=?@~aM8`75y{)gtxe2+v6TJha&gmu zi?Mv0EZ^e)672R6KLjF2)$ae!!MAHF+7ON(>CUAew)P|16K_8_j>en)<-XB^nUh6c zE&hut*%^tJTnm4zP=S3luoVF-Tdc$<(e6|K!|KPWT^v&f9usX#K0>0oEy0)?L3$QT z)9>h(|Ic7U@pSqwT_j7MXoFH#1nAbHgBevZcM<22r09k%6J!r%EWgMQOus^TOpoII zAo=43MDJp{;8?HBX26*`)tJcti#{B=W+dxUJuFoZi^F!>54k%=^532rL9Wpt1T~Scf9v8YUhn5G|#X>4i;Q*8`VZ zI8THm_(uBCPM(8!cr-#(;Ts%+?QOcOMguZyC=OCsknMSpz8GBP#?cr3pkFu9+kQYl z)+KP`ybS^;b?CACB#4e-lGjzJ_V&^dY8Cz0E+PLPm}N`12Cr&^;-Q!VrEUi}x`Tef zqXmR)$Of$zk#IAT6caL`EZs0ua~TdMDlL7pLTt91lc;?<;2?s_^4vH}b4H-ZH~$~|=ULPM literal 0 HcmV?d00001 diff --git a/assets/share/combat/support/SUPPORT_SELECTED.png b/assets/share/combat/support/SUPPORT_SELECTED.png new file mode 100644 index 0000000000000000000000000000000000000000..38ed41ddb7eb93692f24dfe5d7dab185b383d00c GIT binary patch literal 5833 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 literal 0 HcmV?d00001 diff --git a/tasks/combat/assets/assets_combat_support.py b/tasks/combat/assets/assets_combat_support.py index c27e78bcc..10dc25671 100644 --- a/tasks/combat/assets/assets_combat_support.py +++ b/tasks/combat/assets/assets_combat_support.py @@ -53,3 +53,36 @@ COMBAT_SUPPORT_SELECTED = ButtonWrapper( button=(69, 114, 91, 116), ), ) +SUPPORT_SELECTED = ButtonWrapper( + name='SUPPORT_SELECTED', + share=[ + Button( + file='./assets/share/combat/support/SUPPORT_SELECTED.png', + area=(54, 202, 60, 220), + search=(40, 146, 68, 628), + color=(125, 126, 131), + button=(54, 202, 60, 220), + ), + Button( + file='./assets/share/combat/support/SUPPORT_SELECTED.2.png', + area=(53, 547, 59, 565), + search=(40, 146, 68, 628), + color=(144, 146, 147), + button=(53, 547, 59, 565), + ), + Button( + file='./assets/share/combat/support/SUPPORT_SELECTED.3.png', + area=(54, 432, 61, 450), + search=(40, 146, 68, 628), + color=(139, 139, 141), + button=(54, 432, 61, 450), + ), + Button( + file='./assets/share/combat/support/SUPPORT_SELECTED.4.png', + area=(52, 417, 59, 435), + search=(40, 146, 68, 628), + color=(140, 138, 145), + button=(52, 417, 59, 435), + ), + ], +) diff --git a/tasks/combat/support.py b/tasks/combat/support.py index 8c63d4f23..ff628217d 100644 --- a/tasks/combat/support.py +++ b/tasks/combat/support.py @@ -2,15 +2,15 @@ import cv2 import numpy as np from scipy import signal -from module.base.button import Button, ButtonWrapper +from module.base.button import ClickButton from module.base.timer import Timer -from module.base.utils import area_size, crop, load_image, rgb2luma +from module.base.utils import area_offset, area_size, crop, load_image, rgb2luma from module.logger import logger from module.ui.scroll import Scroll from tasks.base.assets.assets_base_popup import POPUP_CANCEL from tasks.base.ui import UI from tasks.combat.assets.assets_combat_support import COMBAT_SUPPORT_ADD, COMBAT_SUPPORT_LIST, \ - COMBAT_SUPPORT_LIST_GRID, COMBAT_SUPPORT_LIST_SCROLL, COMBAT_SUPPORT_SELECTED + COMBAT_SUPPORT_LIST_GRID, COMBAT_SUPPORT_LIST_SCROLL, COMBAT_SUPPORT_SELECTED, SUPPORT_SELECTED from tasks.combat.assets.assets_combat_team import COMBAT_TEAM_DISMISSSUPPORT, COMBAT_TEAM_SUPPORT @@ -84,64 +84,36 @@ class SupportCharacter: self.button[0], self.button[1] - 5, self.button[0] + 30, self.button[1]) if self.button else None -class ArrowWrapper(ButtonWrapper): - - def find_center(self, image): - res = cv2.matchTemplate( - self.matched_button.image, image, cv2.TM_CCOEFF_NORMED) - _, max_val, _, max_loc = cv2.minMaxLoc(res) - return ( - ( - (max_loc[0] + self.matched_button.image.shape[1] / 2), - (max_loc[1] + self.matched_button.image.shape[0] / 2), - ) - if max_val > 0.75 - else None - ) - - class NextSupportCharacter: - _arrow = ArrowWrapper( - name="NextSupportCharacterArrow", - share=Button( - file='./assets/support/selected_character_arrow.png', - area=None, - search=None, - color=None, - button=None, - ) - ) - _crop_area = (290, 115, 435, 634) - def __init__(self, screenshot): - self.name = "SupportCharacterArrow" - self.screenshot = crop(screenshot, NextSupportCharacter._crop_area) - self.arrow_center = self._find_center() - self.button = self._get_next_support_character_button() + self.name = "NextSupportCharacter" + self.button = self.get_next_support_character_button(screenshot) def __bool__(self): return self.button is not None - def _find_center(self): - center = NextSupportCharacter._arrow.find_center(self.screenshot) - center = get_position_in_original_image( - center, NextSupportCharacter._crop_area) if center else None - return center + def get_next_support_character_button(self, screenshot) -> ClickButton | None: + if SUPPORT_SELECTED.match_template(screenshot, similarity=0.75): + # Move area to the next character card center + area = SUPPORT_SELECTED.button + area = area_offset((105, 85, 255, 170), offset=area[:2]) + if area[3] < COMBAT_SUPPORT_LIST_GRID.area[3]: + return ClickButton(area, name=self.name) + else: + # Out of list + logger.info('Next character is out of list') + return None + else: + return None - def _get_next_support_character_button(self): - area = (self.arrow_center[0] - 200, min(self.arrow_center[1] + 65, 615), self.arrow_center[0] + 10, min( - self.arrow_center[1] + 80, 620)) if self.arrow_center and self.arrow_center[1] < 510 else None - return ButtonWrapper( - name="NextSupportCharacterButton", - share=Button( - file='./assets/support/selected_character_arrow.png', - area=area, - search=area, - # if next support was selected, the average color of the button will larger than 220 - color=(220, 220, 220), - button=area, - ) - ) if self.arrow_center and self.arrow_center[1] < 510 else None + def is_next_support_character_selected(self, screenshot) -> bool: + if self.button is None: + return False + area = self.button.area + # Move area from the card center to the left edge of the card + area = area_offset(area, offset=(-120, 0)) + image = crop(screenshot, area, copy=False) + return SUPPORT_SELECTED.match_template(image, similarity=0.75, direct_match=True) class SupportListScroll(Scroll): @@ -351,7 +323,7 @@ class CombatSupport(UI): self.device.screenshot() # End - if next_support and self._next_support_selected(next_support): + if next_support is not None and next_support.is_next_support_character_selected(self.device.image): return if interval.reached(): @@ -367,13 +339,3 @@ class CombatSupport(UI): interval.reset() continue - - def _next_support_selected(self, next_support: NextSupportCharacter): - """ - Returns: - bool: True if selected else False - """ - if self.match_color(next_support.button, threshold=20): - logger.info("Next support selected") - return True - return False From dbb565810364702069c0564f5d49a30d6150dc2d Mon Sep 17 00:00:00 2001 From: Zero <98764734+X-Zero-L@users.noreply.github.com> Date: Thu, 29 Feb 2024 23:01:29 +0800 Subject: [PATCH 64/65] Upd: Character (#352) --- assets/character/Sparkle.png | Bin 0 -> 18920 bytes dev_tools/screenshot.py | 6 +++--- module/config/argument/args.json | 2 ++ module/config/config_generated.py | 2 +- module/config/config_updater.py | 2 +- module/config/i18n/en-US.json | 1 + module/config/i18n/es-ES.json | 1 + module/config/i18n/ja-JP.json | 1 + module/config/i18n/zh-CN.json | 1 + module/config/i18n/zh-TW.json | 1 + 10 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 assets/character/Sparkle.png diff --git a/assets/character/Sparkle.png b/assets/character/Sparkle.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5b3e4c5e5965700009a69472a7b591069aa9b0 GIT binary patch literal 18920 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 LNkvXXu0mjfCjjBR literal 0 HcmV?d00001 diff --git a/dev_tools/screenshot.py b/dev_tools/screenshot.py index 90ce49bd0..746be65d4 100644 --- a/dev_tools/screenshot.py +++ b/dev_tools/screenshot.py @@ -50,12 +50,12 @@ def handle_sensitive_info(image): _ = EmptyConnection() name = input( - '输入alas配置文件名称,或者模拟器serial,或者模拟器端口号: (默认输入 "alas"):\n' - '例如:"alas", "127.0.0.1:16384", "7555"\n' + '输入src配置文件名称,或者模拟器serial,或者模拟器端口号: (默认输入 "src"):\n' + '例如:"src", "127.0.0.1:16384", "7555"\n' ) name = name.strip().strip('"').strip() if not name: - name = 'alas' + name = 'src' if name.isdigit(): name = f'127.0.0.1:{name}' if name in alas_instance(): diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 85586dacc..c85879ceb 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -421,6 +421,7 @@ "Seele", "Serval", "SilverWolf", + "Sparkle", "Sushang", "Tingyun", "TopazNumby", @@ -1326,6 +1327,7 @@ "Seele", "Serval", "SilverWolf", + "Sparkle", "Sushang", "Tingyun", "TopazNumby", diff --git a/module/config/config_generated.py b/module/config/config_generated.py index b3e344ea7..8af4d7616 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -53,7 +53,7 @@ class GeneratedConfig: # Group `DungeonSupport` DungeonSupport_Use = 'when_daily' # always_use, when_daily, do_not_use - DungeonSupport_Character = 'FirstCharacter' # FirstCharacter, Argenti, Arlan, Asta, Bailu, BlackSwan, Blade, Bronya, Clara, DanHeng, DanHengImbibitorLunae, DrRatio, FuXuan, Gepard, Guinaifen, Hanya, Herta, Himeko, Hook, Huohuo, JingYuan, Jingliu, Kafka, Luka, Luocha, Lynx, March7th, Misha, Natasha, Pela, Qingque, RuanMei, Sampo, Seele, Serval, SilverWolf, Sushang, Tingyun, TopazNumby, TrailblazerDestruction, TrailblazerPreservation, Welt, Xueyi, Yanqing, Yukong + DungeonSupport_Character = 'FirstCharacter' # FirstCharacter, Argenti, Arlan, Asta, Bailu, BlackSwan, Blade, Bronya, Clara, DanHeng, DanHengImbibitorLunae, DrRatio, FuXuan, Gepard, Guinaifen, Hanya, Herta, Himeko, Hook, Huohuo, JingYuan, Jingliu, Kafka, Luka, Luocha, Lynx, March7th, Misha, Natasha, Pela, Qingque, RuanMei, Sampo, Seele, Serval, SilverWolf, Sparkle, Sushang, Tingyun, TopazNumby, TrailblazerDestruction, TrailblazerPreservation, Welt, Xueyi, Yanqing, Yukong # Group `DungeonStorage` DungeonStorage_TrailblazePower = {} diff --git a/module/config/config_updater.py b/module/config/config_updater.py index e71ef205a..0f10f4d41 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -100,7 +100,7 @@ class ConfigGenerator: options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Echo_of_War]) # Insert characters from tasks.character.keywords import CharacterList - unsupported_characters = ['Sparkle'] + unsupported_characters = [] characters = [character.name for character in CharacterList.instances.values() if character.name not in unsupported_characters] option_add(keys='DungeonSupport.Character.option', options=characters) diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 35706dd1e..b6dad37bd 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -441,6 +441,7 @@ "Seele": "Seele", "Serval": "Serval", "SilverWolf": "Silver Wolf", + "Sparkle": "Sparkle", "Sushang": "Sushang", "Tingyun": "Tingyun", "TopazNumby": "Topaz & Numby", diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index 255b71091..e9a468347 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -441,6 +441,7 @@ "Seele": "Seele", "Serval": "Serval", "SilverWolf": "Silver Wolf", + "Sparkle": "Sparkle", "Sushang": "Sushang", "Tingyun": "Tingyun", "TopazNumby": "Topaz y Conti", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index eda548e63..a09ba1f54 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -441,6 +441,7 @@ "Seele": "ゼーレ", "Serval": "セーバル", "SilverWolf": "銀狼", + "Sparkle": "花火", "Sushang": "素裳", "Tingyun": "停雲", "TopazNumby": "トパーズ&カブ", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 52539cc65..4f8a58c57 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -441,6 +441,7 @@ "Seele": "希儿", "Serval": "希露瓦", "SilverWolf": "银狼", + "Sparkle": "花火", "Sushang": "素裳", "Tingyun": "停云", "TopazNumby": "托帕&账账", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 4e180d426..b77f7b05f 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -441,6 +441,7 @@ "Seele": "希兒", "Serval": "希露瓦", "SilverWolf": "銀狼", + "Sparkle": "花火", "Sushang": "素裳", "Tingyun": "停雲", "TopazNumby": "托帕&帳帳", From 58e054a008013c8a1be869b3014c3ba2a3365df2 Mon Sep 17 00:00:00 2001 From: Asxcvbn <63904802+Asxcvbn@users.noreply.github.com> Date: Wed, 6 Mar 2024 15:47:21 +0800 Subject: [PATCH 65/65] RuanMei OCR postprocess in CN (#358) * RuanMei OCR postprocess in CN * dont match dot between ruanmei when ocr postprocess * RuanMei OCR postprocess in CN update: used a wildcard for the dot between Ruan and Mei --- tasks/character/switch.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasks/character/switch.py b/tasks/character/switch.py index 7f8faf301..4240a9309 100644 --- a/tasks/character/switch.py +++ b/tasks/character/switch.py @@ -23,6 +23,8 @@ class OcrCharacterName(OcrWhiteLetterOnComplexBackground): # Dan Heng o.ImbibitorLunae result = re.sub(r'[0Oo\-. ]{1,3}Imbi', 'Imbi', result) + result = re.sub(r'院.?梅', '阮•梅', result) + return super().after_process(result)