Merge pull request #560 from LmeSzinc/dev

Add Ornament Extraction task | 增加饰品提取任务
This commit is contained in:
LmeSzinc 2024-07-03 18:46:59 +08:00 committed by GitHub
commit f04ddac9ef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
74 changed files with 1764 additions and 1828 deletions

View File

@ -7,7 +7,7 @@ Star Rail auto script | 星铁速溶茶,崩坏:星穹铁道脚本,基于
![gui](https://raw.githubusercontent.com/wiki/LmeSzinc/StarRailCopilot/README.assets/gui_cn.png)
![setting](https://raw.githubusercontent.com/wiki/LmeSzinc/StarRailCopilot/README.assets/setting_cn.png)
## 功能
@ -15,7 +15,7 @@ Star Rail auto script | 星铁速溶茶,崩坏:星穹铁道脚本,基于
- **收获**:完成每日任务,收派委托,收取无名勋礼奖励。
- **模拟宇宙**:刷模拟宇宙,使用开拓力刷内圈遗器。
- **后台托管**:自动启动模拟器和游戏,后台托管清体力和每日,通过仪表盘了解资源情况。
- **云游戏**:(仅国服)支持云崩坏星穹铁道。
- **云游戏**:(仅国服)[在云崩坏星穹铁道上运行SRC](https://github.com/LmeSzinc/StarRailCopilot/wiki/Cloud_cn)
## 安装 [![](https://img.shields.io/github/downloads/LmeSzinc/StarRailCopilot/total?color=4e4c97)](https://github.com/LmeSzinc/StarRailCopilot/releases)
@ -31,7 +31,7 @@ Discord https://discord.gg/aJkt3mKDEr QQ群 752620927
- [小地图识别原理](https://github.com/LmeSzinc/StarRailCopilot/wiki/MinimapTracking)
- 开发文档(目录在侧边栏):[Alas wiki](https://github.com/LmeSzinc/AzurLaneAutoScript/wiki/1.-Start),但很多内容是新写的,建议阅读源码和历史提交。
- 开发路线图:[#10](https://github.com/LmeSzinc/StarRailCopilot/issues/10) ,欢迎提交 PR挑选你感兴趣的部分进行开发即可。
- 开发路线图:见置顶 issue,欢迎提交 PR挑选你感兴趣的部分进行开发即可。
> **如何添加多语言/多服务器支持?** 需要适配 assets参考 [开发文档 “添加一个 Button” 一节](https://github.com/LmeSzinc/AzurLaneAutoScript/wiki/4.1.-Detection-objects#%E6%B7%BB%E5%8A%A0%E4%B8%80%E4%B8%AA-button)。

View File

@ -6,13 +6,15 @@ Star Rail Instant Tea, a bot for Honkai: Star Rail, based on the next generation
![gui](https://raw.githubusercontent.com/wiki/LmeSzinc/StarRailCopilot/README.assets/gui_en.png)
![setting](https://raw.githubusercontent.com/wiki/LmeSzinc/StarRailCopilot/README.assets/setting_en.png)
## Features
- **Dungeons**: [Character Planner](https://github.com/LmeSzinc/StarRailCopilot/wiki/Planner_cn), Dungeons, dungeons at double event, echo of war.
- **Dungeons**: [Character Planner](https://github.com/LmeSzinc/StarRailCopilot/wiki/Planner_en), Dungeons, dungeons at double event, echo of war.
- **Rewards**: Complete daily quests, do assignment, claim nameless horner rewards.
- **Simulated Universe**: Farm SU, farm planers using trailbalze power.
- **AFK Auto Farming**: Automatically launch emulators and games, do dungeons and quests at background, keep track of resources through dashboard.
- **Cloud Gaming**: [CN only] Support Cloud HSR.
- **Cloud Gaming**: [CN only] [Run SRC on cloud HSR](https://github.com/LmeSzinc/StarRailCopilot/wiki/Cloud_cn)
## Install [![](https://img.shields.io/github/downloads/LmeSzinc/StarRailCopilot/total?color=4e4c97)](https://github.com/LmeSzinc/StarRailCopilot/releases)
@ -30,7 +32,7 @@ Discord https://discord.gg/aJkt3mKDEr
- Development Docs (menu is on sidebar): [Alas wiki](https://github.com/LmeSzinc/AzurLaneAutoScript/wiki/1.-Start) (in Chinese). However, there is ton of code newly written, it is recommended to read the source code and historical commits.
- Development Road Map: [#10](https://github.com/LmeSzinc/StarRailCopilot/issues/10). Pull Requests are welcomed, just pick the part you interested to work on.
- Development Road Map: See pinned issues. Pull Requests are welcomed, just pick the part you interested to work on.
> **How to add multi-language or multi-server support?** Need assets updates, see ["Adding a Button" in development docs](https://github.com/LmeSzinc/AzurLaneAutoScript/wiki/4.1.-Detection-objects#%E6%B7%BB%E5%8A%A0%E4%B8%80%E4%B8%AA-button).

View File

@ -5,13 +5,15 @@ Star Rail Copilot, un bot para Honkai: Star Rail, basado en la siguiente generac
![gui](https://raw.githubusercontent.com/wiki/LmeSzinc/StarRailCopilot/README.assets/gui_es.png)
![setting](https://raw.githubusercontent.com/wiki/LmeSzinc/StarRailCopilot/README.assets/setting_es.png)
## Características
- **Mazmorras**: [Planificador de personajes](https://github.com/LmeSzinc/StarRailCopilot/wiki/Planner_cn), Mazmorras, y mazmorras en eventos de doble recompensa (materiales de XP de personaje, de conos de luz, rastros, ascensión, artefactos...), ecos de la guerra.
- **Mazmorras**: [Planificador de personajes](https://github.com/LmeSzinc/StarRailCopilot/wiki/Planner_en), Mazmorras, y mazmorras en eventos de doble recompensa (materiales de XP de personaje, de conos de luz, rastros, ascensión, artefactos...), ecos de la guerra.
- **Recompensas diarias**: Se completan las misiones de actividad diarias, la misión diaria, las misiones de Honor Anónimo...
- **Universo Simulado**: Farm SU hasta alcanzar el límite de puntos semanal, farm planars usando poder trazacaminos.
- **Farmeo automático AFK**: El bot lo hace todo de manera automática, abre los emuladores, completa las misiones y realiza las tareas diarias, realice un seguimiento de los recursos a través del panel.
- **Juegos en la nube**: [solo CN] Compatible con Cloud HSR.
- **Juegos en la nube**: [solo CN] [Ejecute SRC en HSR en la nube](https://github.com/LmeSzinc/StarRailCopilot/wiki/Cloud_cn)
## Instalación [![](https://img.shields.io/github/downloads/LmeSzinc/StarRailCopilot/total?color=4e4c97)](https://github.com/LmeSzinc/StarRailCopilot/releases)
Dirígete a la [Guía de Instalación](https://github.com/LmeSzinc/StarRailCopilot/wiki/Installation_en) para consultar cómo hacer la instalación automática, el manual de uso, etc.
@ -25,7 +27,7 @@ Discord: https://discord.gg/aJkt3mKDEr
- [Seguimiento del Minimapa](https://github.com/LmeSzinc/StarRailCopilot/wiki/MinimapTracking)
- Documentación para desarrolladores (el menú está en la barra lateral): [Wiki de ALAS](https://github.com/LmeSzinc/AzurLaneAutoScript/wiki/1.-Start) (en Chino). Sin embargo, hay un montón de código nuevo, por lo que es recomendado leer el código fuente y el historial de commits.
- Roadmap del desarrollo: [#10](https://github.com/LmeSzinc/StarRailCopilot/issues/10). Los pull requests son bienvenidos. Simplemente, elige la parte en la que estás interesado trabajar.
- Roadmap del desarrollo: Ver issues fijados. Los pull requests son bienvenidos. Simplemente, elige la parte en la que estás interesado trabajar.
> **¿Cómo añadir nuevos idiomas o servidores?** Si necesitas actualizar los recursos del bot, échale un vistazo a ["Añadiendo un Botón" en la documentación para desarrolladores](https://github.com/LmeSzinc/AzurLaneAutoScript/wiki/4.1.-Detection-objects#%E6%B7%BB%E5%8A%A0%E4%B8%80%E4%B8%AA-button).

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -24,11 +24,6 @@
"ScreenshotInterval": 0.2,
"CombatScreenshotInterval": 1.0,
"WhenTaskQueueEmpty": "goto_main"
},
"CloudStorage": {
"CloudRemainSeasonPass": {},
"CloudRemainPaid": {},
"CloudRemainFree": {}
}
},
"Restart": {
@ -125,34 +120,6 @@
"Command": "DailyQuest",
"ServerUpdate": "04:00"
},
"AchievableQuest": {
"Complete_1_Daily_Mission": "not_supported",
"Clear_Calyx_Golden_1_times": "not_set",
"Clear_Stagnant_Shadow_1_times": "not_set",
"Clear_Cavern_of_Corrosion_1_times": "not_set",
"In_a_single_battle_inflict_3_Weakness_Break_of_different_Types": "achievable",
"Inflict_Weakness_Break_5_times": "achievable",
"Defeat_a_total_of_20_enemies": "achievable",
"Complete_Forgotten_Hall_1_time": "achievable",
"Complete_Echo_of_War_1_times": "not_set",
"Use_an_Ultimate_to_deal_the_final_blow_1_time": "achievable",
"Salvage_any_Relic": "achievable",
"Use_Consumables_1_time": "achievable",
"Log_in_to_the_game": "achievable",
"Dispatch_1_assignments": "achievable",
"Complete_Divergent_Universe_or_Simulated_Universe_1_times": "not_set",
"Clear_Calyx_Crimson_1_times": "not_set",
"Enter_combat_by_attacking_enemie_Weakness_and_win_3_times": "achievable",
"Use_Technique_2_times": "achievable",
"Destroy_3_destructible_objects": "achievable",
"Obtain_victory_in_combat_with_Support_Characters_1_times": "achievable",
"Level_up_any_character_1_times": "not_supported",
"Level_up_any_Light_Cone_1_times": "not_supported",
"Use_the_Omni_Synthesizer_1_times": "achievable",
"Take_photos_1_times": "achievable",
"Consume_120_Trailblaze_Power": "achievable",
"Level_up_any_Relic_1_times": "not_supported"
},
"DailyStorage": {
"DailyActivity": {},
"DailyQuest": {}
@ -204,6 +171,11 @@
"ItemStorage": {
"Credit": {},
"StallerJade": {}
},
"CloudStorage": {
"CloudRemainSeasonPass": {},
"CloudRemainPaid": {},
"CloudRemainFree": {}
}
},
"Freebies": {
@ -264,6 +236,24 @@
"DebugMode": false
}
},
"Ornament": {
"Scheduler": {
"Enable": false,
"NextRun": "2020-01-01 00:00:00",
"Command": "Ornament",
"ServerUpdate": "04:00"
},
"Ornament": {
"Dungeon": "Divergent_Universe_Eternal_Comedy",
"UseImmersifier": true,
"DoubleEvent": true,
"UseStamina": false
},
"DungeonSupport": {
"Use": "when_daily",
"Character": "FirstCharacter"
}
},
"Daemon": {
"Daemon": {
"Enable": true,

View File

@ -59,17 +59,34 @@ def patch_uiautomator2():
https://tool.appetizer.io is added to bypass the wall in China but https://tool.appetizer.io is slow outside of CN
plus some CN users cannot access it for unknown reason.
So we patch `uiautomator2/init.py` to a local assets cache `uiautomator2cache/cache`.
1. So we patch `uiautomator2/init.py` to a local assets cache `uiautomator2cache/cache`.
appdir = os.path.join(os.path.expanduser('~'), '.uiautomator2')
to:
appdir = os.path.join(__file__, '../../uiautomator2cache')
And we also remove minicap installations since emulators doesn't need it.
2. And we also remove minicap installations since emulators doesn't need it.
for url in self.minicap_urls:
self.push_url(url)
to:
for url in []:
self.push_url(url)
3. Fix atx_agent_url so ARM Mac can have correct ATX installed
```
@property
def atx_agent_url(self):
files = {
'armeabi-v7a': 'atx-agent_{v}_linux_armv7.tar.gz',
'arm64-v8a': 'atx-agent_{v}_linux_armv7.tar.gz',
'armeabi': 'atx-agent_{v}_linux_armv6.tar.gz',
'x86': 'atx-agent_{v}_linux_386.tar.gz',
'x86_64': 'atx-agent_{v}_linux_386.tar.gz',
}
```
where
'arm64-v8a': 'atx-agent_{v}_linux_armv7.tar.gz',
to
'arm64-v8a': 'atx-agent_{v}_linux_arm64.tar.gz',
"""
init_file = './toolkit/Lib/site-packages/uiautomator2/init.py'
cache_dir = './toolkit/Lib/site-packages/uiautomator2cache/cache'
@ -92,6 +109,17 @@ def patch_uiautomator2():
else:
logger.info(f'{init_file} minicap_urls no need to patch')
# Patch atx_agent_url
res = re.search(r"'arm64-v8a': 'atx-agent_\{v}_linux_armv7.tar.gz'", content)
if res:
content = re.sub(r"'arm64-v8a': 'atx-agent_\{v}_linux_armv7.tar.gz'",
"'arm64-v8a': 'atx-agent_{v}_linux_arm64.tar.gz'",
content)
modified = True
logger.info(f'{init_file} atx_agent_url patched')
else:
logger.info(f'{init_file} atx_agent_url no need to patch')
# Patch appdir
if os.path.exists(cache_dir):
res = re.search(r'appdir ?=(.*)\n', content)

View File

@ -91,6 +91,8 @@ class GenerateDungeonList(GenerateKeyword):
def iter_rows(self) -> t.Iterable[dict]:
dungeons = list(super().iter_rows())
# Sort by path
calyx = []
order = [
'Calyx_Golden',
@ -108,9 +110,20 @@ class GenerateDungeonList(GenerateKeyword):
dungeons = [d for d in dungeons if not condition(d)]
dungeons = calyx + dungeons
# Reverse Divergent_Universe
start = 0
end = 0
for index, dungeon in enumerate(dungeons):
if dungeon['name'].startswith('Divergent_Universe'):
if start == 0:
start = index
end = index + 1
if start > 0 and end > 0:
dungeons = dungeons[:start] + dungeons[start:end][::-1] + dungeons[end:]
# Re-sort ID
self.keyword_index = 0
for row in dungeons:
# Re-sort ID
self.keyword_index += 1
row['id'] = self.keyword_index
yield row

View File

@ -140,26 +140,6 @@
"close_game"
]
}
},
"CloudStorage": {
"CloudRemainSeasonPass": {
"type": "stored",
"value": {},
"display": "hide",
"stored": "StoredInt"
},
"CloudRemainPaid": {
"type": "stored",
"value": {},
"display": "hide",
"stored": "StoredInt"
},
"CloudRemainFree": {
"type": "stored",
"value": {},
"display": "hide",
"stored": "StoredInt"
}
}
},
"Restart": {
@ -788,403 +768,11 @@
"display": "hide"
}
},
"AchievableQuest": {
"Complete_1_Daily_Mission": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Clear_Calyx_Golden_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Clear_Stagnant_Shadow_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Clear_Cavern_of_Corrosion_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"In_a_single_battle_inflict_3_Weakness_Break_of_different_Types": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Inflict_Weakness_Break_5_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Defeat_a_total_of_20_enemies": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Complete_Forgotten_Hall_1_time": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Complete_Echo_of_War_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Use_an_Ultimate_to_deal_the_final_blow_1_time": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Salvage_any_Relic": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Use_Consumables_1_time": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Log_in_to_the_game": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Dispatch_1_assignments": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Complete_Divergent_Universe_or_Simulated_Universe_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Clear_Calyx_Crimson_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Enter_combat_by_attacking_enemie_Weakness_and_win_3_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Use_Technique_2_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Destroy_3_destructible_objects": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Obtain_victory_in_combat_with_Support_Characters_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Level_up_any_character_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Level_up_any_Light_Cone_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Use_the_Omni_Synthesizer_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Take_photos_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Consume_120_Trailblaze_Power": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
},
"Level_up_any_Relic_1_times": {
"type": "state",
"value": "achievable",
"option": [
"achievable",
"not_set",
"not_supported"
],
"option_bold": [
"achievable"
],
"option_light": [
"not_supported"
]
}
},
"DailyStorage": {
"DailyActivity": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredDailyActivity",
"order": 2,
"color": "#ffcf70"
@ -1192,7 +780,7 @@
"DailyQuest": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredDaily"
}
}
@ -1229,7 +817,7 @@
"BattlePassLevel": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredBattlePassLevel",
"order": 5,
"color": "#cbe45b"
@ -1243,43 +831,43 @@
"BattlePassSimulatedUniverse": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredBattlePassSimulatedUniverse"
},
"BattlePassQuestCalyx": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredBattlePassQuestCalyx"
},
"BattlePassQuestEchoOfWar": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredBattlePassQuestEchoOfWar"
},
"BattlePassQuestCredits": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredBattlePassQuestCredits"
},
"BattlePassQuestSynthesizeConsumables": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredBattlePassQuestSynthesizeConsumables"
},
"BattlePassQuestCavernOfCorrosion": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredBattlePassQuestCavernOfCorrosion"
},
"BattlePassQuestTrailblazePower": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredBattlePassQuestTrailblazePower"
}
}
@ -1469,7 +1057,7 @@
"Credit": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredInt",
"order": 7,
"color": "#ab7cf2"
@ -1477,11 +1065,31 @@
"StallerJade": {
"type": "stored",
"value": {},
"display": "hide",
"display": "display",
"stored": "StoredInt",
"order": 8,
"color": "#fc8f8b"
}
},
"CloudStorage": {
"CloudRemainSeasonPass": {
"type": "stored",
"value": {},
"display": "display",
"stored": "StoredInt"
},
"CloudRemainPaid": {
"type": "stored",
"value": {},
"display": "display",
"stored": "StoredInt"
},
"CloudRemainFree": {
"type": "stored",
"value": {},
"display": "display",
"stored": "StoredInt"
}
}
},
"Freebies": {
@ -1790,6 +1398,142 @@
}
}
},
"Ornament": {
"Scheduler": {
"Enable": {
"type": "checkbox",
"value": false,
"option": [
true,
false
]
},
"NextRun": {
"type": "datetime",
"value": "2020-01-01 00:00:00",
"validate": "datetime"
},
"Command": {
"type": "input",
"value": "Ornament",
"display": "hide"
},
"ServerUpdate": {
"type": "input",
"value": "04:00",
"display": "hide"
}
},
"Ornament": {
"Dungeon": {
"type": "select",
"value": "Divergent_Universe_Eternal_Comedy",
"option": [
"Divergent_Universe_Eternal_Comedy",
"Divergent_Universe_To_Sweet_Dreams",
"Divergent_Universe_Pouring_Blades",
"Divergent_Universe_Fruit_of_Evil",
"Divergent_Universe_Permafrost",
"Divergent_Universe_Gentle_Words",
"Divergent_Universe_Smelted_Heart",
"Divergent_Universe_Untoppled_Walls"
]
},
"UseImmersifier": {
"type": "state",
"value": true,
"option": [
true
],
"option_bold": [
true
]
},
"DoubleEvent": {
"type": "state",
"value": true,
"option": [
true
],
"option_bold": [
true
]
},
"UseStamina": {
"type": "checkbox",
"value": false
}
},
"DungeonSupport": {
"Use": {
"type": "select",
"value": "when_daily",
"option": [
"when_daily",
"always_use"
]
},
"Character": {
"type": "select",
"value": "FirstCharacter",
"option": [
"FirstCharacter",
"Acheron",
"Argenti",
"Arlan",
"Asta",
"Aventurine",
"Bailu",
"BlackSwan",
"Blade",
"Boothill",
"Bronya",
"Clara",
"DanHeng",
"DanHengImbibitorLunae",
"DrRatio",
"Firefly",
"FuXuan",
"Gallagher",
"Gepard",
"Guinaifen",
"Hanya",
"Herta",
"Himeko",
"Hook",
"Huohuo",
"JingYuan",
"Jingliu",
"Kafka",
"Luka",
"Luocha",
"Lynx",
"March7th",
"Misha",
"Natasha",
"Pela",
"Qingque",
"Robin",
"RuanMei",
"Sampo",
"Seele",
"Serval",
"SilverWolf",
"Sparkle",
"Sushang",
"Tingyun",
"TopazNumby",
"TrailblazerDestruction",
"TrailblazerHarmony",
"TrailblazerPreservation",
"Welt",
"Xueyi",
"Yanqing",
"Yukong"
]
}
}
},
"Daemon": {
"Daemon": {
"Enable": {

View File

@ -86,13 +86,6 @@ Optimization:
WhenTaskQueueEmpty:
value: goto_main
option: [ stay_there, goto_main, close_game ]
CloudStorage:
CloudRemainSeasonPass:
stored: StoredInt
CloudRemainPaid:
stored: StoredInt
CloudRemainFree:
stored: StoredInt
# ==================== Daily ====================
@ -152,43 +145,46 @@ Weekly:
value: 1
option: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
AchievableQuest:
# Quests will be injected in config updater
# Complete_1_Daily_Mission:
# type: state
# value: achievable
# option: [ achievable, not_set, not_supported ]
# option_bold: [ achievable, ]
DailyStorage:
DailyActivity:
stored: StoredDailyActivity
order: 2
color: "#ffcf70"
display: display
DailyQuest:
stored: StoredDaily
display: display
BattlePassStorage:
BattlePassLevel:
stored: StoredBattlePassLevel
order: 5
color: "#cbe45b"
display: display
BattlePassWeeklyQuest:
stored: StoredBattlePassWeeklyQuest
# Quests progress
BattlePassSimulatedUniverse:
stored: StoredBattlePassSimulatedUniverse
display: display
BattlePassQuestCalyx:
stored: StoredBattlePassQuestCalyx
display: display
BattlePassQuestEchoOfWar:
stored: StoredBattlePassQuestEchoOfWar
display: display
BattlePassQuestCredits:
stored: StoredBattlePassQuestCredits
display: display
BattlePassQuestSynthesizeConsumables:
stored: StoredBattlePassQuestSynthesizeConsumables
display: display
BattlePassQuestCavernOfCorrosion:
stored: StoredBattlePassQuestCavernOfCorrosion
display: display
BattlePassQuestTrailblazePower:
stored: StoredBattlePassQuestTrailblazePower
display: display
Assignment:
# Options in Name_x will be injected in config updater
@ -218,10 +214,23 @@ ItemStorage:
stored: StoredInt
order: 7
color: "#ab7cf2"
display: display
StallerJade:
stored: StoredInt
order: 8
color: "#fc8f8b"
display: display
CloudStorage:
CloudRemainSeasonPass:
stored: StoredInt
display: display
CloudRemainPaid:
stored: StoredInt
display: display
CloudRemainFree:
stored: StoredInt
display: display
# ==================== Rogue ====================
@ -285,6 +294,23 @@ RogueBlessing:
RogueDebug:
DebugMode: false
Ornament:
Dungeon:
value: Divergent_Universe_Eternal_Comedy
# OrnamentExtraction will be injected in config updater
option: [ ]
UseImmersifier:
type: state
value: true
option: [ true, ]
option_bold: [ true, ]
DoubleEvent:
type: state
value: true
option: [ true, ]
option_bold: [ true, ]
UseStamina: false
# ==================== Tool ====================
Daemon:

View File

@ -24,7 +24,8 @@
"page": "setting",
"tasks": [
"Weekly",
"Rogue"
"Rogue",
"Ornament"
]
},
"Tool": {

View File

@ -68,3 +68,7 @@ Weekly:
DungeonSupport:
Use:
option: [ always_use, do_not_use ]
Ornament:
DungeonSupport:
Use:
option: [ when_daily, always_use ]

View File

@ -101,42 +101,6 @@
"order": 8,
"color": "#fc8f8b"
},
"CloudRemainSeasonPass": {
"name": "CloudRemainSeasonPass",
"path": "Alas.CloudStorage.CloudRemainSeasonPass",
"i18n": "CloudStorage.CloudRemainSeasonPass.name",
"stored": "StoredInt",
"attrs": {
"time": "2020-01-01 00:00:00",
"value": 0
},
"order": 0,
"color": "#777777"
},
"CloudRemainPaid": {
"name": "CloudRemainPaid",
"path": "Alas.CloudStorage.CloudRemainPaid",
"i18n": "CloudStorage.CloudRemainPaid.name",
"stored": "StoredInt",
"attrs": {
"time": "2020-01-01 00:00:00",
"value": 0
},
"order": 0,
"color": "#777777"
},
"CloudRemainFree": {
"name": "CloudRemainFree",
"path": "Alas.CloudStorage.CloudRemainFree",
"i18n": "CloudStorage.CloudRemainFree.name",
"stored": "StoredInt",
"attrs": {
"time": "2020-01-01 00:00:00",
"value": 0
},
"order": 0,
"color": "#777777"
},
"Item_Credit": {
"name": "Item_Credit",
"path": "Dungeon.Planner.Item_Credit",
@ -868,6 +832,42 @@
"order": 0,
"color": "#777777"
},
"CloudRemainSeasonPass": {
"name": "CloudRemainSeasonPass",
"path": "DataUpdate.CloudStorage.CloudRemainSeasonPass",
"i18n": "CloudStorage.CloudRemainSeasonPass.name",
"stored": "StoredInt",
"attrs": {
"time": "2020-01-01 00:00:00",
"value": 0
},
"order": 0,
"color": "#777777"
},
"CloudRemainPaid": {
"name": "CloudRemainPaid",
"path": "DataUpdate.CloudStorage.CloudRemainPaid",
"i18n": "CloudStorage.CloudRemainPaid.name",
"stored": "StoredInt",
"attrs": {
"time": "2020-01-01 00:00:00",
"value": 0
},
"order": 0,
"color": "#777777"
},
"CloudRemainFree": {
"name": "CloudRemainFree",
"path": "DataUpdate.CloudStorage.CloudRemainFree",
"i18n": "CloudStorage.CloudRemainFree.name",
"stored": "StoredInt",
"attrs": {
"time": "2020-01-01 00:00:00",
"value": 0
},
"order": 0,
"color": "#777777"
},
"SimulatedUniverseFarm": {
"name": "SimulatedUniverseFarm",
"path": "Rogue.RogueWorld.SimulatedUniverseFarm",

View File

@ -13,7 +13,6 @@ Alas:
- EmulatorInfo
- Error
- Optimization
- CloudStorage
Restart:
- Scheduler
@ -31,7 +30,6 @@ Daily:
- DungeonStorage
DailyQuest:
- Scheduler
- AchievableQuest
- DailyStorage
BattlePass:
- Scheduler
@ -42,6 +40,7 @@ Daily:
DataUpdate:
- Scheduler
- ItemStorage
- CloudStorage
Freebies:
- Scheduler
- SupportReward
@ -61,6 +60,10 @@ Weekly:
- RogueWorld
- RogueBlessing
- RogueDebug
Ornament:
- Scheduler
- Ornament
- DungeonSupport
# ==================== Tool ====================

View File

@ -40,11 +40,6 @@ class GeneratedConfig:
Optimization_CombatScreenshotInterval = 1.0
Optimization_WhenTaskQueueEmpty = 'goto_main' # stay_there, goto_main, close_game
# Group `CloudStorage`
CloudStorage_CloudRemainSeasonPass = {}
CloudStorage_CloudRemainPaid = {}
CloudStorage_CloudRemainFree = {}
# Group `Dungeon`
Dungeon_Name = 'Calyx_Golden_Treasures_Jarilo_VI' # 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_Preservation_Penacony_ClockStudiosThemePark, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_The_Hunt_Penacony_SoulGladScorchsandAuditionVenue, Calyx_Crimson_Abundance_Jarilo_BackwaterPass, Calyx_Crimson_Abundance_Luofu_FyxestrollGarden, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Erudition_Penacony_PenaconyGrandTheater, 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_Duty, Stagnant_Shadow_Blaze, Stagnant_Shadow_Scorch, Stagnant_Shadow_Ire, 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, Cavern_of_Corrosion_Path_of_Cavalier
Dungeon_NameAtDoubleCalyx = 'Calyx_Golden_Treasures_Jarilo_VI' # 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_Preservation_Penacony_ClockStudiosThemePark, Calyx_Crimson_The_Hunt_Jarilo_OutlyingSnowPlains, Calyx_Crimson_The_Hunt_Penacony_SoulGladScorchsandAuditionVenue, Calyx_Crimson_Abundance_Jarilo_BackwaterPass, Calyx_Crimson_Abundance_Luofu_FyxestrollGarden, Calyx_Crimson_Erudition_Jarilo_RivetTown, Calyx_Crimson_Erudition_Penacony_PenaconyGrandTheater, Calyx_Crimson_Harmony_Jarilo_RobotSettlement, Calyx_Crimson_Harmony_Penacony_TheReverieDreamscape, Calyx_Crimson_Nihility_Jarilo_GreatMine, Calyx_Crimson_Nihility_Luofu_AlchemyCommission
@ -123,34 +118,6 @@ class GeneratedConfig:
Weekly_Name = 'Echo_of_War_Divine_Seed' # Echo_of_War_Destruction_Beginning, Echo_of_War_End_of_the_Eternal_Freeze, Echo_of_War_Divine_Seed, Echo_of_War_Borehole_Planet_Old_Crater, Echo_of_War_Salutations_of_Ashen_Dreams
Weekly_Team = 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9
# Group `AchievableQuest`
AchievableQuest_Complete_1_Daily_Mission = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Clear_Calyx_Golden_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Clear_Stagnant_Shadow_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Clear_Cavern_of_Corrosion_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_In_a_single_battle_inflict_3_Weakness_Break_of_different_Types = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Inflict_Weakness_Break_5_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Defeat_a_total_of_20_enemies = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Complete_Forgotten_Hall_1_time = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Complete_Echo_of_War_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Use_an_Ultimate_to_deal_the_final_blow_1_time = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Salvage_any_Relic = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Use_Consumables_1_time = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Log_in_to_the_game = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Dispatch_1_assignments = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Complete_Divergent_Universe_or_Simulated_Universe_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Clear_Calyx_Crimson_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Enter_combat_by_attacking_enemie_Weakness_and_win_3_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Use_Technique_2_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Destroy_3_destructible_objects = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Obtain_victory_in_combat_with_Support_Characters_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Level_up_any_character_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Level_up_any_Light_Cone_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Use_the_Omni_Synthesizer_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Take_photos_1_times = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Consume_120_Trailblaze_Power = 'achievable' # achievable, not_set, not_supported
AchievableQuest_Level_up_any_Relic_1_times = 'achievable' # achievable, not_set, not_supported
# Group `DailyStorage`
DailyStorage_DailyActivity = {}
DailyStorage_DailyQuest = {}
@ -179,6 +146,11 @@ class GeneratedConfig:
ItemStorage_Credit = {}
ItemStorage_StallerJade = {}
# Group `CloudStorage`
CloudStorage_CloudRemainSeasonPass = {}
CloudStorage_CloudRemainPaid = {}
CloudStorage_CloudRemainFree = {}
# Group `RogueWorld`
RogueWorld_World = 'Simulated_Universe_World_7' # Simulated_Universe_World_3, Simulated_Universe_World_4, Simulated_Universe_World_5, Simulated_Universe_World_6, Simulated_Universe_World_7, Simulated_Universe_World_8
RogueWorld_Path = 'The_Hunt' # Preservation, Remembrance, Nihility, Abundance, The_Hunt, Destruction, Elation, Propagation, Erudition
@ -202,6 +174,12 @@ class GeneratedConfig:
# Group `RogueDebug`
RogueDebug_DebugMode = False
# Group `Ornament`
Ornament_Dungeon = 'Divergent_Universe_Eternal_Comedy' # Divergent_Universe_Eternal_Comedy, Divergent_Universe_To_Sweet_Dreams, Divergent_Universe_Pouring_Blades, Divergent_Universe_Fruit_of_Evil, Divergent_Universe_Permafrost, Divergent_Universe_Gentle_Words, Divergent_Universe_Smelted_Heart, Divergent_Universe_Untoppled_Walls
Ornament_UseImmersifier = True # True
Ornament_DoubleEvent = True # True
Ornament_UseStamina = False
# Group `Daemon`
Daemon_Enable = True # True
Daemon_AimClicker = 'do_not_click' # item_enemy, item, enemy, do_not_click

View File

@ -10,7 +10,7 @@ class ManualConfig:
SCHEDULER_PRIORITY = """
Restart
> Weekly > Dungeon > Assignment
> Weekly > Ornament > Dungeon > Assignment
> BattlePass > DailyQuest
> Freebies > DataUpdate
> Rogue

View File

@ -95,23 +95,15 @@ class ConfigGenerator:
option_add(
keys='Weekly.Name.option',
options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Echo_of_War])
# OrnamentExtraction
ornament = [dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Ornament_Extraction]
option_add(keys='Ornament.Dungeon.option', options=ornament)
# Insert characters
from tasks.character.keywords import CharacterList
unsupported_characters = ["Jade"]
characters = [character.name for character in CharacterList.instances.values()
if character.name not in unsupported_characters]
option_add(keys='DungeonSupport.Character.option', options=characters)
# Insert daily quests
from tasks.daily.keywords import DailyQuest
for quest in DailyQuest.instances.values():
quest: DailyQuest
deep_set(raw, keys=['AchievableQuest', quest.name], value={
'type': 'state',
'value': 'achievable',
'option': ['achievable', 'not_set', 'not_supported'],
'option_bold': ['achievable'],
'option_light': ['not_supported'],
})
# Insert assignments
from tasks.assignment.keywords import AssignmentEntry
assignments = [entry.name for entry in AssignmentEntry.instances.values()]
@ -415,12 +407,8 @@ class ConfigGenerator:
from tasks.dungeon.keywords import DungeonList, DungeonDetailed
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))
@ -431,6 +419,8 @@ class ConfigGenerator:
deep_set(new, keys=['Dungeon', 'Name', dungeon.name],
value=i18n_treasure[ingame_lang].format(dungeon=dungeon_name))
if dungeon.is_Calyx_Crimson:
plane = dungeon.plane.__getattribute__(ingame_lang)
plane = re.sub('[「」]', '', plane)
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))
@ -439,6 +429,18 @@ class ConfigGenerator:
suffix = i18n_relic[ingame_lang].format(dungeon=dungeon_name).replace('Cavern of Corrosion: ', '')
if not value.endswith(suffix):
deep_set(new, keys=['Dungeon', 'Name', dungeon.name], value=f'{value}{suffix}')
if dungeon.is_Ornament_Extraction:
value = deep_get(new, keys=['Ornament', 'Dungeon', dungeon.name], default='')
suffix = i18n_relic[ingame_lang].format(dungeon=dungeon_name)
suffix = re.sub(
r'(•差分宇宙'
r'|Divergent Universe: '
r'|階差宇宙・'
r'|: Universo Diferenciado'
r'|Universo Diferenciado: '
r')', '', suffix)
if not value.endswith(suffix):
deep_set(new, keys=['Ornament', 'Dungeon', dungeon.name], value=f'{value}{suffix}')
# Stagnant shadows with character names
for dungeon in DungeonDetailed.instances.values():
@ -466,18 +468,6 @@ class ConfigGenerator:
continue
deep_set(new, keys=['DungeonSupport', 'Character', character.name], value=value)
# Daily quests
from tasks.daily.keywords import DailyQuest
for quest in DailyQuest.instances.values():
value = quest.__getattribute__(ingame_lang)
deep_set(new, keys=['AchievableQuest', quest.name, 'name'], value=value)
# deep_set(new, keys=['DailyQuest', quest.name, 'help'], value='')
copy_from = 'Complete_1_Daily_Mission'
if quest.name != copy_from:
for option in deep_get(self.args, keys=['DailyQuest', 'AchievableQuest', copy_from, 'option']):
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():
@ -778,45 +768,6 @@ class ConfigUpdater:
@staticmethod
def update_state(data):
def set_daily(quest, value):
if value is True:
value = 'achievable'
if value is False:
value = 'not_set'
deep_set(data, keys=['DailyQuest', 'AchievableQuest', quest], value=value)
set_daily('Complete_1_Daily_Mission', 'not_supported')
# Dungeon
dungeon = deep_get(data, keys='Dungeon.Scheduler.Enable')
set_daily('Clear_Calyx_Golden_1_times', 'not_set')
set_daily('Clear_Calyx_Crimson_1_times', 'not_set')
set_daily('Clear_Stagnant_Shadow_1_times', 'not_set')
set_daily('Clear_Cavern_of_Corrosion_1_times', 'not_set')
# Combat requirements
set_daily('In_a_single_battle_inflict_3_Weakness_Break_of_different_Types', 'achievable')
set_daily('Inflict_Weakness_Break_5_times', 'achievable')
set_daily('Defeat_a_total_of_20_enemies', 'achievable')
set_daily('Enter_combat_by_attacking_enemie_Weakness_and_win_3_times', 'achievable')
set_daily('Use_Technique_2_times', 'achievable')
# Other game systems
set_daily('Dispatch_1_assignments', deep_get(data, 'Assignment.Scheduler.Enable'))
set_daily('Take_photos_1_times', 'achievable')
set_daily('Destroy_3_destructible_objects', 'achievable')
set_daily('Complete_Forgotten_Hall_1_time', 'achievable')
set_daily('Complete_Echo_of_War_1_times', deep_get(data, 'Weekly.Scheduler.Enable'))
set_daily('Complete_Divergent_Universe_or_Simulated_Universe_1_times',deep_get(data, 'Rogue.Scheduler.Enable'))
set_daily('Obtain_victory_in_combat_with_Support_Characters_1_times',
dungeon and deep_get(data, 'Dungeon.DungeonSupport.Use') in ['when_daily', 'always_use'])
set_daily('Use_an_Ultimate_to_deal_the_final_blow_1_time', 'achievable')
# Build
set_daily('Level_up_any_character_1_times', 'not_supported')
set_daily('Level_up_any_Light_Cone_1_times', 'not_supported')
set_daily('Level_up_any_Relic_1_times', 'not_supported')
# Items
set_daily('Salvage_any_Relic', 'achievable')
set_daily('Use_the_Omni_Synthesizer_1_times', 'achievable')
set_daily('Use_Consumables_1_time', 'achievable')
# Limit setting combinations
if deep_get(data, keys='Rogue.RogueWorld.UseImmersifier') is False:
deep_set(data, keys='Rogue.RogueWorld.UseStamina', value=False)

View File

@ -58,6 +58,10 @@
"name": "Simulated Universe",
"help": ""
},
"Ornament": {
"name": "Ornament",
"help": "The followings must be satisfied:\n1. Manually clear Divergent Universe once this week and have a save file.\n2. Enter the dungeon once on current device to have dungeon team saved."
},
"Daemon": {
"name": "Dialogue Clicker",
"help": ""
@ -226,24 +230,6 @@
"close_game": "Close Game"
}
},
"CloudStorage": {
"_info": {
"name": "CloudStorage._info.name",
"help": "CloudStorage._info.help"
},
"CloudRemainSeasonPass": {
"name": "CloudStorage.CloudRemainSeasonPass.name",
"help": "CloudStorage.CloudRemainSeasonPass.help"
},
"CloudRemainPaid": {
"name": "CloudStorage.CloudRemainPaid.name",
"help": "CloudStorage.CloudRemainPaid.help"
},
"CloudRemainFree": {
"name": "CloudStorage.CloudRemainFree.name",
"help": "CloudStorage.CloudRemainFree.help"
}
},
"Dungeon": {
"_info": {
"name": "Dungeon Settings",
@ -431,8 +417,8 @@
},
"DungeonStorage": {
"_info": {
"name": "DungeonStorage._info.name",
"help": "DungeonStorage._info.help"
"name": "Dungeon",
"help": ""
},
"TrailblazePower": {
"name": "Power",
@ -707,198 +693,10 @@
"9": "9"
}
},
"AchievableQuest": {
"_info": {
"name": "Achievable Quests",
"help": "When the task status is \"Not Set\", you need to configure the SRC as required to achieve the quest\nNote: Please keep more tasks in \"Achievable\" status, otherwise SRC may not be able to grind 500 activity"
},
"Complete_1_Daily_Mission": {
"name": "Complete 1 Daily Mission",
"help": "",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Clear_Calyx_Golden_1_times": {
"name": "Clear Calyx (Golden) 1 time(s)",
"help": "Need to configure and enable the \"Dungeon\" task",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Clear_Stagnant_Shadow_1_times": {
"name": "Clear Stagnant Shadow 1 time(s)",
"help": "Need to configure and enable the \"Dungeon\" task",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Clear_Cavern_of_Corrosion_1_times": {
"name": "Clear Cavern of Corrosion 1 time(s)",
"help": "Need to configure and enable the \"Dungeon\" task",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"In_a_single_battle_inflict_3_Weakness_Break_of_different_Types": {
"name": "In a single battle, inflict 3 Weakness Break of different Types",
"help": "Achievable by default, will do Himeko trial",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Inflict_Weakness_Break_5_times": {
"name": "Inflict Weakness Break 5 times",
"help": "Achievable by default, will do Himeko trial",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Defeat_a_total_of_20_enemies": {
"name": "Defeat a total of 20 enemies",
"help": "Achievable by default, will do Himeko trial",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Complete_Forgotten_Hall_1_time": {
"name": "Complete Forgotten Hall 1 time",
"help": "Achievable by default, will choose the first four characters to do stage 1 once, please ensure that account build is sufficient to do stage 1",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Complete_Echo_of_War_1_times": {
"name": "Complete Echo of War 1 time(s)",
"help": "Need to configure and enable the \"Echo of War\" task",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Use_an_Ultimate_to_deal_the_final_blow_1_time": {
"name": "Use an Ultimate to deal the final blow 1 time",
"help": "Achievable by default, will do Himeko trial",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Salvage_any_Relic": {
"name": "Salvage any Relic",
"help": "Achievable by default, will salvage the first one in reverse order of rarity",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Use_Consumables_1_time": {
"name": "Use Consumables 1 time",
"help": "Achievable by default, will use gear. If there is no material, synthesized before use",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Log_in_to_the_game": {
"name": "Log in to the game",
"help": "",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Dispatch_1_assignments": {
"name": "Dispatch 1 assignment(s)",
"help": "Need to configure and enable the \"Assignment\" task",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Complete_Divergent_Universe_or_Simulated_Universe_1_times": {
"name": "Complete Divergent Universe or Simulated Universe 1 time(s)",
"help": "Need to configure and enable the \"Simulated Universe\" task",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Clear_Calyx_Crimson_1_times": {
"name": "Clear Calyx (Crimson) 1 time(s)",
"help": "AchievableQuest.Clear_Calyx_Crimson_1_times.help",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Enter_combat_by_attacking_enemie_Weakness_and_win_3_times": {
"name": "Enter combat by attacking enemies' Weakness and win 3 time(s)",
"help": "Achievable by default, will do Himeko trial",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Use_Technique_2_times": {
"name": "Use Technique 2 time(s)",
"help": "Achievable by default, will go to the abyssal 1 and use technique twice",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Destroy_3_destructible_objects": {
"name": "Destroy 3 destructible object(s)",
"help": "Achievable by default, will do Himeko trial",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Obtain_victory_in_combat_with_Support_Characters_1_times": {
"name": "Obtain victory in combat with Support Characters 1 time(s)",
"help": "Need to configure and enable the \"Dungeon\" task, configure support settings also",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Level_up_any_character_1_times": {
"name": "Level up any character 1 time(s)",
"help": "",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Level_up_any_Light_Cone_1_times": {
"name": "Level up any Light Cone 1 time(s)",
"help": "",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Use_the_Omni_Synthesizer_1_times": {
"name": "Use the Omni-Synthesizer 1 time(s)",
"help": "Achievable by default, will synthesize low-rarity material",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Take_photos_1_times": {
"name": "Take photos 1 time(s)",
"help": "Achievable by default",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Consume_120_Trailblaze_Power": {
"name": "Consume 120 Trailblaze Power",
"help": "",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
},
"Level_up_any_Relic_1_times": {
"name": "Level up any Relic 1 time(s)",
"help": "",
"achievable": "Achievable",
"not_set": "Not Set",
"not_supported": "Not Supported Yet"
}
},
"DailyStorage": {
"_info": {
"name": "DailyStorage._info.name",
"help": "DailyStorage._info.help"
"name": "Daily Quest",
"help": ""
},
"DailyActivity": {
"name": "Activity",
@ -911,8 +709,8 @@
},
"BattlePassStorage": {
"_info": {
"name": "BattlePassStorage._info.name",
"help": "BattlePassStorage._info.help"
"name": "Honor",
"help": ""
},
"BattlePassLevel": {
"name": "Honor",
@ -1067,8 +865,8 @@
},
"ItemStorage": {
"_info": {
"name": "ItemStorage._info.name",
"help": "ItemStorage._info.help"
"name": "Dashboard",
"help": ""
},
"Credit": {
"name": "Credit",
@ -1079,6 +877,24 @@
"help": ""
}
},
"CloudStorage": {
"_info": {
"name": "Cloud HSR",
"help": ""
},
"CloudRemainSeasonPass": {
"name": "Season Pass Remain X day(s)",
"help": ""
},
"CloudRemainPaid": {
"name": "Paid Time Remain X minute(s)",
"help": ""
},
"CloudRemainFree": {
"name": "Free Time Remain X minute(s)",
"help": ""
}
},
"RogueWorld": {
"_info": {
"name": "Simulated Universe Settings",
@ -1121,11 +937,11 @@
"occurrence": "Prefer Occurrence"
},
"UseImmersifier": {
"name": "Claim Planers Using Immersifiers",
"name": "Claim Planars Using Immersifiers",
"help": ""
},
"DoubleEvent": {
"name": "Participate in Double Planer Event",
"name": "Participate in Double Planar Event",
"help": ""
},
"WeeklyFarming": {
@ -1133,11 +949,11 @@
"help": ""
},
"UseStamina": {
"name": "Farm Planers Using Trailblase Power",
"help": "Task \"Dungeon\" will no longer run, and all trailblaze power will be used first to claim immersion rewards, except for double events."
"name": "Farm Planars Using Trailblaze Power",
"help": "Prioritize trailblaze power to farm planar ornaments, only taking priority over character planner"
},
"SimulatedUniverseFarm": {
"name": "Progress of elite boss farmed",
"name": "Elites/bosses Farmed",
"help": ""
}
},
@ -1194,6 +1010,38 @@
"help": "No stop conditions, no error handling, stop when encountering an error. Please report errors according to the doc: https://github.com/LmeSzinc/StarRailCopilot/wiki/RogueMap_cn"
}
},
"Ornament": {
"_info": {
"name": "Ornament Extraction Settings",
"help": ""
},
"Dungeon": {
"name": "Dungeon Name",
"help": "",
"Divergent_Universe_Eternal_Comedy": "Running Wolves & Kalpagni Lantern (Eternal Comedy)",
"Divergent_Universe_To_Sweet_Dreams": "Sigonia & Izumo Gensei (To Sweet Dreams)",
"Divergent_Universe_Pouring_Blades": "Firmament & Penacony (Pouring Blades)",
"Divergent_Universe_Fruit_of_Evil": "Rutilant Arena & Broken Keel (Fruit of Evil)",
"Divergent_Universe_Permafrost": "Belobog & Salsotto (Permafrost)",
"Divergent_Universe_Gentle_Words": "Commercial Enterprise & Differentiator (Gentle Words)",
"Divergent_Universe_Smelted_Heart": "Banditry & Vonwacq (Smelted Heart)",
"Divergent_Universe_Untoppled_Walls": "Space Station & Ageless (Untoppled Walls)"
},
"UseImmersifier": {
"name": "Claim Planars Using Immersifiers",
"help": "",
"True": "Enabled"
},
"DoubleEvent": {
"name": "Participate in Double Planar Event",
"help": "",
"True": "Enabled"
},
"UseStamina": {
"name": "Farm Planars Using Trailblaze Power",
"help": "Prioritize trailblaze power to farm planar ornaments, taking priority over character planner and simulated universe"
}
},
"Daemon": {
"_info": {
"name": "Dialogue Clicker",
@ -1216,7 +1064,7 @@
"PlannerScan": {
"_info": {
"name": "Scan Character Planner Results",
"help": "Tools need to stop the scheduler and then run independently\nBefore use, set planner goal in the in-game planner, calculate the results, and start scanning from the result page. Detailed usage see: https://github.com/LmeSzinc/StarRailCopilot/wiki/Planner_cn"
"help": "Tools need to stop the scheduler and then run independently\nBefore use, set planner goal in the in-game planner, calculate the results, and start scanning from the result page. Detailed usage see: https://github.com/LmeSzinc/StarRailCopilot/wiki/Planner_en"
},
"ResultAdd": {
"name": "Accumulate multiple scan results",

View File

@ -58,6 +58,10 @@
"name": "Universo Simulado",
"help": ""
},
"Ornament": {
"name": "Ornamentos",
"help": "Se deben cumplir los siguientes requisitos:\n1. Borre manualmente Universo Diferenciado una vez esta semana y tenga un archivo guardado.\n2. Ingrese a la mazmorra una vez en el dispositivo actual para guardar el equipo de la mazmorra."
},
"Daemon": {
"name": "Clic de diálogo",
"help": ""
@ -226,24 +230,6 @@
"close_game": "Cerrar el juego"
}
},
"CloudStorage": {
"_info": {
"name": "CloudStorage._info.name",
"help": "CloudStorage._info.help"
},
"CloudRemainSeasonPass": {
"name": "CloudStorage.CloudRemainSeasonPass.name",
"help": "CloudStorage.CloudRemainSeasonPass.help"
},
"CloudRemainPaid": {
"name": "CloudStorage.CloudRemainPaid.name",
"help": "CloudStorage.CloudRemainPaid.help"
},
"CloudRemainFree": {
"name": "CloudStorage.CloudRemainFree.name",
"help": "CloudStorage.CloudRemainFree.help"
}
},
"Dungeon": {
"_info": {
"name": "Ajustes de Mazmorra",
@ -431,8 +417,8 @@
},
"DungeonStorage": {
"_info": {
"name": "DungeonStorage._info.name",
"help": "DungeonStorage._info.help"
"name": "Mazmorra",
"help": ""
},
"TrailblazePower": {
"name": "Poder",
@ -707,198 +693,10 @@
"9": "9"
}
},
"AchievableQuest": {
"_info": {
"name": "Misiones completables",
"help": "Cuando el estado de una tarea sea \"No configurado\", deberás de configurar SRC para que pueda realizarla.\nNota: Por favor, ten más tareas en estado \"Completable\", sino SRC podría no llegar a los 500 pts. de actividad"
},
"Complete_1_Daily_Mission": {
"name": "Completa 1 misión diaria",
"help": "",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Clear_Calyx_Golden_1_times": {
"name": "Completa Cáliz (oro) 1 vez",
"help": "Necesitas configurar y activar la tarea \"Mazmorra\"",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Clear_Stagnant_Shadow_1_times": {
"name": "Completa Sombra paralizada 1 veces",
"help": "Necesitas configurar y activar la tarea \"Mazmorra\"",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Clear_Cavern_of_Corrosion_1_times": {
"name": "Completa Caverna de la corrosión 1 veces",
"help": "Necesitas configurar y activar la tarea \"Mazmorra\"",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"In_a_single_battle_inflict_3_Weakness_Break_of_different_Types": {
"name": "En una sola batalla, inflige 3 tipos de Ruptura de Debilidad",
"help": "Completable por defecto, se hará el desafío de Himeko",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Inflict_Weakness_Break_5_times": {
"name": "Inflige Ruptura de Debilidad 5 veces",
"help": "Completable por defecto, se hará el desafío de Himeko",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Defeat_a_total_of_20_enemies": {
"name": "Derrota a 20 enemigos",
"help": "Completable por defecto, se hará el desafío de Himeko",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Complete_Forgotten_Hall_1_time": {
"name": "Completa el Salón olvidado 1 vez",
"help": "Completable por defecto, se seleccionarán los primeros 4 personajes y se hará el primer nivel. Por favor, asegúrate de que estos pueden hacerlo.",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Complete_Echo_of_War_1_times": {
"name": "Completa Ecos de la guerra 1 vez",
"help": "Necesitas configurar y activar la tarea \"Ecos de la guerra\"",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Use_an_Ultimate_to_deal_the_final_blow_1_time": {
"name": "Asesta el golpe final con una habilidad definitiva 1 vez",
"help": "Completable por defecto, se hará el desafío de Himeko",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Salvage_any_Relic": {
"name": "Destruye 1 artefacto",
"help": "Completable por defecto. Se destruirá la última ordenado ascendentemente por rareza.",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Use_Consumables_1_time": {
"name": "Usa 1 consumible",
"help": "Completable por defecto. Se sintetizará uno si no tienes ninguno.",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Log_in_to_the_game": {
"name": "Inicia sesión en el juego",
"help": "",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Dispatch_1_assignments": {
"name": "Asigna 1 encargo",
"help": "Necesitas configurar y activar la tarea de \"Encargos\"",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Complete_Divergent_Universe_or_Simulated_Universe_1_times": {
"name": "Completa el Universo Simulado o el Universo Diferenciado 1 vez",
"help": "Necesitas configurar y activar la tarea \"Universo Simulado\"",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Clear_Calyx_Crimson_1_times": {
"name": "Completa Cáliz (carmesí) 1 vez",
"help": "Necesitas configurar y activar la tarea \"Mazmorra\"",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Enter_combat_by_attacking_enemie_Weakness_and_win_3_times": {
"name": "Entra en combate atacando la debilidad del enemigo y gana 3 veces",
"help": "Completable por defecto, se hará el desafío de Himeko",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Use_Technique_2_times": {
"name": "Usa técnicas 2 veces",
"help": "Alcanzable por defecto, irá al abismo y usará la técnica 2 veces.",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Destroy_3_destructible_objects": {
"name": "Destruye 3 objetos destruibles",
"help": "Completable por defecto, se hará el desafío de Himeko",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Obtain_victory_in_combat_with_Support_Characters_1_times": {
"name": "Gana 1 batalla(s) utilizando personajes de apoyo",
"help": "Necesitas configurar la tarea de \"Mazmorra\", así como configurar a los héroes de apoyo.",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Level_up_any_character_1_times": {
"name": "Mejora el nivel de cualquier personaje 1 vez",
"help": "",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Level_up_any_Light_Cone_1_times": {
"name": "Mejora cualquier cono de luz 1 vez",
"help": "",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Use_the_Omni_Synthesizer_1_times": {
"name": "Utiliza la máquina sintetizadora multiusos 1 veces",
"help": "Achievable by default, will synthesize low-rarity material",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Take_photos_1_times": {
"name": "Haz 1 foto(s)",
"help": "Completable por defecto.",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Consume_120_Trailblaze_Power": {
"name": "Consume 120 pts. de Poder trazacaminos",
"help": "",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
},
"Level_up_any_Relic_1_times": {
"name": "Mejora cualquier artefacto 1 vez",
"help": "",
"achievable": "Completable",
"not_set": "No configurado",
"not_supported": "No soportado aún"
}
},
"DailyStorage": {
"_info": {
"name": "DailyStorage._info.name",
"help": "DailyStorage._info.help"
"name": "Misión Diaria",
"help": ""
},
"DailyActivity": {
"name": "Actividad",
@ -911,8 +709,8 @@
},
"BattlePassStorage": {
"_info": {
"name": "BattlePassStorage._info.name",
"help": "BattlePassStorage._info.help"
"name": "Misión de Honor",
"help": ""
},
"BattlePassLevel": {
"name": "Honor",
@ -1067,7 +865,7 @@
},
"ItemStorage": {
"_info": {
"name": "",
"name": "Panel",
"help": ""
},
"Credit": {
@ -1079,6 +877,24 @@
"help": ""
}
},
"CloudStorage": {
"_info": {
"name": "Nube de HSR",
"help": ""
},
"CloudRemainSeasonPass": {
"name": "Pase de Temporada Permanece X día(s)",
"help": ""
},
"CloudRemainPaid": {
"name": "Tiempo restante pagado X minuto(s)",
"help": ""
},
"CloudRemainFree": {
"name": "Tiempo libre restante X minuto(s)",
"help": ""
}
},
"RogueWorld": {
"_info": {
"name": "Ajustes de Universo Simulado",
@ -1121,11 +937,11 @@
"occurrence": "Prefiero Evento"
},
"UseImmersifier": {
"name": "Reclamar de planers mediante inmersor",
"name": "Reclamar de planars mediante inmersor",
"help": ""
},
"DoubleEvent": {
"name": "Participa en doble planer evento",
"name": "Participa en doble planar evento",
"help": ""
},
"WeeklyFarming": {
@ -1133,8 +949,8 @@
"help": ""
},
"UseStamina": {
"name": "Reclamar de planers mediante poder trazacaminos",
"help": "La tarea de mazmorra ya no se ejecutará y todo el poder trazacaminos se usará primero para reclamar recompensas de inmersión, excepto para eventos dobles"
"name": "Reclamar de planars mediante poder trazacaminos",
"help": "Prioriza el poder trazacaminos para cultivar planar ornaments, teniendo prioridad solo sobre el planificador de personajes."
},
"SimulatedUniverseFarm": {
"name": "Progreso de élites derrotadas",
@ -1194,6 +1010,38 @@
"help": "Sin condiciones de parada, sin manejo de errores, deténgase cuando encuentre un error. Informe el error de acuerdo con el documento: https://github.com/LmeSzinc/StarRailCopilot/wiki/RogueMap_cn"
}
},
"Ornament": {
"_info": {
"name": "Ajustes de ornamentos extracción",
"help": ""
},
"Dungeon": {
"name": "Nombre de la Mazmorra",
"help": "",
"Divergent_Universe_Eternal_Comedy": " (Comedia eterna)",
"Divergent_Universe_To_Sweet_Dreams": " (Hasta los dulces sueños)",
"Divergent_Universe_Pouring_Blades": " (Lluvia de espadas)",
"Divergent_Universe_Fruit_of_Evil": " (Fruta del desastre)",
"Divergent_Universe_Permafrost": " (Permafrost)",
"Divergent_Universe_Gentle_Words": " (Palabras amables)",
"Divergent_Universe_Smelted_Heart": " (Corazón de fundición)",
"Divergent_Universe_Untoppled_Walls": " (Muros inquebrantables)"
},
"UseImmersifier": {
"name": "Reclamar de planars mediante inmersor",
"help": "",
"True": "Activado"
},
"DoubleEvent": {
"name": "Participa en doble planar evento",
"help": "",
"True": "Activado"
},
"UseStamina": {
"name": "Reclamar de planars mediante poder trazacaminos",
"help": "Prioriza el poder trazacaminos para cultivar planar ornamentos, teniendo prioridad sobre el planificador de personajes y el universo simulado."
}
},
"Daemon": {
"_info": {
"name": "Clic de diálogo",
@ -1216,7 +1064,7 @@
"PlannerScan": {
"_info": {
"name": "Escanear resultados del planificador de caracteres",
"help": "Las herramientas deben detener el programador y luego ejecutarse de forma independiente\nAntes de usarlo, establezca el objetivo del planificador en el planificador del juego, calcule los resultados y comience a escanear desde la página de resultados. Para uso detallado, consulte: https://github .com/LmeSzinc/StarRailCopilot/wiki/Planner_cn"
"help": "Las herramientas deben detener el programador y luego ejecutarse de forma independiente\nAntes de usarlo, establezca el objetivo del planificador en el planificador del juego, calcule los resultados y comience a escanear desde la página de resultados. Para uso detallado, consulte: https://github .com/LmeSzinc/StarRailCopilot/wiki/Planner_en"
},
"ResultAdd": {
"name": "Acumular múltiples resultados de escaneo",

View File

@ -58,6 +58,10 @@
"name": "Task.Rogue.name",
"help": "Task.Rogue.help"
},
"Ornament": {
"name": "Task.Ornament.name",
"help": "Task.Ornament.help"
},
"Daemon": {
"name": "Task.Daemon.name",
"help": "Task.Daemon.help"
@ -226,24 +230,6 @@
"close_game": "close_game"
}
},
"CloudStorage": {
"_info": {
"name": "CloudStorage._info.name",
"help": "CloudStorage._info.help"
},
"CloudRemainSeasonPass": {
"name": "CloudStorage.CloudRemainSeasonPass.name",
"help": "CloudStorage.CloudRemainSeasonPass.help"
},
"CloudRemainPaid": {
"name": "CloudStorage.CloudRemainPaid.name",
"help": "CloudStorage.CloudRemainPaid.help"
},
"CloudRemainFree": {
"name": "CloudStorage.CloudRemainFree.name",
"help": "CloudStorage.CloudRemainFree.help"
}
},
"Dungeon": {
"_info": {
"name": "Dungeon._info.name",
@ -707,194 +693,6 @@
"9": "9"
}
},
"AchievableQuest": {
"_info": {
"name": "AchievableQuest._info.name",
"help": "AchievableQuest._info.help"
},
"Complete_1_Daily_Mission": {
"name": "デイリークエストを1回クリアする",
"help": "AchievableQuest.Complete_1_Daily_Mission.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Clear_Calyx_Golden_1_times": {
"name": "「疑似花萼」を1回クリアする",
"help": "AchievableQuest.Clear_Calyx_Golden_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Clear_Stagnant_Shadow_1_times": {
"name": "「凝結虚影」を1回クリアする",
"help": "AchievableQuest.Clear_Stagnant_Shadow_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Clear_Cavern_of_Corrosion_1_times": {
"name": "「侵蝕トンネル」を1回クリアする",
"help": "AchievableQuest.Clear_Cavern_of_Corrosion_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"In_a_single_battle_inflict_3_Weakness_Break_of_different_Types": {
"name": "一度の戦闘で、異なる3種の属性の弱点撃破を発動する",
"help": "AchievableQuest.In_a_single_battle_inflict_3_Weakness_Break_of_different_Types.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Inflict_Weakness_Break_5_times": {
"name": "累計で弱点撃破効果を5回発動させる",
"help": "AchievableQuest.Inflict_Weakness_Break_5_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Defeat_a_total_of_20_enemies": {
"name": "敵を累計で20体倒す",
"help": "AchievableQuest.Defeat_a_total_of_20_enemies.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Complete_Forgotten_Hall_1_time": {
"name": "「忘却の庭」を1回クリアする",
"help": "AchievableQuest.Complete_Forgotten_Hall_1_time.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Complete_Echo_of_War_1_times": {
"name": "「歴戦余韻」を1回クリアする",
"help": "AchievableQuest.Complete_Echo_of_War_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Use_an_Ultimate_to_deal_the_final_blow_1_time": {
"name": "必殺技で最後の一撃を1回与える",
"help": "AchievableQuest.Use_an_Ultimate_to_deal_the_final_blow_1_time.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Salvage_any_Relic": {
"name": "任意の遺物1つを分解する",
"help": "AchievableQuest.Salvage_any_Relic.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Use_Consumables_1_time": {
"name": "消耗品を1個使う",
"help": "AchievableQuest.Use_Consumables_1_time.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Log_in_to_the_game": {
"name": "ゲームにログインする",
"help": "AchievableQuest.Log_in_to_the_game.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Dispatch_1_assignments": {
"name": "依頼に1回派遣する",
"help": "AchievableQuest.Dispatch_1_assignments.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Complete_Divergent_Universe_or_Simulated_Universe_1_times": {
"name": "「階差宇宙」または「模擬宇宙」を合計1回クリアする",
"help": "AchievableQuest.Complete_Divergent_Universe_or_Simulated_Universe_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Clear_Calyx_Crimson_1_times": {
"name": "「疑似花萼」を1回クリアする",
"help": "AchievableQuest.Clear_Calyx_Crimson_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Enter_combat_by_attacking_enemie_Weakness_and_win_3_times": {
"name": "弱点を攻撃して戦闘に入り、3回勝利する",
"help": "AchievableQuest.Enter_combat_by_attacking_enemie_Weakness_and_win_3_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Use_Technique_2_times": {
"name": "累計で秘技を2回発動する",
"help": "AchievableQuest.Use_Technique_2_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Destroy_3_destructible_objects": {
"name": "破壊できるオブジェクトを累計で3個破壊する",
"help": "AchievableQuest.Destroy_3_destructible_objects.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Obtain_victory_in_combat_with_Support_Characters_1_times": {
"name": "サポートキャラを使い、戦闘に1回勝利する",
"help": "AchievableQuest.Obtain_victory_in_combat_with_Support_Characters_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Level_up_any_character_1_times": {
"name": "任意のキャラを1回レベルアップする",
"help": "AchievableQuest.Level_up_any_character_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Level_up_any_Light_Cone_1_times": {
"name": "任意の光円錐を1回レベルアップする",
"help": "AchievableQuest.Level_up_any_Light_Cone_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Use_the_Omni_Synthesizer_1_times": {
"name": "「万能合成マシン」を1回使用する",
"help": "AchievableQuest.Use_the_Omni_Synthesizer_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Take_photos_1_times": {
"name": "1回撮影する",
"help": "AchievableQuest.Take_photos_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Consume_120_Trailblaze_Power": {
"name": "累計で開拓力×120を消費する",
"help": "AchievableQuest.Consume_120_Trailblaze_Power.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
},
"Level_up_any_Relic_1_times": {
"name": "任意の遺物を1回レベルアップする",
"help": "AchievableQuest.Level_up_any_Relic_1_times.help",
"achievable": "achievable",
"not_set": "not_set",
"not_supported": "not_supported"
}
},
"DailyStorage": {
"_info": {
"name": "DailyStorage._info.name",
@ -1079,6 +877,24 @@
"help": "ItemStorage.StallerJade.help"
}
},
"CloudStorage": {
"_info": {
"name": "CloudStorage._info.name",
"help": "CloudStorage._info.help"
},
"CloudRemainSeasonPass": {
"name": "CloudStorage.CloudRemainSeasonPass.name",
"help": "CloudStorage.CloudRemainSeasonPass.help"
},
"CloudRemainPaid": {
"name": "CloudStorage.CloudRemainPaid.name",
"help": "CloudStorage.CloudRemainPaid.help"
},
"CloudRemainFree": {
"name": "CloudStorage.CloudRemainFree.name",
"help": "CloudStorage.CloudRemainFree.help"
}
},
"RogueWorld": {
"_info": {
"name": "RogueWorld._info.name",
@ -1194,6 +1010,38 @@
"help": "RogueDebug.DebugMode.help"
}
},
"Ornament": {
"_info": {
"name": "Ornament._info.name",
"help": "Ornament._info.help"
},
"Dungeon": {
"name": "Ornament.Dungeon.name",
"help": "Ornament.Dungeon.help",
"Divergent_Universe_Eternal_Comedy": "(永遠の喜劇)",
"Divergent_Universe_To_Sweet_Dreams": "(寄り添い眠る)",
"Divergent_Universe_Pouring_Blades": "(剣の雨)",
"Divergent_Universe_Fruit_of_Evil": "(渦巻く罪)",
"Divergent_Universe_Permafrost": "(永久凍土)",
"Divergent_Universe_Gentle_Words": "(優しい言葉)",
"Divergent_Universe_Smelted_Heart": "(鋼の意志)",
"Divergent_Universe_Untoppled_Walls": "(不動の砦)"
},
"UseImmersifier": {
"name": "Ornament.UseImmersifier.name",
"help": "Ornament.UseImmersifier.help",
"True": "True"
},
"DoubleEvent": {
"name": "Ornament.DoubleEvent.name",
"help": "Ornament.DoubleEvent.help",
"True": "True"
},
"UseStamina": {
"name": "Ornament.UseStamina.name",
"help": "Ornament.UseStamina.help"
}
},
"Daemon": {
"_info": {
"name": "Daemon._info.name",

View File

@ -58,6 +58,10 @@
"name": "模拟宇宙",
"help": ""
},
"Ornament": {
"name": "饰品提取",
"help": "运行 \"饰品提取\" 任务需要:\n1. 每周事先手动通关差分宇宙一次并保存存档\n2. 在当前设备进入过副本一次,有保存的编队"
},
"Daemon": {
"name": "剧情连点器",
"help": ""
@ -226,24 +230,6 @@
"close_game": "关闭游戏"
}
},
"CloudStorage": {
"_info": {
"name": "",
"help": ""
},
"CloudRemainSeasonPass": {
"name": "畅玩卡剩余 X 天",
"help": ""
},
"CloudRemainPaid": {
"name": "星云币剩余 X 分钟",
"help": ""
},
"CloudRemainFree": {
"name": "免费时长剩余 X 分钟",
"help": ""
}
},
"Dungeon": {
"_info": {
"name": "每日副本设置",
@ -431,8 +417,8 @@
},
"DungeonStorage": {
"_info": {
"name": "DungeonStorage._info.name",
"help": "DungeonStorage._info.help"
"name": "每日副本",
"help": ""
},
"TrailblazePower": {
"name": "开拓力",
@ -707,198 +693,10 @@
"9": "9"
}
},
"AchievableQuest": {
"_info": {
"name": "可完成的任务",
"help": "任务状态为 \"未设置\" 时需要按照要求设置SRC才能启用任务\n注意请让更多的任务处于 \"可完成\" 状态否则SRC可能无法完成500点的活跃度要求"
},
"Complete_1_Daily_Mission": {
"name": "完成1个日常任务",
"help": "",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Clear_Calyx_Golden_1_times": {
"name": "完成1次「拟造花萼」",
"help": "需要设置并启用\"每日副本\"任务",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Clear_Stagnant_Shadow_1_times": {
"name": "完成1次「凝滞虚影」",
"help": "需要设置并启用\"每日副本\"任务",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Clear_Cavern_of_Corrosion_1_times": {
"name": "完成1次「侵蚀隧洞」",
"help": "需要设置并启用\"每日副本\"任务",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"In_a_single_battle_inflict_3_Weakness_Break_of_different_Types": {
"name": "单场战斗中触发3种不同属性的弱点击破",
"help": "默认可完成,将做姬子试用",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Inflict_Weakness_Break_5_times": {
"name": "累计触发弱点击破效果5次",
"help": "默认可完成,将做姬子试用",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Defeat_a_total_of_20_enemies": {
"name": "累计消灭20个敌人",
"help": "默认可完成,将做姬子试用",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Complete_Forgotten_Hall_1_time": {
"name": "完成1次「忘却之庭」",
"help": "默认可完成,将使用前四个角色打一次深渊一,请保证帐号练度足够打深渊一",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Complete_Echo_of_War_1_times": {
"name": "完成1次「历战余响」",
"help": "需要设置并启用\"历战余响\"任务",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Use_an_Ultimate_to_deal_the_final_blow_1_time": {
"name": "施放终结技造成制胜一击1次",
"help": "默认可完成,将做姬子试用",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Salvage_any_Relic": {
"name": "分解任意1件遗器",
"help": "默认可完成,将分解遗器稀有度倒序的第一个",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Use_Consumables_1_time": {
"name": "使用1件消耗品",
"help": "默认可完成,将使用护具,无材料时先合成再使用",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Log_in_to_the_game": {
"name": "登录游戏",
"help": "",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Dispatch_1_assignments": {
"name": "派遣1次委托",
"help": "需要设置并启用\"委托\"任务",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Complete_Divergent_Universe_or_Simulated_Universe_1_times": {
"name": "完成1次「差分宇宙」或「模拟宇宙」",
"help": "需要设置并启用\"模拟宇宙\"任务",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Clear_Calyx_Crimson_1_times": {
"name": "完成1次「拟造花萼」",
"help": "需要设置并启用\"每日副本\"任务",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Enter_combat_by_attacking_enemie_Weakness_and_win_3_times": {
"name": "利用弱点进入战斗并获胜3次",
"help": "默认可完成,将做姬子试用",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Use_Technique_2_times": {
"name": "累计施放2次秘技",
"help": "默认可完成将前往深渊一施放2次秘技",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Destroy_3_destructible_objects": {
"name": "累计击碎3个可破坏物",
"help": "默认可完成,将做姬子试用",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Obtain_victory_in_combat_with_Support_Characters_1_times": {
"name": "使用支援角色并获得战斗胜利1次",
"help": "需要设置并启用\"每日副本\",且设置好友支援",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Level_up_any_character_1_times": {
"name": "将任意角色等级提升1次",
"help": "",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Level_up_any_Light_Cone_1_times": {
"name": "将任意光锥等级提升1次",
"help": "",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Use_the_Omni_Synthesizer_1_times": {
"name": "使用1次「万能合成机」",
"help": "默认可完成,将合成最低级材料",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Take_photos_1_times": {
"name": "拍照1次",
"help": "默认可完成",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Consume_120_Trailblaze_Power": {
"name": "累计消耗120点开拓力",
"help": "",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
},
"Level_up_any_Relic_1_times": {
"name": "将任意遗器等级提升1次",
"help": "",
"achievable": "可完成",
"not_set": "未设置",
"not_supported": "暂未支持"
}
},
"DailyStorage": {
"_info": {
"name": "DailyStorage._info.name",
"help": "DailyStorage._info.help"
"name": "每日任务",
"help": ""
},
"DailyActivity": {
"name": "活跃度",
@ -911,8 +709,8 @@
},
"BattlePassStorage": {
"_info": {
"name": "BattlePassStorage._info.name",
"help": "BattlePassStorage._info.help"
"name": "无名勋礼",
"help": ""
},
"BattlePassLevel": {
"name": "无名勋礼",
@ -1067,8 +865,8 @@
},
"ItemStorage": {
"_info": {
"name": "ItemStorage._info.name",
"help": "ItemStorage._info.help"
"name": "仪表盘",
"help": ""
},
"Credit": {
"name": "信用点",
@ -1079,6 +877,24 @@
"help": ""
}
},
"CloudStorage": {
"_info": {
"name": "云游戏",
"help": ""
},
"CloudRemainSeasonPass": {
"name": "畅玩卡剩余 X 天",
"help": ""
},
"CloudRemainPaid": {
"name": "星云币剩余 X 分钟",
"help": ""
},
"CloudRemainFree": {
"name": "免费时长剩余 X 分钟",
"help": ""
}
},
"RogueWorld": {
"_info": {
"name": "模拟宇宙设置",
@ -1125,7 +941,7 @@
"help": ""
},
"DoubleEvent": {
"name": "参与双倍内圈器活动",
"name": "参与双倍内圈器活动",
"help": ""
},
"WeeklyFarming": {
@ -1134,7 +950,7 @@
},
"UseStamina": {
"name": "使用开拓力刷内圈遗器",
"help": "每日副本任务将不再打本,所有开拓力将优先被用于领取浸器奖励,双倍活动时除外"
"help": "优先将体力用于刷内圈遗器,仅优先于养成规划"
},
"SimulatedUniverseFarm": {
"name": "刷精英怪进度",
@ -1194,6 +1010,38 @@
"help": "无停止条件无异常处理遇错误即停止请按文档上报异常https://github.com/LmeSzinc/StarRailCopilot/wiki/RogueMap_cn"
}
},
"Ornament": {
"_info": {
"name": "饰品提取设置",
"help": ""
},
"Dungeon": {
"name": "副本名称",
"help": "",
"Divergent_Universe_Eternal_Comedy": "奔狼+火宫(永恒笑剧)",
"Divergent_Universe_To_Sweet_Dreams": "茨冈尼亚+出云神国(伴你入眠)",
"Divergent_Universe_Pouring_Blades": "苍穹+匹诺康尼(天剑如雨)",
"Divergent_Universe_Fruit_of_Evil": "繁星+龙骨(孽果盘生)",
"Divergent_Universe_Permafrost": "贝洛伯格+萨尔索图(百年冻土)",
"Divergent_Universe_Gentle_Words": "商业公司+差分(温柔话语)",
"Divergent_Universe_Smelted_Heart": "盗贼+翁瓦克(浴火钢心)",
"Divergent_Universe_Untoppled_Walls": "太空+仙舟(坚城不倒)"
},
"UseImmersifier": {
"name": "使用沉浸器领取遗器",
"help": "",
"True": "已启用"
},
"DoubleEvent": {
"name": "参与双倍内圈仪器活动",
"help": "",
"True": "已启用"
},
"UseStamina": {
"name": "使用开拓力刷内圈遗器",
"help": "优先将体力用于刷内圈遗器,优先于模拟宇宙和养成规划"
}
},
"Daemon": {
"_info": {
"name": "剧情连点器",

View File

@ -58,6 +58,10 @@
"name": "模擬宇宙",
"help": ""
},
"Ornament": {
"name": "飾品提取",
"help": "運行 \"飾品提取\" 任務需要:\n1. 每週事先手動通關差分宇宙一次並保存檔案\n2. 在當前設備進入過副本一次,有保存的編隊"
},
"Daemon": {
"name": "劇情連點器",
"help": ""
@ -226,24 +230,6 @@
"close_game": "關閉遊戲"
}
},
"CloudStorage": {
"_info": {
"name": "CloudStorage._info.name",
"help": "CloudStorage._info.help"
},
"CloudRemainSeasonPass": {
"name": "CloudStorage.CloudRemainSeasonPass.name",
"help": "CloudStorage.CloudRemainSeasonPass.help"
},
"CloudRemainPaid": {
"name": "CloudStorage.CloudRemainPaid.name",
"help": "CloudStorage.CloudRemainPaid.help"
},
"CloudRemainFree": {
"name": "CloudStorage.CloudRemainFree.name",
"help": "CloudStorage.CloudRemainFree.help"
}
},
"Dungeon": {
"_info": {
"name": "每日副本設定",
@ -431,8 +417,8 @@
},
"DungeonStorage": {
"_info": {
"name": "DungeonStorage._info.name",
"help": "DungeonStorage._info.help"
"name": "每日副本",
"help": ""
},
"TrailblazePower": {
"name": "開拓力",
@ -707,198 +693,10 @@
"9": "9"
}
},
"AchievableQuest": {
"_info": {
"name": "可完成的任務",
"help": "任務狀態為 \"未設定\" 時需要按照要求設定SRC才能啟用任務\n注意請讓更多的任務處於 \"可完成\" 狀態否則SRC可能無法完成500點的活躍度要求"
},
"Complete_1_Daily_Mission": {
"name": "完成1個每日任務",
"help": "",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Clear_Calyx_Golden_1_times": {
"name": "完成1次「擬造花萼」",
"help": "需要設定並啟用\"每日副本\"任務",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Clear_Stagnant_Shadow_1_times": {
"name": "完成1次「凝滯虛影」",
"help": "需要設定並啟用\"每日副本\"任務",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Clear_Cavern_of_Corrosion_1_times": {
"name": "完成1次「侵蝕隧洞」",
"help": "需要設定並啟用\"每日副本\"任務",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"In_a_single_battle_inflict_3_Weakness_Break_of_different_Types": {
"name": "單場戰鬥中觸發3種不同屬性的弱點擊破",
"help": "預設可完成,將做姬子試用",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Inflict_Weakness_Break_5_times": {
"name": "累積觸發弱點擊破效果5次",
"help": "預設可完成,將做姬子試用",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Defeat_a_total_of_20_enemies": {
"name": "累積消滅20個敵人",
"help": "預設可完成,將做姬子試用",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Complete_Forgotten_Hall_1_time": {
"name": "完成1次「忘卻之庭」",
"help": "預設可完成,將使用前四個角色打一次深淵一,請確保帳號練度足夠打深淵一",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Complete_Echo_of_War_1_times": {
"name": "完成1次「歷戰餘響」",
"help": "需要設定並啟用\"歷戰餘響\"任務",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Use_an_Ultimate_to_deal_the_final_blow_1_time": {
"name": "施放終結技造成制勝一擊1次",
"help": "預設可完成,將做姬子試用",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Salvage_any_Relic": {
"name": "分解任意1件遺器",
"help": "預設可完成,將分解遺器稀有度倒序的第一個",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Use_Consumables_1_time": {
"name": "使用1件消耗品",
"help": "預設可完成,將使用護具,無材料時先合成再使用",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Log_in_to_the_game": {
"name": "登入遊戲",
"help": "",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Dispatch_1_assignments": {
"name": "派遣1次委託",
"help": "需要設定並啟用\"委託\"任務",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Complete_Divergent_Universe_or_Simulated_Universe_1_times": {
"name": "完成1次「差分宇宙」或「模擬宇宙」",
"help": "需要設定並啟用\"模擬宇宙\"任務",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Clear_Calyx_Crimson_1_times": {
"name": "完成1次「擬造花萼」",
"help": "需要設定並啟用\"每日副本\"任務",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Enter_combat_by_attacking_enemie_Weakness_and_win_3_times": {
"name": "利用弱點進入戰鬥並獲勝3次",
"help": "預設可完成,將做姬子試用",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Use_Technique_2_times": {
"name": "累積施放2次秘技",
"help": "預設可完成將前往深淵一施放2次秘技",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Destroy_3_destructible_objects": {
"name": "累積擊碎3個可破壞物",
"help": "預設可完成,將做姬子試用",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Obtain_victory_in_combat_with_Support_Characters_1_times": {
"name": "使用支援角色並獲得戰鬥勝利1次",
"help": "需要設定並啟用\"每日副本\",且設並好友支援",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Level_up_any_character_1_times": {
"name": "將任意角色等級提升1次",
"help": "",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Level_up_any_Light_Cone_1_times": {
"name": "將任意光錐等級提升1次",
"help": "",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Use_the_Omni_Synthesizer_1_times": {
"name": "使用1次「萬能合成機」",
"help": "預設可完成,將合成最低級素材",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Take_photos_1_times": {
"name": "拍照1次",
"help": "預設可完成",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Consume_120_Trailblaze_Power": {
"name": "累積消耗120點開拓力",
"help": "",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
},
"Level_up_any_Relic_1_times": {
"name": "將任意遺器等級提升1次",
"help": "",
"achievable": "可完成",
"not_set": "未設定",
"not_supported": "暫未支援"
}
},
"DailyStorage": {
"_info": {
"name": "DailyStorage._info.name",
"help": "DailyStorage._info.help"
"name": "每日任務",
"help": ""
},
"DailyActivity": {
"name": "活躍度",
@ -911,8 +709,8 @@
},
"BattlePassStorage": {
"_info": {
"name": "BattlePassStorage._info.name",
"help": "BattlePassStorage._info.help"
"name": "無名勳禮",
"help": ""
},
"BattlePassLevel": {
"name": "無名勳禮",
@ -1067,8 +865,8 @@
},
"ItemStorage": {
"_info": {
"name": "ItemStorage._info.name",
"help": "ItemStorage._info.help"
"name": "儀表板",
"help": ""
},
"Credit": {
"name": "信用點",
@ -1079,6 +877,24 @@
"help": ""
}
},
"CloudStorage": {
"_info": {
"name": "雲遊戲",
"help": ""
},
"CloudRemainSeasonPass": {
"name": "暢玩卡剩餘 X 天",
"help": ""
},
"CloudRemainPaid": {
"name": "星雲幣剩餘 X 分鐘",
"help": ""
},
"CloudRemainFree": {
"name": "免費時間剩餘 X 分鐘",
"help": ""
}
},
"RogueWorld": {
"_info": {
"name": "模拟宇宙设置",
@ -1125,7 +941,7 @@
"help": ""
},
"DoubleEvent": {
"name": "參與雙倍內圈器活動",
"name": "參與雙倍內圈器活動",
"help": ""
},
"WeeklyFarming": {
@ -1133,8 +949,8 @@
"help": ""
},
"UseStamina": {
"name": "用開拓力農遺器",
"help": "每日副本任務將不再打本,所有開拓力將優先被用於領取浸器獎勵,雙倍活動時除外"
"name": "用開拓力農內圈遺器",
"help": "優先將體力用於農內圈遺器,僅優先於養成規劃"
},
"SimulatedUniverseFarm": {
"name": "農精英怪進度",
@ -1194,6 +1010,38 @@
"help": "無停止條件無異常處理遇錯誤即停止請依檔案回報異常https://github.com/LmeSzinc/StarRailCopilot/wiki/RogueMap_cn"
}
},
"Ornament": {
"_info": {
"name": "飾品提取設定",
"help": ""
},
"Dungeon": {
"name": "副本名稱",
"help": "",
"Divergent_Universe_Eternal_Comedy": "奔狼+火宮(永恆笑劇)",
"Divergent_Universe_To_Sweet_Dreams": "茨岡尼亞+出雲神國(伴你入眠)",
"Divergent_Universe_Pouring_Blades": "天空+匹諾康尼(天劍如雨)",
"Divergent_Universe_Fruit_of_Evil": "繁星+龍骨(孽果盤生)",
"Divergent_Universe_Permafrost": "貝洛伯格+薩爾索圖(百年凍土)",
"Divergent_Universe_Gentle_Words": "商業公司+差分(溫柔話語)",
"Divergent_Universe_Smelted_Heart": "盜賊+翁瓦克(浴火鋼心)",
"Divergent_Universe_Untoppled_Walls": "太空+仙舟(堅城不倒)"
},
"UseImmersifier": {
"name": "使用沉浸器領取遺器",
"help": "",
"True": "已啟用"
},
"DoubleEvent": {
"name": "參與雙倍內圈儀器活動",
"help": "",
"True": "已啟用"
},
"UseStamina": {
"name": "參與雙倍內圈遺器活動",
"help": "優先將體力用於農內圈遺器,優先於模擬宇宙和養成規劃"
}
},
"Daemon": {
"_info": {
"name": "劇情連點器",

View File

@ -31,9 +31,6 @@ from module.config.stored.classes import (
# ``` python -m module/config/config_updater.py ```
class StoredGenerated:
CloudRemainSeasonPass = StoredInt("Alas.CloudStorage.CloudRemainSeasonPass")
CloudRemainPaid = StoredInt("Alas.CloudStorage.CloudRemainPaid")
CloudRemainFree = StoredInt("Alas.CloudStorage.CloudRemainFree")
PlannerOverall = StoredPlannerOverall("Dungeon.Planner.PlannerOverall")
Item_Credit = StoredPlanner("Dungeon.Planner.Item_Credit")
Item_Trailblaze_EXP = StoredPlanner("Dungeon.Planner.Item_Trailblaze_EXP")
@ -105,4 +102,7 @@ class StoredGenerated:
Assignment = StoredAssignment("Assignment.Assignment.Assignment")
Credit = StoredInt("DataUpdate.ItemStorage.Credit")
StallerJade = StoredInt("DataUpdate.ItemStorage.StallerJade")
CloudRemainSeasonPass = StoredInt("DataUpdate.CloudStorage.CloudRemainSeasonPass")
CloudRemainPaid = StoredInt("DataUpdate.CloudStorage.CloudRemainPaid")
CloudRemainFree = StoredInt("DataUpdate.CloudStorage.CloudRemainFree")
SimulatedUniverseFarm = StoredSimulatedUniverseElite("Rogue.RogueWorld.SimulatedUniverseFarm")

View File

@ -8,6 +8,7 @@ import cv2
import numpy as np
from module.base.decorator import cached_property, del_cached_property, has_cached_property
from module.base.timer import Timer
from module.base.utils import ensure_time
from module.device.method.minitouch import insert_swipe, random_rectangle_point
from module.device.method.utils import RETRY_TRIES, retry_sleep
@ -277,11 +278,12 @@ class NemuIpcImpl:
def _ev(self):
return asyncio.new_event_loop()
async def ev_run_async(self, func, *args, **kwargs):
async def ev_run_async(self, func, *args, timeout=0.15, **kwargs):
"""
Args:
func: Sync function to call
*args:
timeout:
**kwargs:
Raises:
@ -290,7 +292,7 @@ class NemuIpcImpl:
func_wrapped = partial(func, *args, **kwargs)
# Increased timeout for slow PCs
# Default screenshot interval is 0.2s, so a 0.15s timeout would have a fast retry without extra time costs
result = await asyncio.wait_for(self._ev.run_in_executor(None, func_wrapped), timeout=0.15)
result = await asyncio.wait_for(self._ev.run_in_executor(None, func_wrapped), timeout=timeout)
return result
def ev_run_sync(self, func, *args, **kwargs):
@ -343,7 +345,7 @@ class NemuIpcImpl:
self.height = height_ptr.contents.value
@retry
def screenshot(self):
def screenshot(self, timeout=0.15):
"""
Returns:
np.ndarray: Image array in RGBA color space
@ -361,7 +363,8 @@ class NemuIpcImpl:
ret = self.ev_run_sync(
self.lib.nemu_capture_display,
self.connect_id, self.display_id, length, width_ptr, height_ptr, pixels_pointer
self.connect_id, self.display_id, length, width_ptr, height_ptr, pixels_pointer,
timeout=timeout,
)
if ret > 0:
raise NemuIpcError('nemu_capture_display failed during screenshot()')
@ -439,6 +442,8 @@ def serial_to_id(serial: str):
class NemuIpc(Platform):
_screenshot_interval = Timer(0.1)
@cached_property
def nemu_ipc(self) -> NemuIpcImpl:
"""
@ -494,7 +499,8 @@ class NemuIpc(Platform):
logger.info('nemu_ipc released')
def screenshot_nemu_ipc(self):
image = self.nemu_ipc.screenshot()
timeout = max(self._screenshot_interval.limit - 0.01, 0.15)
image = self.nemu_ipc.screenshot(timeout=timeout)
image = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)
cv2.flip(image, 0, dst=image)

View File

@ -73,6 +73,38 @@ u2.setup_logger = setup_logger
u2.init.setup_logger = setup_logger
# Patch Initer
class PatchedIniter(u2.init.Initer):
@property
def atx_agent_url(self):
files = {
'armeabi-v7a': 'atx-agent_{v}_linux_armv7.tar.gz',
# 'arm64-v8a': 'atx-agent_{v}_linux_armv7.tar.gz',
'arm64-v8a': 'atx-agent_{v}_linux_arm64.tar.gz',
'armeabi': 'atx-agent_{v}_linux_armv6.tar.gz',
'x86': 'atx-agent_{v}_linux_386.tar.gz',
'x86_64': 'atx-agent_{v}_linux_386.tar.gz',
}
name = None
for abi in self.abis:
name = files.get(abi)
if name:
break
if not name:
raise Exception(
"arch(%s) need to be supported yet, please report an issue in github"
% self.abis)
return u2.init.GITHUB_BASEURL + '/atx-agent/releases/download/%s/%s' % (
u2.version.__atx_agent_version__, name.format(v=u2.version.__atx_agent_version__))
@property
def minicap_urls(self):
return []
u2.init.Initer = PatchedIniter
def is_port_using(port_num):
""" if port is using by others, return True. else return False """
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@ -394,6 +426,7 @@ class HierarchyButton:
"""
Element props
"""
def _get_bool_prop(self, prop: str) -> bool:
return self.attrib.get(prop, "").lower() == 'true'

View File

@ -366,8 +366,10 @@ def put_arg_stored(kwargs: T_Output_Kwargs) -> Output:
put_text(value).style("--dashboard-value--")
])]
else:
# Empty
rows = []
# No Data
rows = [put_scope(f"dashboard-value-{name}", [
put_text(t("Gui.Dashboard.NoData")).style("--dashboard-value--")
])]
# Add other key-value in stored
if values:
rows += [
@ -379,6 +381,11 @@ def put_arg_stored(kwargs: T_Output_Kwargs) -> Output:
rows.append(
put_text(time_).style("--dashboard-time--")
)
else:
# Blank row
rows.append(
put_text(" ").style("--dashboard-time--")
)
return put_scope(
f"arg_container-stored-{name}",

View File

@ -1,13 +1,13 @@
# Image processing
numpy
scipy
pillow
opencv-python
numpy==1.24.3
scipy==1.10.1
pillow==9.5.0
opencv-python==4.7.0.72
# Device connection
adbutils
adbutils==1.2.9
uiautomator2==2.16.17
uiautomator2cache==0.3.0.1
uiautomator2cache==0.3.1
wrapt>=1.14.0
lz4
av==10.0.0
@ -33,7 +33,7 @@ uvicorn[standard]==0.17.6
aiofiles
# Game resources
srcmap==1.3.6
srcmap==2.3.20240701
# For dev
# pip-tools

View File

@ -67,7 +67,7 @@ scipy==1.10.1 # via -r requirements-in.txt
shapely==2.0.1 # via pponnxcr
six==1.16.0 # via pynput, uiautomator2
sniffio==1.3.0 # via anyio
srcmap==1.3.6 # via -r requirements-in.txt
srcmap==2.3.20240701 # via -r requirements-in.txt
starlette==0.14.2 # via -r requirements-in.txt
sympy==1.12 # via onnxruntime
tornado==6.3.1 # via pywebio
@ -75,7 +75,7 @@ tqdm==4.65.0 # via -r requirements-in.txt
typing-extensions==4.8.0 # via pydantic, pydantic-core
ua-parser==0.16.1 # via user-agents
uiautomator2==2.16.17 # via -r requirements-in.txt
uiautomator2cache==0.3.0.1 # via -r requirements-in.txt
uiautomator2cache==0.3.1 # via -r requirements-in.txt
urllib3==2.0.2 # via requests
user-agents==2.2.0 # via pywebio
uvicorn[standard]==0.17.6 # via -r requirements-in.txt

View File

@ -0,0 +1,21 @@
from module.logger import logger
from tasks.combat.combat import Combat
from tasks.map.control.waypoint import Waypoint
from tasks.map.keywords.plane import Penacony_TheReverieReality
from tasks.map.route.base import RouteBase
class Route(RouteBase, Combat):
def route(self):
"""
Pages:
in: Any
out: page_forgotten_hall
"""
logger.hr('Route Ornament Extraction', level=1)
self.map_init(plane=Penacony_TheReverieReality, position=(245.3, 233.3))
boss = Waypoint((245.2, 193.6))
boss.expected_end = [self.is_combat_executing]
self.clear_enemy(
boss
)

4
src.py
View File

@ -58,6 +58,10 @@ class StarRailCopilot(AzurLaneAutoScript):
from tasks.rogue.rogue import Rogue
Rogue(config=self.config, device=self.device).run()
def ornament(self):
from tasks.ornament.ornament import Ornament
Ornament(config=self.config, device=self.device).run()
def benchmark(self):
from module.daemon.benchmark import run_benchmark
run_benchmark(config=self.config)

View File

@ -55,6 +55,8 @@ class OcrPlaneName(OcrWhiteLetterOnComplexBackground):
if '星港' in result:
result = '迴星港'
result = result.replace('太司', '太卜司')
# IRadiantFeldspar
result = re.sub('[Ii1|]\s*Radiant', 'Radiant', result)
result = result.replace(' ', '')

View File

@ -43,6 +43,16 @@ COMBAT_SUPPORT_LIST_SCROLL = ButtonWrapper(
button=(472, 162, 476, 598),
),
)
FIRST_CHARACTER = ButtonWrapper(
name='FIRST_CHARACTER',
share=Button(
file='./assets/share/combat/support/FIRST_CHARACTER.png',
area=(136, 140, 386, 204),
search=(116, 120, 406, 224),
color=(255, 255, 255),
button=(136, 140, 386, 204),
),
)
SUPPORT_SELECTED = ButtonWrapper(
name='SUPPORT_SELECTED',
share=[

View File

@ -160,6 +160,7 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo
skip_first_screenshot = True
is_executing = True
self.combat_state_reset()
self.device.screenshot_interval_set('combat')
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
@ -192,6 +193,8 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo
if self.handle_battle_pass_notification():
continue
self.device.screenshot_interval_set()
def _combat_can_again(self) -> bool:
"""
Pages:
@ -399,10 +402,10 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo
finish = self.combat_finish()
if self._combat_should_reenter():
continue
# Reset combat_wave_cost, so handle_combat_interact() won't activate before handle_combat_prepare()
self.combat_wave_cost = 10
if finish:
break
# Reset combat_wave_cost, so handle_combat_interact() won't activate before handle_combat_prepare()
self.combat_wave_cost = 10
logger.attr('combat_wave_done', self.combat_wave_done)
return self.combat_wave_done

View File

@ -8,8 +8,7 @@ from module.logger import logger
from module.ui.scroll import AdaptiveScroll
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, SUPPORT_SELECTED
from tasks.combat.assets.assets_combat_support import *
from tasks.combat.assets.assets_combat_team import COMBAT_TEAM_DISMISSSUPPORT, COMBAT_TEAM_SUPPORT
@ -260,6 +259,27 @@ class CombatSupport(UI):
interval.reset()
continue
def _select_first(self):
logger.hr("Combat support select")
logger.info(f'Select: first')
skip_first_screenshot = False
interval = Timer(2)
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if SUPPORT_SELECTED.match_template(self.device.image, similarity=0.75):
logger.info('Character support selected')
return True
if interval.reached():
self.device.click(FIRST_CHARACTER)
interval.reset()
continue
def _cancel_popup(self):
"""
Pages:

View File

@ -13,6 +13,16 @@ DIVERGENT_UNIVERSE_LOADED = ButtonWrapper(
button=(893, 608, 911, 628),
),
)
DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE = ButtonWrapper(
name='DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE',
share=Button(
file='./assets/share/dungeon/ui_rogue/DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE.png',
area=(437, 316, 1169, 378),
search=(417, 296, 1189, 398),
color=(197, 105, 95),
button=(437, 316, 1169, 378),
),
)
LAST_TELEPORT = ButtonWrapper(
name='LAST_TELEPORT',
share=Button(
@ -38,7 +48,7 @@ SURVIVAL_INDEX_OE_LOADED = ButtonWrapper(
share=Button(
file='./assets/share/dungeon/ui_rogue/SURVIVAL_INDEX_OE_LOADED.png',
area=(473, 207, 498, 232),
search=(453, 187, 518, 252),
search=(468, 193, 503, 283),
color=(185, 135, 74),
button=(473, 207, 498, 232),
),

View File

@ -15,6 +15,7 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
achieved_daily_quest = False
achieved_weekly_quest = False
running_double = False
support_once = True
daily_quests = []
weekly_quests = []
@ -76,6 +77,16 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
wave_limit = relic
if relic == 0:
return 0
# No need, already checked in Survival_Index
# if dungeon.is_Ornament_Extraction and self.running_double and \
# self.config.stored.DungeonDouble.rogue > 0:
# rogue = self.get_double_event_remain_at_combat()
# if rogue is not None and rogue < self.config.stored.DungeonDouble.rogue:
# self.config.stored.DungeonDouble.rogue = rogue
# wave_limit = rogue
# if rogue == 0:
# return 0
# Combat
self.dungeon = dungeon
count = self.combat(team=team, wave_limit=wave_limit, support_character=support_character)
@ -132,6 +143,12 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
if self.config.stored.BattlePassQuestEchoOfWar.is_full():
logger.info('Achieved weekly quest Complete_Echo_of_War_1_times')
self.achieved_weekly_quest = True
# Ornament_Extraction
if dungeon.is_Ornament_Extraction:
if KEYWORDS_BATTLE_PASS_QUEST.Complete_Divergent_Universe_or_Simulated_Universe_1_times in self.weekly_quests:
logger.info('Achieved weekly quest Complete_Divergent_Universe_or_Simulated_Universe_1_times')
# No need to add since it's 0/1
self.achieved_weekly_quest = True
# Support quest
if support_character is not None:
self.called_daily_support = True
@ -169,7 +186,7 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
out: page_main
"""
require = self.require_compulsory_support()
if require:
if require and self.support_once:
logger.info('Run once with support')
count = self._dungeon_run(dungeon=dungeon, team=team, wave_limit=1,
support_character=self.config.DungeonSupport_Character)
@ -184,22 +201,22 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
return count
elif require and not self.support_once:
# Run with support all the way
return self._dungeon_run(dungeon=dungeon, team=team, wave_limit=0,
support_character=self.config.DungeonSupport_Character)
else:
# Normal run
return self._dungeon_run(dungeon=dungeon, team=team, wave_limit=wave_limit,
support_character=support_character)
def run(self):
self.config.update_battle_pass_quests()
self.config.update_daily_quests()
self.check_synthesize()
self.called_daily_support = False
self.achieved_daily_quest = False
self.achieved_weekly_quest = False
self.running_double = False
self.daily_quests = self.config.stored.DailyQuest.load_quests()
self.weekly_quests = self.config.stored.BattlePassWeeklyQuest.load_quests()
def update_double_event_record(self):
"""
Pages:
in: Any
out: page_guide, Survival_Index
"""
# Update double event records
if (self.config.stored.DungeonDouble.is_expired()
or self.config.stored.DungeonDouble.calyx > 0
@ -208,7 +225,8 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
logger.info('Get dungeon double remains')
# UI switches
switched = self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index)
if not switched:
if not switched and not self._dungeon_survival_index_top_appear():
logger.info('Reset nav states')
# Nav must at top, reset nav states
self.ui_goto_main()
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index)
@ -229,6 +247,18 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
self.config.stored.DungeonDouble.relic = relic
self.config.stored.DungeonDouble.rogue = rogue
def run(self):
self.config.update_battle_pass_quests()
self.config.update_daily_quests()
self.check_synthesize()
self.called_daily_support = False
self.achieved_daily_quest = False
self.achieved_weekly_quest = False
self.running_double = False
self.daily_quests = self.config.stored.DailyQuest.load_quests()
self.weekly_quests = self.config.stored.BattlePassWeeklyQuest.load_quests()
self.update_double_event_record()
# Run double events
planner = self.planner.get_dungeon(double_calyx=True)
# Double calyx
@ -251,7 +281,7 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
# Dungeon to clear all trailblaze power
do_rogue = False
if self.config.is_task_enabled('Rogue'):
if self.config.is_task_enabled('Rogue') and not self.config.is_task_enabled('Ornament'):
if self.config.cross_get('Rogue.RogueWorld.UseStamina'):
logger.info('Going to use stamina in rogue')
do_rogue = True
@ -266,14 +296,6 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
final = planner
self.is_doing_planner = True
# Check daily
if self.achieved_daily_quest:
self.config.task_call('DailyQuest')
self.config.task_stop()
if self.achieved_weekly_quest:
self.config.task_call('BattlePass')
self.config.task_stop()
# Use all stamina
if do_rogue:
# Use support if prioritize rogue

View File

@ -61,19 +61,19 @@ class DungeonEvent(UI):
logger.attr('Double rogue', has)
return has
def has_double_event_at_combat(self) -> bool:
def has_double_event_at_combat(self, button=OCR_DOUBLE_EVENT_REMAIN_AT_COMBAT) -> bool:
"""
Pages:
in: COMBAT_PREPARE
"""
has = self.image_color_count(
OCR_DOUBLE_EVENT_REMAIN_AT_COMBAT,
button,
color=(231, 188, 103),
threshold=240, count=1000
)
# Anniversary 3x event
has |= self.image_color_count(
OCR_DOUBLE_EVENT_REMAIN_AT_COMBAT,
button,
color=(229, 62, 44),
threshold=221, count=50
)
@ -109,16 +109,16 @@ class DungeonEvent(UI):
logger.attr('Double event remain', remain)
return remain
def get_double_event_remain_at_combat(self) -> int | None:
def get_double_event_remain_at_combat(self, button=OCR_DOUBLE_EVENT_REMAIN_AT_COMBAT) -> int | None:
"""
Pages:
in: COMBAT_PREPARE
"""
if not self.has_double_event_at_combat():
if not self.has_double_event_at_combat(button=button):
logger.attr('Double event remain at combat', 0)
return 0
ocr = DoubleEventOcr(OCR_DOUBLE_EVENT_REMAIN_AT_COMBAT)
ocr = DoubleEventOcr(button)
for row in ocr.detect_and_ocr(self.device.image):
if not ocr.is_format_matched(row.ocr_text):
continue

View File

@ -117,6 +117,11 @@ class DungeonList(Keyword):
def is_Simulated_Universe(self):
return 'Simulated_Universe' in self.name
@cached_property
def is_Ornament_Extraction(self):
# Farm Ornament_Extraction from Ornament_Extraction_xxx
return 'Divergent_Universe' in self.name
@cached_property
def is_Forgotten_Hall(self):
for word in [
@ -151,6 +156,8 @@ class DungeonList(Keyword):
import tasks.dungeon.keywords.nav as KEYWORDS_DUNGEON_NAV
if self.is_Simulated_Universe:
return KEYWORDS_DUNGEON_NAV.Simulated_Universe
if self.is_Ornament_Extraction:
return KEYWORDS_DUNGEON_NAV.Ornament_Extraction
if self.is_Calyx_Golden:
return KEYWORDS_DUNGEON_NAV.Calyx_Golden
if self.is_Calyx_Crimson:

View File

@ -707,74 +707,19 @@ Simulated_Universe_World_9 = DungeonList(
dungeon_id=190,
plane_id=100000104,
)
Divergent_Universe_Untoppled_Walls = DungeonList(
Divergent_Universe_Eternal_Comedy = DungeonList(
id=65,
name='Divergent_Universe_Untoppled_Walls',
cn='坚城不倒•差分宇宙',
cht='堅城不倒•差分宇宙',
en='Divergent Universe: Untoppled Walls',
jp='階差宇宙・不動の砦',
es='Muros inquebrantables: Universo Diferenciado',
dungeon_id=230,
plane_id=0,
)
Divergent_Universe_Smelted_Heart = DungeonList(
id=66,
name='Divergent_Universe_Smelted_Heart',
cn='浴火钢心•差分宇宙',
cht='浴火鋼心•差分宇宙',
en='Divergent Universe: Smelted Heart',
jp='階差宇宙・鋼の意志',
es='Corazón de fundición: Universo Diferenciado',
dungeon_id=240,
plane_id=0,
)
Divergent_Universe_Gentle_Words = DungeonList(
id=67,
name='Divergent_Universe_Gentle_Words',
cn='温柔话语•差分宇宙',
cht='溫柔話語•差分宇宙',
en='Divergent Universe: Gentle Words',
jp='階差宇宙・優しい言葉',
es='Palabras amables: Universo Diferenciado',
dungeon_id=250,
plane_id=0,
)
Divergent_Universe_Permafrost = DungeonList(
id=68,
name='Divergent_Universe_Permafrost',
cn='百年冻土•差分宇宙',
cht='百年凍土•差分宇宙',
en='Divergent Universe: Permafrost',
jp='階差宇宙・永久凍土',
es='Permafrost: Universo Diferenciado',
dungeon_id=260,
plane_id=0,
)
Divergent_Universe_Fruit_of_Evil = DungeonList(
id=69,
name='Divergent_Universe_Fruit_of_Evil',
cn='孽果盘生•差分宇宙',
cht='孽果盤生•差分宇宙',
en='Divergent Universe: Fruit of Evil',
jp='階差宇宙・渦巻く罪',
es='Fruta del desastre: Universo Diferenciado',
dungeon_id=270,
plane_id=0,
)
Divergent_Universe_Pouring_Blades = DungeonList(
id=70,
name='Divergent_Universe_Pouring_Blades',
cn='天剑如雨•差分宇宙',
cht='天劍如雨•差分宇宙',
en='Divergent Universe: Pouring Blades',
jp='階差宇宙・剣の雨',
es='Lluvia de espadas: Universo Diferenciado',
dungeon_id=280,
name='Divergent_Universe_Eternal_Comedy',
cn='永恒笑剧•差分宇宙',
cht='永恆笑劇•差分宇宙',
en='Divergent Universe: Eternal Comedy',
jp='階差宇宙・永遠の喜劇',
es='Universo Diferenciado: Comedia eterna',
dungeon_id=300,
plane_id=0,
)
Divergent_Universe_To_Sweet_Dreams = DungeonList(
id=71,
id=66,
name='Divergent_Universe_To_Sweet_Dreams',
cn='伴你入眠•差分宇宙',
cht='伴你入眠•差分宇宙',
@ -784,15 +729,70 @@ Divergent_Universe_To_Sweet_Dreams = DungeonList(
dungeon_id=290,
plane_id=0,
)
Divergent_Universe_Eternal_Comedy = DungeonList(
Divergent_Universe_Pouring_Blades = DungeonList(
id=67,
name='Divergent_Universe_Pouring_Blades',
cn='天剑如雨•差分宇宙',
cht='天劍如雨•差分宇宙',
en='Divergent Universe: Pouring Blades',
jp='階差宇宙・剣の雨',
es='Lluvia de espadas: Universo Diferenciado',
dungeon_id=280,
plane_id=0,
)
Divergent_Universe_Fruit_of_Evil = DungeonList(
id=68,
name='Divergent_Universe_Fruit_of_Evil',
cn='孽果盘生•差分宇宙',
cht='孽果盤生•差分宇宙',
en='Divergent Universe: Fruit of Evil',
jp='階差宇宙・渦巻く罪',
es='Fruta del desastre: Universo Diferenciado',
dungeon_id=270,
plane_id=0,
)
Divergent_Universe_Permafrost = DungeonList(
id=69,
name='Divergent_Universe_Permafrost',
cn='百年冻土•差分宇宙',
cht='百年凍土•差分宇宙',
en='Divergent Universe: Permafrost',
jp='階差宇宙・永久凍土',
es='Permafrost: Universo Diferenciado',
dungeon_id=260,
plane_id=0,
)
Divergent_Universe_Gentle_Words = DungeonList(
id=70,
name='Divergent_Universe_Gentle_Words',
cn='温柔话语•差分宇宙',
cht='溫柔話語•差分宇宙',
en='Divergent Universe: Gentle Words',
jp='階差宇宙・優しい言葉',
es='Palabras amables: Universo Diferenciado',
dungeon_id=250,
plane_id=0,
)
Divergent_Universe_Smelted_Heart = DungeonList(
id=71,
name='Divergent_Universe_Smelted_Heart',
cn='浴火钢心•差分宇宙',
cht='浴火鋼心•差分宇宙',
en='Divergent Universe: Smelted Heart',
jp='階差宇宙・鋼の意志',
es='Corazón de fundición: Universo Diferenciado',
dungeon_id=240,
plane_id=0,
)
Divergent_Universe_Untoppled_Walls = DungeonList(
id=72,
name='Divergent_Universe_Eternal_Comedy',
cn='永恒笑剧•差分宇宙',
cht='永恆笑劇•差分宇宙',
en='Divergent Universe: Eternal Comedy',
jp='階差宇宙・永遠の喜劇',
es='Universo Diferenciado: Comedia eterna',
dungeon_id=300,
name='Divergent_Universe_Untoppled_Walls',
cn='坚城不倒•差分宇宙',
cht='堅城不倒•差分宇宙',
en='Divergent Universe: Untoppled Walls',
jp='階差宇宙・不動の砦',
es='Muros inquebrantables: Universo Diferenciado',
dungeon_id=230,
plane_id=0,
)
Simulated_Universe_The_Swarm_Disaster = DungeonList(

View File

@ -131,7 +131,7 @@ class DungeonState(UI):
"""
Delay tasks that use stamina
"""
if dungeon.is_Simulated_Universe:
if dungeon.is_Simulated_Universe or dungeon.is_Ornament_Extraction:
limit = 80
elif dungeon.is_Cavern_of_Corrosion:
limit = 80
@ -182,7 +182,7 @@ class DungeonState(UI):
logger.info(f'Approaching next monday, delay to {next_monday} instead')
future = next_monday
tasks = ['Dungeon', 'Weekly']
tasks = ['Dungeon', 'Weekly', 'Ornament']
with self.config.multi_set():
for task in tasks:
next_run = self.config.cross_get(keys=f'{task}.Scheduler.NextRun', default=DEFAULT_TIME)

View File

@ -311,6 +311,13 @@ class DungeonUI(DungeonState):
logger.info('Survival index loaded, SURVIVAL_INDEX_OE_LOADED')
return True
def _dungeon_survival_index_top_appear(self):
if self.appear(SURVIVAL_INDEX_SU_LOADED):
return True
if self.appear(SURVIVAL_INDEX_OE_LOADED):
return True
return False
def _dungeon_wait_treasures_lightward_loaded(self, skip_first_screenshot=True):
"""
Returns:
@ -732,7 +739,8 @@ class DungeonUI(DungeonState):
if dungeon.is_Calyx_Crimson \
or dungeon.is_Stagnant_Shadow \
or dungeon.is_Cavern_of_Corrosion \
or dungeon.is_Echo_of_War:
or dungeon.is_Echo_of_War \
or dungeon.is_Ornament_Extraction:
self._dungeon_nav_goto(dungeon.dungeon_nav)
self._dungeon_wait_until_dungeon_list_loaded()
self._dungeon_insight(dungeon)

View File

@ -26,3 +26,15 @@ KEYWORDS_MAP_PLANE.Luofu_ArtisanshipCommission.page = 'bottom'
KEYWORDS_MAP_PLANE.Luofu_FyxestrollGarden.page = 'bottom'
KEYWORDS_MAP_PLANE.Luofu_AlchemyCommission.page = 'bottom'
KEYWORDS_MAP_PLANE.Luofu_ScalegorgeWaterscape.page = 'bottom'
# Penacony
KEYWORDS_MAP_PLANE.Penacony_TheReverieReality.floors = ['F1', 'F2', 'F3']
KEYWORDS_MAP_PLANE.Penacony_GoldenHour.floors = ['F1', 'F2', 'F3']
KEYWORDS_MAP_PLANE.Penacony_TheReverieDreamscape.floors = ['F1', 'F2', 'F3']
KEYWORDS_MAP_PLANE.Penacony_DewlightPavilion.floors = ['F1', 'F2']
KEYWORDS_MAP_PLANE.Penacony_ClockStudiosThemePark.floors = ['F1', 'F2']
KEYWORDS_MAP_PLANE.Penacony_DreamfluxReef.floors = ['F1', 'F2']
KEYWORDS_MAP_PLANE.Penacony_DewlightPavilion.page = 'bottom'
KEYWORDS_MAP_PLANE.Penacony_ClockStudiosThemePark.page = 'bottom'
KEYWORDS_MAP_PLANE.Penacony_DreamfluxReef.page = 'bottom'
KEYWORDS_MAP_PLANE.Penacony_SoulGladScorchsandAuditionVenue.page = 'bottom'
KEYWORDS_MAP_PLANE.Penacony_PenaconyGrandTheater.page = 'bottom'

View File

@ -38,3 +38,10 @@ HimekoTrial__exit = RouteModel(
floor='F1',
position=(519.9, 361.5),
)
OrnamentExtraction__route = RouteModel(
name='OrnamentExtraction__route',
route='route.daily.OrnamentExtraction:route',
plane='Penacony_TheReverieReality',
floor='F1',
position=(245.3, 233.3),
)

View File

@ -0,0 +1,45 @@
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 ```
CHARACTER_EMPTY_OE = ButtonWrapper(
name='CHARACTER_EMPTY_OE',
share=Button(
file='./assets/share/ornament/combat/CHARACTER_EMPTY_OE.png',
area=(549, 513, 559, 537),
search=(525, 498, 824, 554),
color=(112, 112, 112),
button=(549, 513, 559, 537),
),
)
OCR_DOUBLE_EVENT_REMAIN_AT_OE = ButtonWrapper(
name='OCR_DOUBLE_EVENT_REMAIN_AT_OE',
share=Button(
file='./assets/share/ornament/combat/OCR_DOUBLE_EVENT_REMAIN_AT_OE.png',
area=(812, 577, 1248, 631),
search=(792, 557, 1268, 651),
color=(124, 103, 61),
button=(812, 577, 1248, 631),
),
)
SUPPORT_ADD = ButtonWrapper(
name='SUPPORT_ADD',
share=Button(
file='./assets/share/ornament/combat/SUPPORT_ADD.png',
area=(848, 518, 876, 537),
search=(828, 498, 896, 557),
color=(167, 200, 176),
button=(848, 518, 876, 537),
),
)
SUPPORT_DISMISS = ButtonWrapper(
name='SUPPORT_DISMISS',
share=Button(
file='./assets/share/ornament/combat/SUPPORT_DISMISS.png',
area=(853, 513, 872, 538),
search=(833, 493, 892, 558),
color=(135, 135, 135),
button=(853, 513, 872, 538),
),
)

View File

@ -0,0 +1,35 @@
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 ```
DU_MAIN_CHECK = ButtonWrapper(
name='DU_MAIN_CHECK',
share=Button(
file='./assets/share/ornament/ui/DU_MAIN_CHECK.png',
area=(774, 631, 796, 653),
search=(754, 611, 816, 673),
color=(149, 132, 98),
button=(774, 631, 796, 653),
),
)
DU_MODE_CHECK = ButtonWrapper(
name='DU_MODE_CHECK',
share=Button(
file='./assets/share/ornament/ui/DU_MODE_CHECK.png',
area=(125, 175, 142, 205),
search=(105, 155, 162, 225),
color=(117, 98, 63),
button=(125, 175, 142, 205),
),
)
DU_OE_SELECT_CHECK = ButtonWrapper(
name='DU_OE_SELECT_CHECK',
share=Button(
file='./assets/share/ornament/ui/DU_OE_SELECT_CHECK.png',
area=(1058, 24, 1084, 50),
search=(1038, 4, 1104, 70),
color=(196, 195, 193),
button=(1058, 24, 1084, 50),
),
)

225
tasks/ornament/combat.py Normal file
View File

@ -0,0 +1,225 @@
from module.base.decorator import run_once
from module.exception import RequestHumanTakeover
from module.logger import logger
from tasks.base.assets.assets_base_page import MAP_EXIT
from tasks.base.assets.assets_base_popup import POPUP_CANCEL
from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE
from tasks.combat.assets.assets_combat_support import COMBAT_SUPPORT_LIST
from tasks.dungeon.dungeon import Dungeon
from tasks.dungeon.state import DungeonState
from tasks.map.route.loader import RouteLoader
from tasks.map.route.route.daily import OrnamentExtraction__route
from tasks.ornament.assets.assets_ornament_combat import *
from tasks.ornament.assets.assets_ornament_ui import *
class OrnamentCombat(Dungeon, RouteLoader, DungeonState):
def combat_enter_from_map(self, skip_first_screenshot=True):
# Don't enter from map, UI too deep inside
# Enter from survival index instead
pass
def _combat_should_reenter(self):
# Never re-enter, can only enter from Survival_Index
return False
def get_double_event_remain_at_combat(self, button=OCR_DOUBLE_EVENT_REMAIN_AT_OE):
# Different position to OCR
return super().get_double_event_remain_at_combat(button)
def oe_leave(self, skip_first_screenshot=True):
self.interval_clear([COMBAT_PREPARE, MAP_EXIT])
logger.hr('OE leave')
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
exit_ = self.is_in_map_exit()
if not exit_ and self.is_in_main():
logger.info('OE left')
break
# Click
if self.handle_ui_back(DU_OE_SELECT_CHECK, interval=2):
continue
if self.handle_ui_back(DU_MODE_CHECK, interval=2):
continue
if self.handle_ui_back(DU_MAIN_CHECK, interval=2):
continue
if self.handle_ui_back(COMBAT_PREPARE, interval=2):
continue
if exit_ and self.is_in_map_exit(interval=3):
self.device.click(MAP_EXIT)
continue
if self.handle_popup_confirm():
continue
def support_set(self, support_character_name: str = "FirstCharacter"):
"""
Args:
support_character_name: Support character name
Returns:
bool: If clicked
Pages:
in: COMBAT_PREPARE
mid: COMBAT_SUPPORT_LIST
out: COMBAT_PREPARE
"""
logger.hr("Combat support")
self.interval_clear(SUPPORT_ADD)
skip_first_screenshot = True
selected_support = False
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.appear(SUPPORT_DISMISS):
return True
# Click
if self.appear(SUPPORT_ADD, interval=2):
self.device.click(SUPPORT_ADD)
self.interval_reset(SUPPORT_ADD)
continue
if self.appear(POPUP_CANCEL, interval=1):
logger.warning(
"selected identical character, trying select another")
self._cancel_popup()
self._select_next_support()
self.interval_reset(POPUP_CANCEL)
continue
if self.appear(COMBAT_SUPPORT_LIST, interval=2):
if not selected_support:
# In Ornament Extraction, first character isn't selected by default
if support_character_name == "FirstCharacter":
self._select_first()
else:
self._search_support(support_character_name) # Search support
selected_support = True
self.device.click(SUPPORT_ADD)
self.interval_reset(COMBAT_SUPPORT_LIST)
continue
def get_equivalent_stamina(self):
value = self.config.stored.Immersifier.value * 40
if self.config.Ornament_UseStamina:
value += self.config.stored.TrailblazePower.value
return value
def combat_get_trailblaze_power(self, expect_reduce=False, skip_first_screenshot=True) -> int:
"""
Args:
expect_reduce: Current value is supposed to be lower than the previous.
skip_first_screenshot:
Returns:
int: Equivalent stamina
Pages:
in: COMBAT_PREPARE or COMBAT_REPEAT
"""
before = self.get_equivalent_stamina()
after = before
for _ in range(3):
self.dungeon_update_stamina()
after = self.get_equivalent_stamina()
if expect_reduce:
if before > after:
break
else:
break
return after
def is_trailblaze_power_exhausted(self):
flag = self.get_equivalent_stamina() < self.combat_wave_cost
logger.attr('TrailblazePowerExhausted', flag)
return flag
def is_team_prepared(self) -> bool:
"""
Pages:
in: COMBAT_PREPARE
"""
slots = CHARACTER_EMPTY_OE.match_multi_template(self.device.image)
slots = 4 - len(slots)
logger.attr('TeamSlotsPrepared', slots)
return slots > 0
def combat_prepare(self, team=1, support_character: str = None):
"""
Args:
team: 1 to 6.
support_character: Support character name
Returns:
bool: True
Pages:
in: COMBAT_PREPARE
out: is_in_main
"""
@run_once
def check_team_prepare():
if not self.is_team_prepared():
logger.error(f'Please prepare your team in Ornament Extraction')
raise RequestHumanTakeover
logger.hr('Combat prepare')
skip_first_screenshot = True
if support_character:
# Block COMBAT_TEAM_PREPARE before support set
support_set = False
else:
support_set = True
logger.info([support_character, support_set])
trial = 0
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.is_in_main():
logger.info('Combat map entered')
self.device.screenshot_interval_set()
break
if self.is_combat_executing():
self.device.screenshot_interval_set()
return True
# Relics full
# Clicking between COMBAT_PREPARE and COMBAT_TEAM_PREPARE
if trial > 5:
logger.critical('Failed to enter dungeon after 5 trial, probably because relics are full')
raise RequestHumanTakeover
if self.appear(SUPPORT_ADD):
check_team_prepare()
# Click
if support_character and self.appear(SUPPORT_ADD, interval=2):
self.support_set(support_character)
self.interval_reset(SUPPORT_ADD)
support_set = True
continue
if support_set and self.appear(COMBAT_PREPARE, interval=5):
# Long loading after COMBAT_PREPARE
self.device.click(COMBAT_PREPARE)
self.device.screenshot_interval_set('combat')
trial += 1
continue
if self.handle_popup_confirm():
continue
self.route_run(OrnamentExtraction__route)
return True

105
tasks/ornament/ornament.py Normal file
View File

@ -0,0 +1,105 @@
from datetime import timedelta
from module.config.stored.classes import now
from module.config.utils import DEFAULT_TIME
from module.exception import ScriptError
from module.logger import logger
from tasks.dungeon.assets.assets_dungeon_ui_rogue import DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE
from tasks.dungeon.keywords import DungeonList
from tasks.ornament.combat import OrnamentCombat
class Ornament(OrnamentCombat):
# Reuse support, cause exit and re-enter is so time-wasting in Divergent Universe
support_once = False
def _dungeon_wait_until_dungeon_list_loaded(self, skip_first_screenshot=True):
result = super()._dungeon_wait_until_dungeon_list_loaded(skip_first_screenshot)
# Check save file before entering
if self.image_color_count(
DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE,
color=(195, 89, 79), threshold=221, count=1000,
):
logger.error(
'Divergent Universe save unavailable, '
'please clear Divergent Universe once before running Ornament Extraction'
)
self.config.task_delay(server_update=True)
self.config.task_stop()
# Always update double rogue
record = self.config.stored.DungeonDouble.time
if now() - record < timedelta(seconds=5):
# Updated just now
pass
else:
if self.has_double_relic_event():
rogue = self.get_double_rogue_remain()
self.config.stored.DungeonDouble.rogue = rogue
else:
logger.info('No double rogue event')
# Check stamina
logger.info('Check stamina')
stamina = self.combat_get_trailblaze_power()
if self.config.Ornament_UseStamina:
if stamina < self.combat_wave_cost:
logger.info('Current trailblaze power is not enough for a run')
self.delay_dungeon_task(self.dungeon)
self.config.task_stop()
elif self.config.stored.DungeonDouble.rogue > 0:
if stamina < self.combat_wave_cost:
logger.info('Doing double rogue, current trailblaze power is not enough for a run')
self.delay_dungeon_task(self.dungeon)
self.config.task_stop()
else:
if self.config.stored.Immersifier.value <= 0:
logger.info('Current immersifier is not enough for a run')
self.config.task_delay(server_update=True)
self.config.task_stop()
return result
def run(self):
self.config.update_battle_pass_quests()
self.config.update_daily_quests()
# self.check_synthesize()
self.called_daily_support = False
self.achieved_daily_quest = False
self.achieved_weekly_quest = False
self.running_double = False
self.daily_quests = self.config.stored.DailyQuest.load_quests()
self.weekly_quests = self.config.stored.BattlePassWeeklyQuest.load_quests()
self.update_double_event_record()
# During double event, do it first
if self.config.stored.DungeonDouble.calyx or self.config.stored.DungeonDouble.relic:
logger.info('During double calyx or relic event, delay Ornament')
future = self.config.cross_get('Dungeon.Scheduler.NextRun', default=DEFAULT_TIME)
future = future + timedelta(minutes=1)
with self.config.multi_set():
self.config.task_delay(target=future)
self.config.task_stop()
# Run
dungeon = DungeonList.find(self.config.Ornament_Dungeon)
self.support_once = False
self.combat_wave_cost = 40
self.dungeon = dungeon
if self.config.Ornament_UseStamina:
# No limit
self.dungeon_run(dungeon, wave_limit=0)
# Stamina should have exhausted in dungeon_run
raise ScriptError('Ornament finished but stamina was not exhausted')
elif self.config.stored.DungeonDouble.rogue > 0:
# Limited in double events
self.running_double = True
self.dungeon_run(dungeon, wave_limit=self.config.stored.DungeonDouble.rogue)
self.running_double = False
self.dungeon_stamina_delay(dungeon)
else:
# Use immersifier only, wave limited in _dungeon_wait_until_dungeon_list_loaded
self.dungeon_run(dungeon, wave_limit=0)
self.dungeon_stamina_delay(dungeon)

View File

@ -0,0 +1,106 @@
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 ```
ENHANCE_CHECK = ButtonWrapper(
name='ENHANCE_CHECK',
cn=Button(
file='./assets/cn/relics/ui/ENHANCE_CHECK.png',
area=(1134, 645, 1185, 670),
search=(1114, 625, 1205, 690),
color=(179, 180, 180),
button=(1134, 645, 1185, 670),
),
en=Button(
file='./assets/en/relics/ui/ENHANCE_CHECK.png',
area=(1115, 646, 1204, 671),
search=(1095, 626, 1224, 691),
color=(183, 184, 184),
button=(1115, 646, 1204, 671),
),
)
ENHANCE_FILTER = ButtonWrapper(
name='ENHANCE_FILTER',
share=Button(
file='./assets/share/relics/ui/ENHANCE_FILTER.png',
area=(159, 650, 185, 676),
search=(139, 630, 205, 696),
color=(193, 195, 196),
button=(159, 650, 185, 676),
),
)
ENHANCE_GOTO_SALVAGE = ButtonWrapper(
name='ENHANCE_GOTO_SALVAGE',
share=Button(
file='./assets/share/relics/ui/ENHANCE_GOTO_SALVAGE.png',
area=(685, 653, 705, 673),
search=(665, 633, 725, 693),
color=(140, 142, 143),
button=(685, 653, 705, 673),
),
)
FILTER_CONFIRM = ButtonWrapper(
name='FILTER_CONFIRM',
cn=Button(
file='./assets/cn/relics/ui/FILTER_CONFIRM.png',
area=(1103, 651, 1151, 677),
search=(1083, 631, 1171, 697),
color=(180, 180, 180),
button=(1103, 651, 1151, 677),
),
en=Button(
file='./assets/en/relics/ui/FILTER_CONFIRM.png',
area=(1081, 652, 1172, 677),
search=(1061, 632, 1192, 697),
color=(189, 189, 189),
button=(1081, 652, 1172, 677),
),
)
FILTER_RESET = ButtonWrapper(
name='FILTER_RESET',
cn=Button(
file='./assets/cn/relics/ui/FILTER_RESET.png',
area=(887, 652, 936, 675),
search=(867, 632, 956, 695),
color=(160, 160, 160),
button=(887, 652, 936, 675),
),
en=Button(
file='./assets/en/relics/ui/FILTER_RESET.png',
area=(879, 652, 946, 677),
search=(859, 632, 966, 697),
color=(185, 185, 185),
button=(879, 652, 946, 677),
),
)
SALVAGE_CHECK_OFF = ButtonWrapper(
name='SALVAGE_CHECK_OFF',
share=Button(
file='./assets/share/relics/ui/SALVAGE_CHECK_OFF.png',
area=(1067, 646, 1091, 670),
search=(1002, 641, 1143, 675),
color=(54, 55, 48),
button=(1067, 646, 1091, 670),
),
)
SALVAGE_CHECK_ON = ButtonWrapper(
name='SALVAGE_CHECK_ON',
share=Button(
file='./assets/share/relics/ui/SALVAGE_CHECK_ON.png',
area=(1067, 646, 1091, 670),
search=(1002, 641, 1143, 675),
color=(124, 116, 99),
button=(1067, 646, 1091, 670),
),
)
SALVAGE_FILTER = ButtonWrapper(
name='SALVAGE_FILTER',
share=Button(
file='./assets/share/relics/ui/SALVAGE_FILTER.png',
area=(441, 645, 467, 671),
search=(421, 625, 487, 691),
color=(193, 194, 195),
button=(441, 645, 467, 671),
),
)

257
tasks/relics/ui.py Normal file
View File

@ -0,0 +1,257 @@
from module.logger import logger
from tasks.base.assets.assets_base_page import CLOSE
from tasks.base.page import page_item
from tasks.item.keywords import KEYWORDS_ITEM_TAB
from tasks.item.ui import ItemUI
from tasks.relics.assets.assets_relics_ui import *
class RelicsUI(ItemUI):
def is_in_relics_enhance(self, interval=0):
if self.appear(ENHANCE_CHECK, interval=interval):
return True
return False
def is_in_relics_salvage(self, interval=0):
if self.appear(SALVAGE_CHECK_OFF, interval=interval):
return True
if self.appear(SALVAGE_CHECK_ON, interval=interval):
return True
return False
def is_filter_active(self, button, interval=0) -> bool:
"""
Args:
button: ENHANCE_FILTER or SALVAGE_FILTER
interval:
Returns:
bool:
"""
self.device.stuck_record_add(button)
if interval and not self.interval_is_reached(button, interval=interval):
return False
appear = self.image_color_count(button, color=(242, 158, 56), threshold=180, count=20)
if appear and interval:
self.interval_reset(button, interval=interval)
return appear
def is_filter_appear(self, button, interval=0) -> bool:
if self.appear(button, interval=interval):
return True
if self.is_filter_active(button, interval=interval):
return True
return False
def is_filter_opened(self, interval=0) -> bool:
return self.appear(FILTER_CONFIRM, interval=interval)
def handle_filter_confirm(self, button, interval=2) -> bool:
"""
Confirm filter aside
Args:
button: ENHANCE_FILTER or SALVAGE_FILTER
interval:
Returns:
bool: If clicked
"""
if self.appear(button):
if self.appear_then_click(FILTER_CONFIRM, interval=interval):
self.interval_clear(FILTER_RESET)
return True
return False
def handle_filter_reset(self, button, interval=2):
"""
Reset filter aside
Args:
button: ENHANCE_FILTER or SALVAGE_FILTER
interval:
Returns:
bool: If clicked
"""
if self.is_filter_active(button):
if self.appear_then_click(FILTER_RESET, interval=interval):
self.interval_clear(FILTER_CONFIRM)
return True
return False
def handle_filter_close(self, opened=None, interval=2):
"""
Args:
opened: ENHANCE_FILTER or SALVAGE_FILTER
Keep this filter opened
interval:
Returns:
bool: If clicked
"""
# If filter opened, reset it
if self.handle_filter_reset(SALVAGE_FILTER, interval=interval):
self.interval_reset([SALVAGE_FILTER], interval=interval)
return True
if self.handle_filter_reset(ENHANCE_FILTER, interval=interval):
self.interval_reset([ENHANCE_FILTER], interval=interval)
return True
# If filter opened, close it
if opened != SALVAGE_FILTER:
if self.handle_filter_confirm(SALVAGE_FILTER, interval=interval):
self.interval_clear([FILTER_CONFIRM, SALVAGE_CHECK_OFF, SALVAGE_CHECK_ON], interval=interval)
return True
if opened != ENHANCE_FILTER:
if self.handle_filter_confirm(ENHANCE_FILTER, interval=interval):
self.interval_clear([FILTER_CONFIRM, ENHANCE_CHECK], interval=interval)
return True
# If filter activated, open it
if self.is_filter_active(SALVAGE_FILTER, interval=interval):
logger.info(f'is_filter_active -> {SALVAGE_FILTER}')
self.device.click(SALVAGE_FILTER)
self.interval_reset([FILTER_CONFIRM, SALVAGE_CHECK_OFF, SALVAGE_CHECK_ON], interval=interval)
return True
if self.is_filter_active(ENHANCE_FILTER, interval=interval):
logger.info(f'is_filter_active -> {ENHANCE_FILTER}')
self.device.click(ENHANCE_FILTER)
self.interval_reset([FILTER_CONFIRM, ENHANCE_CHECK], interval=interval)
return True
return False
def relics_goto_salvage_filter(self, skip_first_screenshot=True):
"""
Pages:
in: page_item, any subpage of relics
out: salvage filter, with filter reset
"""
logger.info('Relics goto salvage filter')
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.is_filter_opened() and self.appear(SALVAGE_FILTER):
logger.info('Arrive SALVAGE_FILTER')
break
# Close filter
if self.handle_filter_close(opened=SALVAGE_FILTER):
continue
# Open filter
if not self.is_filter_opened():
# if self.is_filter_appear(ENHANCE_FILTER, interval=2):
# self.device.click(ENHANCE_FILTER)
# continue
if self.is_filter_appear(SALVAGE_FILTER, interval=2):
self.device.click(SALVAGE_FILTER)
continue
# UI switch
if self.is_in_relics_enhance(interval=2):
self.device.click(ENHANCE_GOTO_SALVAGE)
continue
# if self.is_in_relics_salvage(interval=2):
# logger.info(f'is_in_relics_salvage -> {CLOSE}')
# self.device.click(CLOSE)
# continue
def relics_goto_salvage(self, skip_first_screenshot=True):
"""
Pages:
in: page_item, any subpage of relics
out: salvage, with filter reset
"""
logger.info('Relics goto salvage')
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.is_in_relics_salvage() and self.appear(SALVAGE_FILTER):
logger.info('Arrive is_in_relics_salvage')
break
# Close filter
if self.handle_filter_close():
continue
# UI switch
if self.is_in_relics_enhance(interval=2):
self.device.click(ENHANCE_GOTO_SALVAGE)
continue
def relics_goto_enhance_filter(self, skip_first_screenshot=True):
"""
Pages:
in: page_item, any subpage of relics
out: enhance filter, with filter reset
"""
logger.info('Relics goto enhance filter')
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.is_filter_opened() and self.appear(ENHANCE_FILTER):
logger.info('Arrive ENHANCE_FILTER')
break
# Close filter
if self.handle_filter_close(opened=ENHANCE_FILTER):
continue
# Open filter
if not self.is_filter_opened():
if self.is_filter_appear(ENHANCE_FILTER, interval=2):
self.device.click(ENHANCE_FILTER)
continue
# UI switch
if self.is_in_relics_salvage(interval=2):
logger.info(f'is_in_relics_salvage -> {CLOSE}')
self.device.click(CLOSE)
continue
def relics_goto_enhance(self, skip_first_screenshot=True):
"""
Pages:
in: page_item, any subpage of relics
out: enhance, with filter reset
"""
logger.info('Relics goto enhance')
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.is_in_relics_enhance() and self.appear(ENHANCE_FILTER):
logger.info('Arrive is_in_relics_enhance')
break
# Close filter
if self.handle_filter_close():
continue
# UI switch
if self.is_in_relics_salvage(interval=2):
logger.info(f'is_in_relics_salvage -> {CLOSE}')
self.device.click(CLOSE)
continue
def ui_goto_relics(self):
self.ui_ensure(page_item)
self.item_goto(KEYWORDS_ITEM_TAB.Relics, wait_until_stable=False)
if __name__ == '__main__':
self = RelicsUI('src')
self.device.screenshot()
self.relics_goto_salvage_filter()

View File

@ -353,6 +353,8 @@ class RogueEntry(RouteBase, RogueRewardHandler, RoguePathHandler, DungeonRogueUI
f'RogueWorld_DoubleEvent={self.config.RogueWorld_DoubleEvent}, '
f'RogueWorld_WeeklyFarming={self.config.RogueWorld_WeeklyFarming}, '
f'RogueDebug_DebugMode={self.config.RogueDebug_DebugMode}')
ornament = self.config.is_task_enabled('Ornament')
logger.info(f'Ornament: {ornament}')
# This shouldn't happen
if self.config.RogueWorld_UseStamina and not self.config.RogueWorld_UseImmersifier:
logger.error('Invalid rogue reward settings')
@ -376,6 +378,9 @@ class RogueEntry(RouteBase, RogueRewardHandler, RoguePathHandler, DungeonRogueUI
if self.config.RogueWorld_UseImmersifier and self.config.stored.Immersifier.value > 0:
logger.info(
'Reached weekly point limit but still have immersifiers left, continue to use them')
if ornament:
logger.info('Ornament enabled, skip farming rogue')
raise RogueReachedWeeklyPointLimit
elif self.config.RogueWorld_WeeklyFarming and not self.config.stored.SimulatedUniverseFarm.is_full():
logger.info(
'Reached weekly point limit but still continue to farm materials')

View File

@ -8,7 +8,7 @@ import fs from 'fs';
*/
const getAlasABSPath = (
files: string[] = ['**/config/deploy.yaml', '**/config/deploy.template.yaml'],
rootName: string | string[] = ['AzurLaneAutoScript', 'Alas', 'StarRailCopilot'],
rootName: string | string[] = ['AzurLaneAutoScript', 'Alas', 'StarRailCopilot', 'SRC'],
) => {
const path = require('path');
const sep = path.sep;
@ -53,7 +53,6 @@ const getAlasABSPath = (
const appAbsPathArr = appAbsPath.split(sep);
let flag = false;
while (step > 0 && !flag) {
appAbsPathArr.pop();
const entries = fg.sync(files, {
dot: true,
cwd: appAbsPathArr.join(sep) as string,
@ -63,6 +62,7 @@ const getAlasABSPath = (
alasABSPath = appAbsPathArr.join(sep);
}
step--;
appAbsPathArr.pop();
}
}

View File

@ -0,0 +1,4 @@
export const primaryColor = '#C079F2';
export const darkMode = 'light';