Merge pull request #560 from LmeSzinc/dev
Add Ornament Extraction task | 增加饰品提取任务
@ -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)。
|
||||
|
||||
|
@ -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).
|
||||
|
||||
|
@ -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).
|
||||
|
||||
|
BIN
assets/cn/relics/ui/ENHANCE_CHECK.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
assets/cn/relics/ui/FILTER_CONFIRM.png
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
assets/cn/relics/ui/FILTER_RESET.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
assets/en/relics/ui/ENHANCE_CHECK.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
assets/en/relics/ui/FILTER_CONFIRM.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
assets/en/relics/ui/FILTER_RESET.png
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
assets/share/combat/support/FIRST_CHARACTER.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 11 KiB |
BIN
assets/share/ornament/combat/CHARACTER_EMPTY_OE.SEARCH.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
assets/share/ornament/combat/CHARACTER_EMPTY_OE.png
Normal file
After Width: | Height: | Size: 6.1 KiB |
BIN
assets/share/ornament/combat/OCR_DOUBLE_EVENT_REMAIN_AT_OE.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
assets/share/ornament/combat/SUPPORT_ADD.png
Normal file
After Width: | Height: | Size: 6.7 KiB |
BIN
assets/share/ornament/combat/SUPPORT_DISMISS.png
Normal file
After Width: | Height: | Size: 6.5 KiB |
BIN
assets/share/ornament/ui/DU_MAIN_CHECK.png
Normal file
After Width: | Height: | Size: 6.2 KiB |
BIN
assets/share/ornament/ui/DU_MODE_CHECK.png
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
assets/share/ornament/ui/DU_OE_SELECT_CHECK.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
assets/share/relics/ui/ENHANCE_FILTER.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
assets/share/relics/ui/ENHANCE_GOTO_SALVAGE.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
assets/share/relics/ui/SALVAGE_CHECK_OFF.SEARCH.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
assets/share/relics/ui/SALVAGE_CHECK_OFF.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
assets/share/relics/ui/SALVAGE_CHECK_ON.SEARCH.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
assets/share/relics/ui/SALVAGE_CHECK_ON.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
assets/share/relics/ui/SALVAGE_FILTER.png
Normal file
After Width: | Height: | Size: 6.2 KiB |
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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": {
|
||||
|
@ -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:
|
||||
|
@ -24,7 +24,8 @@
|
||||
"page": "setting",
|
||||
"tasks": [
|
||||
"Weekly",
|
||||
"Rogue"
|
||||
"Rogue",
|
||||
"Ornament"
|
||||
]
|
||||
},
|
||||
"Tool": {
|
||||
|
@ -68,3 +68,7 @@ Weekly:
|
||||
DungeonSupport:
|
||||
Use:
|
||||
option: [ always_use, do_not_use ]
|
||||
Ornament:
|
||||
DungeonSupport:
|
||||
Use:
|
||||
option: [ when_daily, always_use ]
|
||||
|
@ -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",
|
||||
|
@ -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 ====================
|
||||
|
||||
|
@ -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
|
||||
|
@ -10,7 +10,7 @@ class ManualConfig:
|
||||
|
||||
SCHEDULER_PRIORITY = """
|
||||
Restart
|
||||
> Weekly > Dungeon > Assignment
|
||||
> Weekly > Ornament > Dungeon > Assignment
|
||||
> BattlePass > DailyQuest
|
||||
> Freebies > DataUpdate
|
||||
> Rogue
|
||||
|
@ -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)
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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": "剧情连点器",
|
||||
|
@ -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": "劇情連點器",
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
@ -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'
|
||||
|
||||
|
@ -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}",
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
21
route/daily/OrnamentExtraction.py
Normal 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
@ -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)
|
||||
|
@ -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(' ', '')
|
||||
|
||||
|
@ -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=[
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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),
|
||||
),
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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(
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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'
|
||||
|
@ -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),
|
||||
)
|
||||
|
45
tasks/ornament/assets/assets_ornament_combat.py
Normal 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),
|
||||
),
|
||||
)
|
35
tasks/ornament/assets/assets_ornament_ui.py
Normal 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
@ -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
@ -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)
|
106
tasks/relics/assets/assets_relics_ui.py
Normal 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
@ -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()
|
@ -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')
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
4
webapp/packages/renderer/build/config/themeConfig.ts
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
export const primaryColor = '#C079F2';
|
||||
export const darkMode = 'light';
|
||||
|