From 315bc261bbb26c39b76bafb3a9227bd9c7173598 Mon Sep 17 00:00:00 2001 From: X-Zero-L <98764734+X-Zero-L@users.noreply.github.com> Date: Mon, 16 Oct 2023 12:24:52 +0800 Subject: [PATCH 1/8] Add: Get Support Reward Everyday (#155) * Add: Get Support Reward Everyday * Upd: i18n * Upd: Instead of using ocr, use template matching * fix bug * fix: remove debug img * Upd: Character (#157) * Upd: character * Upd: Character --------- Co-authored-by: LmeSzinc --- assets/character/Jingliu.png | Bin 0 -> 18525 bytes assets/cn/freebies/support_reward/PROFILE.png | Bin 0 -> 10447 bytes .../support_reward/CAN_GET_REWARD.png | Bin 0 -> 10875 bytes .../support_reward/CLICKING_REWARD.png | Bin 0 -> 8928 bytes .../freebies/support_reward/IN_PROFILE.png | Bin 0 -> 7386 bytes .../support_reward/MENU_TO_PROFILE.png | Bin 0 -> 5836 bytes config/template.json | 11 ++ dev_tools/keyword_extract.py | 2 +- module/config/argument/args.json | 36 ++++++ module/config/argument/argument.yaml | 2 + module/config/argument/default.yaml | 3 + module/config/argument/menu.json | 3 +- module/config/argument/task.yaml | 4 +- module/config/config_generated.py | 9 +- module/config/config_manual.py | 2 +- module/config/config_updater.py | 2 +- module/config/i18n/en-US.json | 21 +++- module/config/i18n/es-ES.json | 21 +++- module/config/i18n/ja-JP.json | 21 +++- module/config/i18n/zh-CN.json | 21 +++- module/config/i18n/zh-TW.json | 21 +++- src.py | 3 + tasks/character/keywords/character_list.py | 73 ++++++++---- tasks/dungeon/keywords/dungeon.py | 49 ++++---- tasks/dungeon/keywords/dungeon_detailed.py | 21 +++- .../assets/assets_freebies_support_reward.py | 56 +++++++++ tasks/freebies/freebies.py | 14 +++ tasks/freebies/support_reward.py | 107 ++++++++++++++++++ tasks/rogue/keywords/curio.py | 101 ++++++++++++++++- 29 files changed, 535 insertions(+), 68 deletions(-) create mode 100644 assets/character/Jingliu.png create mode 100644 assets/cn/freebies/support_reward/PROFILE.png create mode 100644 assets/share/freebies/support_reward/CAN_GET_REWARD.png create mode 100644 assets/share/freebies/support_reward/CLICKING_REWARD.png create mode 100644 assets/share/freebies/support_reward/IN_PROFILE.png create mode 100644 assets/share/freebies/support_reward/MENU_TO_PROFILE.png create mode 100644 tasks/freebies/assets/assets_freebies_support_reward.py create mode 100644 tasks/freebies/freebies.py create mode 100644 tasks/freebies/support_reward.py diff --git a/assets/character/Jingliu.png b/assets/character/Jingliu.png new file mode 100644 index 0000000000000000000000000000000000000000..156543581b5626e78fba6664423c14002e182d63 GIT binary patch literal 18525 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 literal 0 HcmV?d00001 diff --git a/assets/share/freebies/support_reward/CLICKING_REWARD.png b/assets/share/freebies/support_reward/CLICKING_REWARD.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b3c597a55dad4047f737c1d3eccf31956069f0 GIT binary patch literal 8928 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 literal 0 HcmV?d00001 diff --git a/assets/share/freebies/support_reward/IN_PROFILE.png b/assets/share/freebies/support_reward/IN_PROFILE.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0aadee801f88ad57cddebe65becf53626b78fe GIT binary patch literal 7386 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 P3~~lfS3j3^P6 BattlePass > DailyQuest > Assignment > DataUpdate - > Weekly > Dungeon + > Weekly > Dungeon > Freebies """ """ diff --git a/module/config/config_updater.py b/module/config/config_updater.py index fe79b947f..4c7b3b8ea 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -91,7 +91,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 = ["Guinaifen", "TopazandNumby"] 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 34c9b3a03..ad5bad717 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -46,6 +46,10 @@ "name": "Dashboard Upd", "help": "" }, + "Freebies": { + "name": "Freebies", + "help": "" + }, "Rogue": { "name": "Simulated Universe", "help": "Simulated Universe is in development, task will not be run" @@ -228,10 +232,11 @@ "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)", + "Stagnant_Shadow_Icicle": "Ascension: Ice (Yanqing / Jingliu)", "Stagnant_Shadow_Doom": "Ascension: Lightning (Kafka / Jing Yuan)", "Stagnant_Shadow_Puppetry": "Ascension: Imaginary (Dan Heng • Imbibitor Lunae)", "Stagnant_Shadow_Abomination": "Ascension: Quantum (Lynx / Fu Xuan)", + "Stagnant_Shadow_Scorch": "Ascension: Fire (Guinaifen / Topaz and Numby)", "Stagnant_Shadow_Celestial": "Ascension: Wind (Blade)", "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)", @@ -315,10 +320,11 @@ "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)", + "Stagnant_Shadow_Icicle": "Ascension: Ice (Yanqing / Jingliu)", "Stagnant_Shadow_Doom": "Ascension: Lightning (Kafka / Jing Yuan)", "Stagnant_Shadow_Puppetry": "Ascension: Imaginary (Dan Heng • Imbibitor Lunae)", "Stagnant_Shadow_Abomination": "Ascension: Quantum (Lynx / Fu Xuan)", + "Stagnant_Shadow_Scorch": "Ascension: Fire (Guinaifen / Topaz and Numby)", "Stagnant_Shadow_Celestial": "Ascension: Wind (Blade)" }, "CavernOfCorrosion": { @@ -364,6 +370,7 @@ "Himeko": "Himeko", "Hook": "Hook", "JingYuan": "Jing Yuan", + "Jingliu": "Jingliu", "Kafka": "Kafka", "Luka": "Luka", "Luocha": "Luocha", @@ -407,6 +414,16 @@ "help": "" } }, + "SupportReward": { + "_info": { + "name": "Support Reward", + "help": "" + }, + "Collect": { + "name": "Receive support reward", + "help": "" + } + }, "Weekly": { "_info": { "name": "Echo of War Settings", diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index 2dd6537de..899b1cdb1 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -46,6 +46,10 @@ "name": "Actualizar panel", "help": "" }, + "Freebies": { + "name": "Freebies", + "help": "" + }, "Rogue": { "name": "Universo Simulado", "help": "El Universo Simulado está en desarrollo, y no se ejecutará" @@ -228,10 +232,11 @@ "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)", + "Stagnant_Shadow_Icicle": "Ascension: Hielo (Yanqing / Jingliu)", "Stagnant_Shadow_Doom": "Ascension: Rayo (Kafka / Jing Yuan)", "Stagnant_Shadow_Puppetry": "Ascension: Imaginario (Dan Heng - Imbibitor Lunae)", "Stagnant_Shadow_Abomination": "Ascension: Cuántico (Lynx / Fu Xuan)", + "Stagnant_Shadow_Scorch": "Ascension: Fuego (Guinaifen / Topaz y Conti)", "Stagnant_Shadow_Celestial": "Ascension: Viento (Blade)", "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)", @@ -315,10 +320,11 @@ "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)", + "Stagnant_Shadow_Icicle": "Ascension: Hielo (Yanqing / Jingliu)", "Stagnant_Shadow_Doom": "Ascension: Rayo (Kafka / Jing Yuan)", "Stagnant_Shadow_Puppetry": "Ascension: Imaginario (Dan Heng - Imbibitor Lunae)", "Stagnant_Shadow_Abomination": "Ascension: Cuántico (Lynx / Fu Xuan)", + "Stagnant_Shadow_Scorch": "Ascension: Fuego (Guinaifen / Topaz y Conti)", "Stagnant_Shadow_Celestial": "Ascension: Viento (Blade)" }, "CavernOfCorrosion": { @@ -364,6 +370,7 @@ "Himeko": "Himeko", "Hook": "Hook", "JingYuan": "Jing Yuan", + "Jingliu": "Jingliu", "Kafka": "Kafka", "Luka": "Luka", "Luocha": "Luocha", @@ -407,6 +414,16 @@ "help": "" } }, + "SupportReward": { + "_info": { + "name": "Support Reward", + "help": "" + }, + "Collect": { + "name": "Receive support reward", + "help": "" + } + }, "Weekly": { "_info": { "name": "Ajustes de Ecos de la guerra", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index ddc1ab825..d26b6c720 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -46,6 +46,10 @@ "name": "Task.DataUpdate.name", "help": "Task.DataUpdate.help" }, + "Freebies": { + "name": "他ギフト", + "help": "" + }, "Rogue": { "name": "Task.Rogue.name", "help": "Task.Rogue.help" @@ -228,10 +232,11 @@ "Stagnant_Shadow_Spike": "キャラクター昇格素材:物理(ナターシャ / クラーラ / ルカ / 素裳)", "Stagnant_Shadow_Rime": "キャラクター昇格素材:氷(三月なのか / ヘルタ / ジェパード / ペラ)", "Stagnant_Shadow_Mirage": "キャラクター昇格素材:虚数(ヴェルト / 羅刹 / 御空)", - "Stagnant_Shadow_Icicle": "キャラクター昇格素材:氷(彦卿)", + "Stagnant_Shadow_Icicle": "キャラクター昇格素材:氷(彦卿 / 鏡流)", "Stagnant_Shadow_Doom": "キャラクター昇格素材:雷(カフカ / 景元)", "Stagnant_Shadow_Puppetry": "キャラクター昇格素材:虚数(丹恒・飲月)", "Stagnant_Shadow_Abomination": "キャラクター昇格素材:量子(リンクス / 符玄)", + "Stagnant_Shadow_Scorch": "キャラクター昇格素材:炎(桂乃芬 / トパーズ&カブ)", "Stagnant_Shadow_Celestial": "キャラクター昇格素材:風(刃)", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路", @@ -315,10 +320,11 @@ "Stagnant_Shadow_Spike": "キャラクター昇格素材:物理(ナターシャ / クラーラ / ルカ / 素裳)", "Stagnant_Shadow_Rime": "キャラクター昇格素材:氷(三月なのか / ヘルタ / ジェパード / ペラ)", "Stagnant_Shadow_Mirage": "キャラクター昇格素材:虚数(ヴェルト / 羅刹 / 御空)", - "Stagnant_Shadow_Icicle": "キャラクター昇格素材:氷(彦卿)", + "Stagnant_Shadow_Icicle": "キャラクター昇格素材:氷(彦卿 / 鏡流)", "Stagnant_Shadow_Doom": "キャラクター昇格素材:雷(カフカ / 景元)", "Stagnant_Shadow_Puppetry": "キャラクター昇格素材:虚数(丹恒・飲月)", "Stagnant_Shadow_Abomination": "キャラクター昇格素材:量子(リンクス / 符玄)", + "Stagnant_Shadow_Scorch": "キャラクター昇格素材:炎(桂乃芬 / トパーズ&カブ)", "Stagnant_Shadow_Celestial": "キャラクター昇格素材:風(刃)" }, "CavernOfCorrosion": { @@ -364,6 +370,7 @@ "Himeko": "姫子", "Hook": "フック", "JingYuan": "景元", + "Jingliu": "鏡流", "Kafka": "カフカ", "Luka": "ルカ", "Luocha": "羅刹", @@ -407,6 +414,16 @@ "help": "DungeonStorage.SimulatedUniverse.help" } }, + "SupportReward": { + "_info": { + "name": "サポートボーナス", + "help": "" + }, + "Collect": { + "name": "收取サポートボーナス", + "help": "" + } + }, "Weekly": { "_info": { "name": "Weekly._info.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 014a2d7e7..52d76882e 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -46,6 +46,10 @@ "name": "仪表盘更新", "help": "" }, + "Freebies": { + "name": "白嫖奖励", + "help": "" + }, "Rogue": { "name": "模拟宇宙", "help": "模拟宇宙还在开发中,任务不会被运行" @@ -228,10 +232,11 @@ "Stagnant_Shadow_Spike": "角色晋阶材料:物理(娜塔莎 / 克拉拉 / 卢卡 / 素裳)", "Stagnant_Shadow_Rime": "角色晋阶材料:冰(三月七 / 黑塔 / 杰帕德 / 佩拉)", "Stagnant_Shadow_Mirage": "角色晋阶材料:虚数(瓦尔特 / 罗刹 / 驭空)", - "Stagnant_Shadow_Icicle": "角色晋阶材料:冰(彦卿)", + "Stagnant_Shadow_Icicle": "角色晋阶材料:冰(彦卿 / 镜流)", "Stagnant_Shadow_Doom": "角色晋阶材料:雷(卡芙卡 / 景元)", "Stagnant_Shadow_Puppetry": "角色晋阶材料:虚数(丹恒•饮月)", "Stagnant_Shadow_Abomination": "角色晋阶材料:量子(玲可 / 符玄)", + "Stagnant_Shadow_Scorch": "角色晋阶材料:火(桂乃芬 / 托帕&账账)", "Stagnant_Shadow_Celestial": "角色晋阶材料:风(刃)", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "遗器:冰套+风套(霜风之径•侵蚀隧洞)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遗器:物理套+击破套(迅拳之径•侵蚀隧洞)", @@ -315,10 +320,11 @@ "Stagnant_Shadow_Spike": "角色晋阶材料:物理(娜塔莎 / 克拉拉 / 卢卡 / 素裳)", "Stagnant_Shadow_Rime": "角色晋阶材料:冰(三月七 / 黑塔 / 杰帕德 / 佩拉)", "Stagnant_Shadow_Mirage": "角色晋阶材料:虚数(瓦尔特 / 罗刹 / 驭空)", - "Stagnant_Shadow_Icicle": "角色晋阶材料:冰(彦卿)", + "Stagnant_Shadow_Icicle": "角色晋阶材料:冰(彦卿 / 镜流)", "Stagnant_Shadow_Doom": "角色晋阶材料:雷(卡芙卡 / 景元)", "Stagnant_Shadow_Puppetry": "角色晋阶材料:虚数(丹恒•饮月)", "Stagnant_Shadow_Abomination": "角色晋阶材料:量子(玲可 / 符玄)", + "Stagnant_Shadow_Scorch": "角色晋阶材料:火(桂乃芬 / 托帕&账账)", "Stagnant_Shadow_Celestial": "角色晋阶材料:风(刃)" }, "CavernOfCorrosion": { @@ -364,6 +370,7 @@ "Himeko": "姬子", "Hook": "虎克", "JingYuan": "景元", + "Jingliu": "镜流", "Kafka": "卡芙卡", "Luka": "卢卡", "Luocha": "罗刹", @@ -407,6 +414,16 @@ "help": "" } }, + "SupportReward": { + "_info": { + "name": "支援奖励", + "help": "" + }, + "Collect": { + "name": "领取支援奖励", + "help": "" + } + }, "Weekly": { "_info": { "name": "历战余响设置", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 1356b5d22..834ebf938 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -46,6 +46,10 @@ "name": "儀表板更新", "help": "" }, + "Freebies": { + "name": "免費獎勵", + "help": "" + }, "Rogue": { "name": "模擬宇宙", "help": "模擬宇宙還在開發中,任務不會被運行" @@ -228,10 +232,11 @@ "Stagnant_Shadow_Spike": "角色晉階材料:物理(娜塔莎 / 克拉拉 / 盧卡 / 素裳)", "Stagnant_Shadow_Rime": "角色晉階材料:冰(三月七 / 黑塔 / 傑帕德 / 佩拉)", "Stagnant_Shadow_Mirage": "角色晉階材料:虛數(瓦爾特 / 羅剎 / 馭空)", - "Stagnant_Shadow_Icicle": "角色晉階材料:冰(彥卿)", + "Stagnant_Shadow_Icicle": "角色晉階材料:冰(彥卿 / 鏡流)", "Stagnant_Shadow_Doom": "角色晉階材料:雷(卡芙卡 / 景元)", "Stagnant_Shadow_Puppetry": "角色晉階材料:虛數(丹恆•飲月)", "Stagnant_Shadow_Abomination": "角色晉階材料:量子(玲可 / 符玄)", + "Stagnant_Shadow_Scorch": "角色晉階材料:火(桂乃芬 / 托帕&帳帳)", "Stagnant_Shadow_Celestial": "角色晉階材料:風(刃)", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "遺器:冰套+風套(霜風之徑•侵蝕隧洞)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遺器:物理套+擊破套(迅拳之徑•侵蝕隧洞)", @@ -315,10 +320,11 @@ "Stagnant_Shadow_Spike": "角色晉階材料:物理(娜塔莎 / 克拉拉 / 盧卡 / 素裳)", "Stagnant_Shadow_Rime": "角色晉階材料:冰(三月七 / 黑塔 / 傑帕德 / 佩拉)", "Stagnant_Shadow_Mirage": "角色晉階材料:虛數(瓦爾特 / 羅剎 / 馭空)", - "Stagnant_Shadow_Icicle": "角色晉階材料:冰(彥卿)", + "Stagnant_Shadow_Icicle": "角色晉階材料:冰(彥卿 / 鏡流)", "Stagnant_Shadow_Doom": "角色晉階材料:雷(卡芙卡 / 景元)", "Stagnant_Shadow_Puppetry": "角色晉階材料:虛數(丹恆•飲月)", "Stagnant_Shadow_Abomination": "角色晉階材料:量子(玲可 / 符玄)", + "Stagnant_Shadow_Scorch": "角色晉階材料:火(桂乃芬 / 托帕&帳帳)", "Stagnant_Shadow_Celestial": "角色晉階材料:風(刃)" }, "CavernOfCorrosion": { @@ -364,6 +370,7 @@ "Himeko": "姬子", "Hook": "虎克", "JingYuan": "景元", + "Jingliu": "鏡流", "Kafka": "卡芙卡", "Luka": "盧卡", "Luocha": "羅剎", @@ -407,6 +414,16 @@ "help": "" } }, + "SupportReward": { + "_info": { + "name": "支援獎勵", + "help": "" + }, + "Collect": { + "name": "收取支援獎勵", + "help": "" + } + }, "Weekly": { "_info": { "name": "歷戰餘響設定", diff --git a/src.py b/src.py index 66a302530..c706eb32c 100644 --- a/src.py +++ b/src.py @@ -46,6 +46,9 @@ class StarRailCopilot(AzurLaneAutoScript): from tasks.item.data_update import DataUpdate DataUpdate(config=self.config, device=self.device).run() + def freebies(self): + from tasks.freebies.freebies import Freebies + Freebies(config=self.config, device=self.device).run() if __name__ == '__main__': src = StarRailCopilot('src') diff --git a/tasks/character/keywords/character_list.py b/tasks/character/keywords/character_list.py index 06acf958f..09665daf4 100644 --- a/tasks/character/keywords/character_list.py +++ b/tasks/character/keywords/character_list.py @@ -93,8 +93,17 @@ Gepard = CharacterList( jp='ジェパード', es='Gepard', ) -Herta = CharacterList( +Guinaifen = CharacterList( id=11, + name='Guinaifen', + cn='桂乃芬', + cht='桂乃芬', + en='Guinaifen', + jp='桂乃芬', + es='Guinaifen', +) +Herta = CharacterList( + id=12, name='Herta', cn='黑塔', cht='黑塔', @@ -103,7 +112,7 @@ Herta = CharacterList( es='Herta', ) Himeko = CharacterList( - id=12, + id=13, name='Himeko', cn='姬子', cht='姬子', @@ -112,7 +121,7 @@ Himeko = CharacterList( es='Himeko', ) Hook = CharacterList( - id=13, + id=14, name='Hook', cn='虎克', cht='虎克', @@ -121,7 +130,7 @@ Hook = CharacterList( es='Hook', ) JingYuan = CharacterList( - id=14, + id=15, name='JingYuan', cn='景元', cht='景元', @@ -129,8 +138,17 @@ JingYuan = CharacterList( jp='景元', es='Jing Yuan', ) +Jingliu = CharacterList( + id=16, + name='Jingliu', + cn='镜流', + cht='鏡流', + en='Jingliu', + jp='鏡流', + es='Jingliu', +) Kafka = CharacterList( - id=15, + id=17, name='Kafka', cn='卡芙卡', cht='卡芙卡', @@ -139,7 +157,7 @@ Kafka = CharacterList( es='Kafka', ) Luka = CharacterList( - id=16, + id=18, name='Luka', cn='卢卡', cht='盧卡', @@ -148,7 +166,7 @@ Luka = CharacterList( es='Luka', ) Luocha = CharacterList( - id=17, + id=19, name='Luocha', cn='罗刹', cht='羅剎', @@ -157,7 +175,7 @@ Luocha = CharacterList( es='Luocha', ) Lynx = CharacterList( - id=18, + id=20, name='Lynx', cn='玲可', cht='玲可', @@ -166,7 +184,7 @@ Lynx = CharacterList( es='Lynx', ) March7th = CharacterList( - id=19, + id=21, name='March7th', cn='三月七', cht='三月七', @@ -175,7 +193,7 @@ March7th = CharacterList( es='Siete de Marzo', ) Natasha = CharacterList( - id=20, + id=22, name='Natasha', cn='娜塔莎', cht='娜塔莎', @@ -184,7 +202,7 @@ Natasha = CharacterList( es='Natasha', ) Pela = CharacterList( - id=21, + id=23, name='Pela', cn='佩拉', cht='佩拉', @@ -193,7 +211,7 @@ Pela = CharacterList( es='Pela', ) Qingque = CharacterList( - id=22, + id=24, name='Qingque', cn='青雀', cht='青雀', @@ -202,7 +220,7 @@ Qingque = CharacterList( es='Qingque', ) Sampo = CharacterList( - id=23, + id=25, name='Sampo', cn='桑博', cht='桑博', @@ -211,7 +229,7 @@ Sampo = CharacterList( es='Sampo', ) Seele = CharacterList( - id=24, + id=26, name='Seele', cn='希儿', cht='希兒', @@ -220,7 +238,7 @@ Seele = CharacterList( es='Seele', ) Serval = CharacterList( - id=25, + id=27, name='Serval', cn='希露瓦', cht='希露瓦', @@ -229,7 +247,7 @@ Serval = CharacterList( es='Serval', ) SilverWolf = CharacterList( - id=26, + id=28, name='SilverWolf', cn='银狼', cht='銀狼', @@ -238,7 +256,7 @@ SilverWolf = CharacterList( es='Silver Wolf', ) Sushang = CharacterList( - id=27, + id=29, name='Sushang', cn='素裳', cht='素裳', @@ -247,7 +265,7 @@ Sushang = CharacterList( es='Sushang', ) Tingyun = CharacterList( - id=28, + id=30, name='Tingyun', cn='停云', cht='停雲', @@ -255,8 +273,17 @@ Tingyun = CharacterList( jp='停雲', es='Tingyun', ) +TopazandNumby = CharacterList( + id=31, + name='TopazandNumby', + cn='托帕&账账', + cht='托帕&帳帳', + en='Topaz and Numby', + jp='トパーズ&カブ', + es='Topaz y Conti', +) TrailblazerDestruction = CharacterList( - id=29, + id=32, name='TrailblazerDestruction', cn='Trailblazer•毁灭', cht='Trailblazer•毀滅', @@ -265,7 +292,7 @@ TrailblazerDestruction = CharacterList( es='Trailblazer: Destrucción', ) TrailblazerPreservation = CharacterList( - id=30, + id=33, name='TrailblazerPreservation', cn='Trailblazer•存护', cht='Trailblazer•存護', @@ -274,7 +301,7 @@ TrailblazerPreservation = CharacterList( es='Trailblazer: Conservación', ) Welt = CharacterList( - id=31, + id=34, name='Welt', cn='瓦尔特', cht='瓦爾特', @@ -283,7 +310,7 @@ Welt = CharacterList( es='Welt', ) Yanqing = CharacterList( - id=32, + id=35, name='Yanqing', cn='彦卿', cht='彥卿', @@ -292,7 +319,7 @@ Yanqing = CharacterList( es='Yanqing', ) Yukong = CharacterList( - id=33, + id=36, name='Yukong', cn='驭空', cht='馭空', diff --git a/tasks/dungeon/keywords/dungeon.py b/tasks/dungeon/keywords/dungeon.py index 144b77180..393a2bdf0 100644 --- a/tasks/dungeon/keywords/dungeon.py +++ b/tasks/dungeon/keywords/dungeon.py @@ -192,8 +192,17 @@ Stagnant_Shadow_Abomination = DungeonList( jp='凝結虚影・厄獣の形', es='Forma de la abominación', ) -Stagnant_Shadow_Celestial = DungeonList( +Stagnant_Shadow_Scorch = DungeonList( id=22, + name='Stagnant_Shadow_Scorch', + cn='燔灼之形•凝滞虚影', + cht='燔灼之形•凝滯虛影', + en='Shape of Scorch', + jp='凝結虚影・燔灼の形', + es='Forma abrasada', +) +Stagnant_Shadow_Celestial = DungeonList( + id=23, name='Stagnant_Shadow_Celestial', cn='天人之形•凝滞虚影', cht='天人之形•凝滯虛影', @@ -202,7 +211,7 @@ Stagnant_Shadow_Celestial = DungeonList( es='Forma de lo celestial', ) Cavern_of_Corrosion_Path_of_Gelid_Wind = DungeonList( - id=23, + id=24, name='Cavern_of_Corrosion_Path_of_Gelid_Wind', cn='霜风之径•侵蚀隧洞', cht='霜風之徑•侵蝕隧洞', @@ -211,7 +220,7 @@ Cavern_of_Corrosion_Path_of_Gelid_Wind = DungeonList( es='Senda del viento gélido', ) Cavern_of_Corrosion_Path_of_Jabbing_Punch = DungeonList( - id=24, + id=25, name='Cavern_of_Corrosion_Path_of_Jabbing_Punch', cn='迅拳之径•侵蚀隧洞', cht='迅拳之徑•侵蝕隧洞', @@ -220,7 +229,7 @@ Cavern_of_Corrosion_Path_of_Jabbing_Punch = DungeonList( es='Senda de los puños rápidos', ) Cavern_of_Corrosion_Path_of_Drifting = DungeonList( - id=25, + id=26, name='Cavern_of_Corrosion_Path_of_Drifting', cn='漂泊之径•侵蚀隧洞', cht='漂泊之徑•侵蝕隧洞', @@ -229,7 +238,7 @@ Cavern_of_Corrosion_Path_of_Drifting = DungeonList( es='Senda de la deriva', ) Cavern_of_Corrosion_Path_of_Providence = DungeonList( - id=26, + id=27, name='Cavern_of_Corrosion_Path_of_Providence', cn='睿治之径•侵蚀隧洞', cht='睿治之徑•侵蝕隧洞', @@ -238,7 +247,7 @@ Cavern_of_Corrosion_Path_of_Providence = DungeonList( es='Senda de la providencia', ) Cavern_of_Corrosion_Path_of_Holy_Hymn = DungeonList( - id=27, + id=28, name='Cavern_of_Corrosion_Path_of_Holy_Hymn', cn='圣颂之径•侵蚀隧洞', cht='聖頌之徑•侵蝕隧洞', @@ -247,7 +256,7 @@ Cavern_of_Corrosion_Path_of_Holy_Hymn = DungeonList( es='Senda del himno sagrado', ) Cavern_of_Corrosion_Path_of_Conflagration = DungeonList( - id=28, + id=29, name='Cavern_of_Corrosion_Path_of_Conflagration', cn='野焰之径•侵蚀隧洞', cht='野焰之徑•侵蝕隧洞', @@ -256,7 +265,7 @@ Cavern_of_Corrosion_Path_of_Conflagration = DungeonList( es='Senda de la conflagración', ) Cavern_of_Corrosion_Path_of_Elixir_Seekers = DungeonList( - id=29, + id=30, name='Cavern_of_Corrosion_Path_of_Elixir_Seekers', cn='药使之径•侵蚀隧洞', cht='藥使之徑•侵蝕隧洞', @@ -265,7 +274,7 @@ Cavern_of_Corrosion_Path_of_Elixir_Seekers = DungeonList( es='Senda de los elixires', ) Echo_of_War_Destruction_Beginning = DungeonList( - id=30, + id=31, name='Echo_of_War_Destruction_Beginning', cn='毁灭的开端•历战余响', cht='毀滅的開端•歷戰餘響', @@ -274,7 +283,7 @@ Echo_of_War_Destruction_Beginning = DungeonList( es='El principio de la Destrucción', ) Echo_of_War_End_of_the_Eternal_Freeze = DungeonList( - id=31, + id=32, name='Echo_of_War_End_of_the_Eternal_Freeze', cn='寒潮的落幕•历战余响', cht='寒潮的落幕•歷戰餘響', @@ -283,7 +292,7 @@ Echo_of_War_End_of_the_Eternal_Freeze = DungeonList( es='El fin del Hielo Eterno', ) Echo_of_War_Divine_Seed = DungeonList( - id=32, + id=33, name='Echo_of_War_Divine_Seed', cn='不死的神实•历战余响', cht='不死的神實•歷戰餘響', @@ -292,7 +301,7 @@ Echo_of_War_Divine_Seed = DungeonList( es='Semilla divina', ) Simulated_Universe_World_1 = DungeonList( - id=33, + id=34, name='Simulated_Universe_World_1', cn='第一世界•模拟宇宙', cht='第一世界•模擬宇宙', @@ -301,7 +310,7 @@ Simulated_Universe_World_1 = DungeonList( es='Mundo 1', ) Simulated_Universe_World_3 = DungeonList( - id=34, + id=35, name='Simulated_Universe_World_3', cn='第三世界•模拟宇宙', cht='第三世界•模擬宇宙', @@ -310,7 +319,7 @@ Simulated_Universe_World_3 = DungeonList( es='Mundo 3', ) Simulated_Universe_World_4 = DungeonList( - id=35, + id=36, name='Simulated_Universe_World_4', cn='第四世界•模拟宇宙', cht='第四世界•模擬宇宙', @@ -319,7 +328,7 @@ Simulated_Universe_World_4 = DungeonList( es='Mundo 4', ) Simulated_Universe_World_5 = DungeonList( - id=36, + id=37, name='Simulated_Universe_World_5', cn='第五世界•模拟宇宙', cht='第五世界•模擬宇宙', @@ -328,7 +337,7 @@ Simulated_Universe_World_5 = DungeonList( es='Mundo 5', ) Simulated_Universe_World_6 = DungeonList( - id=37, + id=38, name='Simulated_Universe_World_6', cn='第六世界•模拟宇宙', cht='第六世界•模擬宇宙', @@ -337,7 +346,7 @@ Simulated_Universe_World_6 = DungeonList( es='Mundo 6', ) Simulated_Universe_World_7 = DungeonList( - id=38, + id=39, name='Simulated_Universe_World_7', cn='第七世界•模拟宇宙', cht='第七世界•模擬宇宙', @@ -346,7 +355,7 @@ Simulated_Universe_World_7 = DungeonList( es='Mundo 7', ) The_Voyage_of_Navis_Astriger = DungeonList( - id=39, + id=40, name='The_Voyage_of_Navis_Astriger', cn='天艟求仙迷航录', cht='天艟求仙迷航錄', @@ -355,7 +364,7 @@ The_Voyage_of_Navis_Astriger = DungeonList( es='El viaje de las naves astriger', ) The_Last_Vestiges_of_Towering_Citadel = DungeonList( - id=40, + id=41, name='The_Last_Vestiges_of_Towering_Citadel', cn='永屹之城遗秘', cht='永屹之城遺秘', @@ -364,7 +373,7 @@ The_Last_Vestiges_of_Towering_Citadel = DungeonList( es='Herencia de la Ciudadela Imponente', ) Memory_of_Chaos = DungeonList( - id=41, + id=42, name='Memory_of_Chaos', cn='混沌回忆', cht='混沌回憶', diff --git a/tasks/dungeon/keywords/dungeon_detailed.py b/tasks/dungeon/keywords/dungeon_detailed.py index 60dd7588e..009f92337 100644 --- a/tasks/dungeon/keywords/dungeon_detailed.py +++ b/tasks/dungeon/keywords/dungeon_detailed.py @@ -69,11 +69,11 @@ Stagnant_Shadow_Mirage = DungeonDetailed( Stagnant_Shadow_Icicle = DungeonDetailed( id=8, name='Stagnant_Shadow_Icicle', - cn='角色晋阶材料:冰(彦卿)', - cht='角色晉階材料:冰(彥卿)', - en='Ascension: Ice (Yanqing)', - jp='キャラクター昇格素材:氷(彦卿)', - es='Ascension: Hielo (Yanqing)', + cn='角色晋阶材料:冰(彦卿 / 镜流)', + cht='角色晉階材料:冰(彥卿 / 鏡流)', + en='Ascension: Ice (Yanqing / Jingliu)', + jp='キャラクター昇格素材:氷(彦卿 / 鏡流)', + es='Ascension: Hielo (Yanqing / Jingliu)', ) Stagnant_Shadow_Doom = DungeonDetailed( id=9, @@ -102,8 +102,17 @@ Stagnant_Shadow_Abomination = DungeonDetailed( jp='キャラクター昇格素材:量子(リンクス / 符玄)', es='Ascension: Cuántico (Lynx / Fu Xuan)', ) -Stagnant_Shadow_Celestial = DungeonDetailed( +Stagnant_Shadow_Scorch = DungeonDetailed( id=12, + name='Stagnant_Shadow_Scorch', + cn='角色晋阶材料:火(桂乃芬 / 托帕&账账)', + cht='角色晉階材料:火(桂乃芬 / 托帕&帳帳)', + en='Ascension: Fire (Guinaifen / Topaz and Numby)', + jp='キャラクター昇格素材:炎(桂乃芬 / トパーズ&カブ)', + es='Ascension: Fuego (Guinaifen / Topaz y Conti)', +) +Stagnant_Shadow_Celestial = DungeonDetailed( + id=13, name='Stagnant_Shadow_Celestial', cn='角色晋阶材料:风(刃)', cht='角色晉階材料:風(刃)', diff --git a/tasks/freebies/assets/assets_freebies_support_reward.py b/tasks/freebies/assets/assets_freebies_support_reward.py new file mode 100644 index 000000000..2fb4d18cf --- /dev/null +++ b/tasks/freebies/assets/assets_freebies_support_reward.py @@ -0,0 +1,56 @@ +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 ``` + +CAN_GET_REWARD = ButtonWrapper( + name='CAN_GET_REWARD', + share=Button( + file='./assets/share/freebies/support_reward/CAN_GET_REWARD.png', + area=(1055, 266, 1106, 310), + search=(1035, 246, 1126, 330), + color=(229, 186, 123), + button=(1055, 266, 1106, 310), + ), +) +CLICKING_REWARD = ButtonWrapper( + name='CLICKING_REWARD', + share=Button( + file='./assets/share/freebies/support_reward/CLICKING_REWARD.png', + area=(1066, 268, 1105, 307), + search=(1046, 248, 1125, 327), + color=(197, 161, 111), + button=(1066, 268, 1105, 307), + ), +) +IN_PROFILE = ButtonWrapper( + name='IN_PROFILE', + share=Button( + file='./assets/share/freebies/support_reward/IN_PROFILE.png', + area=(643, 106, 673, 131), + search=(623, 86, 693, 151), + color=(74, 67, 58), + button=(643, 106, 673, 131), + ), +) +MENU_TO_PROFILE = ButtonWrapper( + name='MENU_TO_PROFILE', + share=Button( + file='./assets/share/freebies/support_reward/MENU_TO_PROFILE.png', + area=(1123, 82, 1149, 97), + search=(1103, 62, 1169, 117), + color=(226, 226, 225), + button=(1123, 82, 1149, 97), + ), +) +PROFILE = ButtonWrapper( + name='PROFILE', + cn=Button( + file='./assets/cn/freebies/support_reward/PROFILE.png', + area=(890, 99, 1111, 131), + search=(870, 79, 1131, 151), + color=(205, 206, 206), + button=(890, 99, 1111, 131), + ), + en=None, +) diff --git a/tasks/freebies/freebies.py b/tasks/freebies/freebies.py new file mode 100644 index 000000000..d8128c047 --- /dev/null +++ b/tasks/freebies/freebies.py @@ -0,0 +1,14 @@ +from module.logger import logger +from module.base.base import ModuleBase +from tasks.freebies.support_reward import SupportReward + +class Freebies(ModuleBase): + def run(self): + """ + Run all freebie tasks + """ + if self.config.SupportReward_Collect: + logger.hr('Support Reward') + SupportReward(config=self.config, device=self.device).run() + + self.config.task_delay(server_update=True) \ No newline at end of file diff --git a/tasks/freebies/support_reward.py b/tasks/freebies/support_reward.py new file mode 100644 index 000000000..adf4c753c --- /dev/null +++ b/tasks/freebies/support_reward.py @@ -0,0 +1,107 @@ +from module.logger import logger + +from tasks.base.page import page_menu +from tasks.base.ui import UI +from tasks.base.assets.assets_base_page import CLOSE,MENU_CHECK +from tasks.base.assets.assets_base_popup import GET_REWARD +from tasks.freebies.assets.assets_freebies_support_reward import MENU_TO_PROFILE, PROFILE, IN_PROFILE,CAN_GET_REWARD, CLICKING_REWARD + +class SupportReward(UI): + + def run(self): + """ + Run get support reward task + """ + self._get_support_reward() + + def _get_support_reward(self): + self.ui_ensure(page_menu) + + self._goto_profile() + self._get_reward() + self._goto_menu() + self.ui_ensure(page_menu) + + def _goto_profile(self): + """ + Pages: + in: MENU + out: PROFILE + """ + skip_first_screenshot = False + logger.info('Going to profile') + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + if self.appear(IN_PROFILE): + logger.info('Successfully in profile') + return True + + if self.appear_then_click(MENU_TO_PROFILE): + continue + + if self.appear_then_click(PROFILE): + continue + + def _get_reward(self): + """ + Pages: + in: PROFILE + out: PROFILE + """ + skip_first_screenshot = False + logger.info('Getting reward') + has_reward = False + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + if self.appear(GET_REWARD): + self.device.click(MENU_CHECK) # Avoid clicking on some other buttons + continue + + if self.match_template_color(CLICKING_REWARD, similarity=0.70): + logger.info('Clicking reward') + continue + + if self.match_template_color(CAN_GET_REWARD, similarity=0.70): + logger.info('Can get reward') + self.device.click(CAN_GET_REWARD) + has_reward = True + continue + + if self.appear(IN_PROFILE): # and not self.appear(CAN_GET_REWARD): + logger.info('Successfully got reward') if has_reward else logger.info('No reward') + return True + + def _goto_menu(self): + """ + Pages: + in: PROFILE + out: MENU + """ + skip_first_screenshot = False + logger.info('Going to menu') + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + if self.appear(MENU_CHECK): + return True + + if self.appear(IN_PROFILE): + self.device.click(CLOSE) + continue + + +if __name__ == '__main__': + self = SupportReward('src') + self.device.screenshot() + self._get_support_reward() \ No newline at end of file diff --git a/tasks/rogue/keywords/curio.py b/tasks/rogue/keywords/curio.py index 320b948af..d1528212b 100644 --- a/tasks/rogue/keywords/curio.py +++ b/tasks/rogue/keywords/curio.py @@ -405,7 +405,7 @@ Punklorde_Mentality = RogueCurio( cn='朋克洛德精神', cht='龐克洛德精神', en='Punklorde Mentality', - jp='パンクロードの精神', + jp='パンクロード精神', es='Mentalidad de Punklorde', ) Beacon_Coloring_Paste = RogueCurio( @@ -615,3 +615,102 @@ Sealing_Wax_of_Propagation = RogueCurio( jp='繁殖の封蝋', es='Lacre de la Propagación', ) +Society_Ticket_Infinite = RogueCurio( + id=69, + name='Society_Ticket_Infinite', + cn='俱乐部券(无尽)', + cht='俱樂部券(無盡)', + en='Society Ticket (Infinite)', + jp='クラブチケット∞', + es='Boleto del Círculo (infinito)', +) +Faith_Bond_Infinite = RogueCurio( + id=70, + name='Faith_Bond_Infinite', + cn='信仰债券(无尽)', + cht='信仰債券(無盡)', + en='Faith Bond (Infinite)', + jp='信仰債券∞', + es='Bono de fe (infinito)', +) +Gold_Coin_of_Discord_Infinite = RogueCurio( + id=71, + name='Gold_Coin_of_Discord_Infinite', + cn='分裂金币(无尽)', + cht='分裂金幣(無盡)', + en='Gold Coin of Discord (Infinite)', + jp='分裂金貨∞', + es='Moneda de oro del desacuerdo (infinita)', +) +Entropic_Die_Infinite = RogueCurio( + id=72, + name='Entropic_Die_Infinite', + cn='万象无常骰(无尽)', + cht='萬象無常骰(無盡)', + en='Entropic Die (Infinite)', + jp='万象無常のサイコロ∞', + es='Dado entrópico (infinito)', +) +Obliteration_Wick_Trimmer_Infinite = RogueCurio( + id=73, + name='Obliteration_Wick_Trimmer_Infinite', + cn='湮灭烛剪(无尽)', + cht='湮滅燭剪(無盡)', + en='Obliteration Wick Trimmer (Infinite)', + jp='湮滅の芯切り∞', + es='Despabiladeras de la aniquilación (infinitas)', +) +Cosmic_Big_Lotto_Infinite = RogueCurio( + id=74, + name='Cosmic_Big_Lotto_Infinite', + cn='银河大乐透(无尽)', + cht='銀河大樂透(無盡)', + en='Cosmic Big Lotto (Infinite)', + jp='銀河ビッグロッタリー∞', + es='Gran Lotería Galáctica (infinita)', +) +Omniscient_Capsule_Infinite = RogueCurio( + id=75, + name='Omniscient_Capsule_Infinite', + cn='万识囊(无尽)', + cht='萬識囊(無盡)', + en='Omniscient Capsule (Infinite)', + jp='全知袋∞', + es='Cápsula omnisciente (infinita)', +) +Punklorde_Mentality_Infinite = RogueCurio( + id=76, + name='Punklorde_Mentality_Infinite', + cn='朋克洛德精神(无尽)', + cht='龐克洛德精神(無盡)', + en='Punklorde Mentality (Infinite)', + jp='パンクロード精神∞', + es='Mentalidad de Punklorde (infinita)', +) +Robe_of_The_Beauty_Infinite = RogueCurio( + id=77, + name='Robe_of_The_Beauty_Infinite', + cn='纯美之袍(无尽)', + cht='純美之袍(無盡)', + en='Robe of The Beauty (Infinite)', + jp='純美のローブ∞', + es='Túnica de la Belleza (infinita)', +) +Angel_type_I_O_U_Dispenser_Infinite = RogueCurio( + id=78, + name='Angel_type_I_O_U_Dispenser_Infinite', + cn='天使型谢债发行机(无尽)', + cht='天使型謝債發行機(無盡)', + en='Angel-type I.O.U. Dispenser (Infinite)', + jp='天使型謝債発行機∞', + es='Dispensador de deuda en forma de ángel (infinito)', +) +Shattered_Star_Bait_Infinite = RogueCurio( + id=79, + name='Shattered_Star_Bait_Infinite', + cn='碎星芳饵(无尽)', + cht='碎星芳餌(無盡)', + en='Shattered Star Bait (Infinite)', + jp='砕けた星の釣り餌∞', + es='Cebo de las estrellas despedazadas (infinito)', +) From 8f1813733abe2251d6bf128a2e676b99e3f0f493 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 16 Oct 2023 12:36:33 +0800 Subject: [PATCH 2/8] Upd: [EN] PROFILE in freebies --- assets/en/freebies/support_reward/PROFILE.png | Bin 0 -> 11416 bytes .../assets/assets_freebies_support_reward.py | 8 +++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 assets/en/freebies/support_reward/PROFILE.png diff --git a/assets/en/freebies/support_reward/PROFILE.png b/assets/en/freebies/support_reward/PROFILE.png new file mode 100644 index 0000000000000000000000000000000000000000..71b586e0b6302157ed76c7bd62278cd1e88b64d0 GIT binary patch literal 11416 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 a6tJASzU%b5@Z#TtJW+f0PnnAKoBs#>t~Esf literal 0 HcmV?d00001 diff --git a/tasks/freebies/assets/assets_freebies_support_reward.py b/tasks/freebies/assets/assets_freebies_support_reward.py index 2fb4d18cf..a8e03e558 100644 --- a/tasks/freebies/assets/assets_freebies_support_reward.py +++ b/tasks/freebies/assets/assets_freebies_support_reward.py @@ -52,5 +52,11 @@ PROFILE = ButtonWrapper( color=(205, 206, 206), button=(890, 99, 1111, 131), ), - en=None, + en=Button( + file='./assets/en/freebies/support_reward/PROFILE.png', + area=(907, 102, 1092, 132), + search=(887, 82, 1112, 152), + color=(190, 189, 189), + button=(907, 102, 1092, 132), + ), ) From a720a70f66a161346c077c930ffbe55b6eef403e Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 16 Oct 2023 18:40:49 +0800 Subject: [PATCH 3/8] Opt: Reduce dunplcate clicks at CAN_GET_REWARD --- tasks/base/popup.py | 14 +++-- tasks/freebies/support_reward.py | 91 +++++++++++++++++--------------- 2 files changed, 59 insertions(+), 46 deletions(-) diff --git a/tasks/base/popup.py b/tasks/base/popup.py index a74b0d1a4..074140bc4 100644 --- a/tasks/base/popup.py +++ b/tasks/base/popup.py @@ -1,18 +1,26 @@ from module.base.base import ModuleBase +from module.logger import logger from tasks.base.assets.assets_base_popup import * class PopupHandler(ModuleBase): - def handle_reward(self, interval=5) -> bool: + def handle_reward(self, interval=5, click_button=None) -> bool: """ Args: interval: + click_button: Set a button to click Returns: If handled. """ - if self.appear_then_click(GET_REWARD, interval=interval): - return True + if click_button is None: + if self.appear_then_click(GET_REWARD, interval=interval): + return True + else: + if self.appear(GET_REWARD, interval=interval): + logger.info(f'{GET_REWARD} -> {click_button}') + self.device.click(click_button) + return True return False diff --git a/tasks/freebies/support_reward.py b/tasks/freebies/support_reward.py index adf4c753c..8c9d1ef7c 100644 --- a/tasks/freebies/support_reward.py +++ b/tasks/freebies/support_reward.py @@ -1,27 +1,30 @@ +from module.base.timer import Timer from module.logger import logger - +from tasks.base.assets.assets_base_page import CLOSE, MENU_CHECK +from tasks.base.assets.assets_base_popup import GET_REWARD from tasks.base.page import page_menu from tasks.base.ui import UI -from tasks.base.assets.assets_base_page import CLOSE,MENU_CHECK -from tasks.base.assets.assets_base_popup import GET_REWARD -from tasks.freebies.assets.assets_freebies_support_reward import MENU_TO_PROFILE, PROFILE, IN_PROFILE,CAN_GET_REWARD, CLICKING_REWARD +from tasks.freebies.assets.assets_freebies_support_reward import ( + CAN_GET_REWARD, + IN_PROFILE, + MENU_TO_PROFILE, + PROFILE +) + class SupportReward(UI): - + def run(self): """ Run get support reward task """ - self._get_support_reward() - - def _get_support_reward(self): + logger.hr('Support reward', level=1) self.ui_ensure(page_menu) - + self._goto_profile() self._get_reward() self._goto_menu() - self.ui_ensure(page_menu) - + def _goto_profile(self): """ Pages: @@ -35,54 +38,52 @@ class SupportReward(UI): skip_first_screenshot = False else: self.device.screenshot() - + if self.appear(IN_PROFILE): logger.info('Successfully in profile') return True - + if self.appear_then_click(MENU_TO_PROFILE): continue - + if self.appear_then_click(PROFILE): continue - - def _get_reward(self): + + def _get_reward(self, skip_first_screenshot=True): """ Pages: in: PROFILE - out: PROFILE + out: GET_REWARD """ - skip_first_screenshot = False logger.info('Getting reward') - has_reward = False + claimed = False + empty = Timer(0.3, count=1).start() + timeout = Timer(5).start() while 1: if skip_first_screenshot: skip_first_screenshot = False else: self.device.screenshot() - + + if not claimed and empty.reached(): + logger.info('No reward') + break if self.appear(GET_REWARD): - self.device.click(MENU_CHECK) # Avoid clicking on some other buttons + logger.info('Got reward') + break + if timeout.reached(): + logger.warning('Get support reward timeout') + break + + if self.appear_then_click(CAN_GET_REWARD, similarity=0.70, interval=2): + claimed = True + timeout.reset() continue - - if self.match_template_color(CLICKING_REWARD, similarity=0.70): - logger.info('Clicking reward') - continue - - if self.match_template_color(CAN_GET_REWARD, similarity=0.70): - logger.info('Can get reward') - self.device.click(CAN_GET_REWARD) - has_reward = True - continue - - if self.appear(IN_PROFILE): # and not self.appear(CAN_GET_REWARD): - logger.info('Successfully got reward') if has_reward else logger.info('No reward') - return True - + def _goto_menu(self): """ Pages: - in: PROFILE + in: PROFILE or GET_REWARD out: MENU """ skip_first_screenshot = False @@ -92,16 +93,20 @@ class SupportReward(UI): skip_first_screenshot = False else: self.device.screenshot() - + if self.appear(MENU_CHECK): return True - - if self.appear(IN_PROFILE): + + if self.appear(IN_PROFILE, interval=2): + logger.info(f'{IN_PROFILE} -> {CLOSE}') self.device.click(CLOSE) continue - - + if self.handle_reward(click_button=CAN_GET_REWARD): + # # Avoid clicking on some other buttons + continue + + if __name__ == '__main__': self = SupportReward('src') self.device.screenshot() - self._get_support_reward() \ No newline at end of file + self.run() From fca21d88c144218200fc402c19a71fe9f00bb821 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 16 Oct 2023 19:05:41 +0800 Subject: [PATCH 4/8] Fix: Retry insight Stage_1 (#156) --- tasks/forgotten_hall/ui.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tasks/forgotten_hall/ui.py b/tasks/forgotten_hall/ui.py index 1e51cb4f9..aa389111a 100644 --- a/tasks/forgotten_hall/ui.py +++ b/tasks/forgotten_hall/ui.py @@ -13,7 +13,7 @@ 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.ui import DungeonUI from tasks.forgotten_hall.assets.assets_forgotten_hall_ui import * -from tasks.forgotten_hall.keywords import ForgottenHallStage +from tasks.forgotten_hall.keywords import ForgottenHallStage, KEYWORDS_FORGOTTEN_HALL_STAGE from tasks.forgotten_hall.team import ForgottenHallTeam from tasks.map.control.joystick import MapControlJoystick @@ -70,7 +70,11 @@ class DraggableStageList(DraggableList): while 1: result = super().insight_row(row, main=main, skip_first_screenshot=skip_first_screenshot) if not result: - return False + if row == KEYWORDS_FORGOTTEN_HALL_STAGE.Stage_1: + # Must have stage 1, retry if not found + continue + else: + return False if skip_first_screenshot: skip_first_screenshot = False From d3bf9a808cb374fe1151e9f74df520fd78fd26c3 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 16 Oct 2023 19:13:13 +0800 Subject: [PATCH 5/8] Fix: [CN] OCR error on Stagnant_Shadow_Scorch --- tasks/dungeon/ui.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 5b5029928..7ecdff49d 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -70,6 +70,8 @@ class OcrDungeonList(Ocr): if self.lang == 'cn': result = result.replace('翼', '巽') # 巽风之形 result = result.replace('皖A0', '50').replace('皖', '') + # 燔灼之形•凝滞虚影 + result = result.replace('熠', '燔') return result @@ -411,7 +413,7 @@ class DungeonUI(UI): Examples: from tasks.dungeon.keywords import KEYWORDS_DUNGEON_LIST - self = DungeonUI('alas') + self = DungeonUI('src') self.device.screenshot() self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index) self.dungeon_goto(KEYWORDS_DUNGEON_LIST.Calyx_Crimson_Harmony) From 848a9e24992566aabc566f55fe4afd7575e0190c Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 17 Oct 2023 12:45:12 +0800 Subject: [PATCH 6/8] Fix: [CN] OCR error on Stagnant_Shadow_Scorch (#165) --- tasks/dungeon/ui.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tasks/dungeon/ui.py b/tasks/dungeon/ui.py index 7ecdff49d..91da95fd1 100644 --- a/tasks/dungeon/ui.py +++ b/tasks/dungeon/ui.py @@ -1,3 +1,5 @@ +import re + import numpy as np from module.base.base import ModuleBase @@ -72,6 +74,7 @@ class OcrDungeonList(Ocr): result = result.replace('皖A0', '50').replace('皖', '') # 燔灼之形•凝滞虚影 result = result.replace('熠', '燔') + result = re.sub('^灼之形', '燔灼之形', result) return result From 73cf96b418b25a34df56973ac126f112db70982c Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 17 Oct 2023 13:57:03 +0800 Subject: [PATCH 7/8] Opt: Release resources during wait --- module/base/button.py | 4 ++-- module/base/resource.py | 32 ++++++++++++++++++++------------ module/ocr/models.py | 10 ++++++++-- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/module/base/button.py b/module/base/button.py index 100635ab8..5694c10ef 100644 --- a/module/base/button.py +++ b/module/base/button.py @@ -124,10 +124,10 @@ class ButtonWrapper(Resource): self.name = name self.data_buttons = kwargs self._matched_button: t.Optional[Button] = None - self.resource_add(self.name) + self.resource_add(f'{name}:{next(self.iter_buttons(), None)}') def resource_release(self): - del_cached_property(self, 'assets') + del_cached_property(self, 'buttons') self._matched_button = None def __str__(self): diff --git a/module/base/resource.py b/module/base/resource.py index 40d930ed7..fd9d7cd58 100644 --- a/module/base/resource.py +++ b/module/base/resource.py @@ -1,11 +1,11 @@ import re -import module.config.server as server -from module.base.decorator import cached_property, del_cached_property +from module.base.decorator import cached_property -def get_assets_from_file(file, regex): +def get_assets_from_file(file): assets = set() + regex = re.compile(r"file='(.*?)'") with open(file, 'r', encoding='utf-8') as f: for row in f.readlines(): result = regex.search(row) @@ -20,11 +20,12 @@ class PreservedAssets: assets = set() assets |= get_assets_from_file( file='./tasks/base/assets/assets_base_page.py', - regex=re.compile(r'^([A-Za-z][A-Za-z0-9_]+) = ') ) assets |= get_assets_from_file( file='./tasks/base/assets/assets_base_popup.py', - regex=re.compile(r'^([A-Za-z][A-Za-z0-9_]+) = ') + ) + assets |= get_assets_from_file( + file='./tasks/base/assets/assets_base_main_page.py', ) return assets @@ -44,11 +45,13 @@ class Resource: @classmethod def is_loaded(cls, obj): - if hasattr(obj, '_image') and obj._image is None: - return False - elif hasattr(obj, 'image') and obj.image is None: - return False - return True + if hasattr(obj, '_image') and obj._image is not None: + return True + if hasattr(obj, 'image') and obj.image is not None: + return True + if hasattr(obj, 'buttons') and obj.buttons is not None: + return True + return False @classmethod def resource_show(cls): @@ -56,11 +59,16 @@ class Resource: logger.hr('Show resource') for key, obj in cls.instances.items(): if cls.is_loaded(obj): - continue - logger.info(f'{obj}: {key}') + logger.info(f'{obj}: {key}') def release_resources(next_task=''): + # Release all OCR models + # det models take 400MB + if not next_task: + from module.ocr.models import OCR_MODEL + OCR_MODEL.resource_release() + # Release assets cache # module.ui has about 80 assets and takes about 3MB # Alas has about 800 assets, but they are not all loaded. diff --git a/module/ocr/models.py b/module/ocr/models.py index f0cefa03e..c4f207c0a 100644 --- a/module/ocr/models.py +++ b/module/ocr/models.py @@ -1,6 +1,6 @@ from pponnxcr import TextSystem as TextSystem_ -from module.base.decorator import cached_property +from module.base.decorator import cached_property, del_cached_property from module.exception import ScriptError DIC_LANG_TO_MODEL = { @@ -56,6 +56,12 @@ class OcrModel: except AttributeError: raise ScriptError(f'OCR model under lang "{lang}" does not exists') + def resource_release(self): + del_cached_property(self, 'zhs') + del_cached_property(self, 'en') + del_cached_property(self, 'ja') + del_cached_property(self, 'zht') + @cached_property def zhs(self): return TextSystem('zhs') @@ -66,7 +72,7 @@ class OcrModel: @cached_property def ja(self): - return TextSystem('zht') + return TextSystem('ja') @cached_property def zht(self): From a38f0d25e9213fc028b3ed5ba5f29ab1aba46f42 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 17 Oct 2023 13:59:18 +0800 Subject: [PATCH 8/8] Opt: Do Freebies before DataUpdate --- module/config/config_manual.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/module/config/config_manual.py b/module/config/config_manual.py index ab69dfdd8..7f8c9904f 100644 --- a/module/config/config_manual.py +++ b/module/config/config_manual.py @@ -10,8 +10,9 @@ class ManualConfig: SCHEDULER_PRIORITY = """ Restart - > BattlePass > DailyQuest > Assignment > DataUpdate - > Weekly > Dungeon > Freebies + > BattlePass > DailyQuest > Assignment + > Freebies > DataUpdate + > Weekly > Dungeon """ """