Merge pull request #626 from LmeSzinc/dev

Bug fix
This commit is contained in:
LmeSzinc 2024-09-11 00:23:47 +08:00 committed by GitHub
commit 75da44f910
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
54 changed files with 3087 additions and 1594 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
assets/character/Moze.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -65,6 +65,8 @@
"Item_IPC_Work_Permit": {}, "Item_IPC_Work_Permit": {},
"Item_Raging_Heart": {}, "Item_Raging_Heart": {},
"Item_Dream_Fridge": {}, "Item_Dream_Fridge": {},
"Item_Nail_of_the_Beast_Coffin": {},
"Item_A_Glass_of_the_Besotted_Era": {},
"Item_Dream_Flamer": {}, "Item_Dream_Flamer": {},
"Item_Worldbreaker_Blade": {}, "Item_Worldbreaker_Blade": {},
"Item_Arrow_of_the_Starchaser": {}, "Item_Arrow_of_the_Starchaser": {},
@ -86,6 +88,7 @@
"Item_Regret_of_Infinite_Ochema": {}, "Item_Regret_of_Infinite_Ochema": {},
"Item_Past_Evils_of_the_Borehole_Planet_Disaster": {}, "Item_Past_Evils_of_the_Borehole_Planet_Disaster": {},
"Item_Lost_Echo_of_the_Shared_Wish": {}, "Item_Lost_Echo_of_the_Shared_Wish": {},
"Item_Auspice_Sliver": {},
"Item_Squirming_Core": {}, "Item_Squirming_Core": {},
"Item_Conqueror_Will": {}, "Item_Conqueror_Will": {},
"Item_Silvermane_Medal": {}, "Item_Silvermane_Medal": {},

View File

@ -73,6 +73,12 @@ class GenerateDungeonList(GenerateKeyword):
# Add plane suffix # Add plane suffix
from tasks.map.keywords import MapPlane from tasks.map.keywords import MapPlane
if text.startswith('Calyx_Golden'):
plane = MapPlane.find_plane_id(keyword['plane_id'])
if plane is not None:
text = f'{text}_{plane.world.name}'
else:
text = f'{text}_unknown_world'
if text.startswith('Calyx_Crimson'): if text.startswith('Calyx_Crimson'):
plane = MapPlane.find_plane_id(keyword['plane_id']) plane = MapPlane.find_plane_id(keyword['plane_id'])
if plane is not None: if plane is not None:
@ -110,16 +116,33 @@ class GenerateDungeonList(GenerateKeyword):
dungeons = [d for d in dungeons if not condition(d)] dungeons = [d for d in dungeons if not condition(d)]
dungeons = calyx + dungeons dungeons = calyx + dungeons
# Reverse Divergent_Universe # 2024.09.10, v2.5, add genre prefix
start = 0 for dungeon in dungeons:
end = 0 if 230 <= dungeon['dungeon_id'] < 1000:
for index, dungeon in enumerate(dungeons): dungeon['name'] = 'Divergent_Universe_' + dungeon['name']
if dungeon['name'].startswith('Divergent_Universe'): if 100 < dungeon['dungeon_id'] < 200:
if start == 0: dungeon['name'] = 'Simulated_Universe_' + dungeon['name']
start = index
end = index + 1 # Reverse dungeon list, latest at top
if start > 0 and end > 0: def reverse_on_name(d, prefix):
dungeons = dungeons[:start] + dungeons[start:end][::-1] + dungeons[end:] start = 0
end = 0
for index, dungeon in enumerate(d):
if dungeon['name'].startswith(prefix):
if start == 0:
start = index
end = index + 1
if start > 0 and end > 0:
d = d[:start] + d[start:end][::-1] + d[end:]
return d
dungeons = reverse_on_name(dungeons, 'Divergent_Universe')
dungeons = reverse_on_name(dungeons, 'Cavern_of_Corrosion')
dungeons = reverse_on_name(dungeons, 'Echo_of_War')
# Reverse Calyx_Golden, sort by world
# Poor sort
dungeons[0:3], dungeons[6:9] = dungeons[6:9], dungeons[0:3]
# Re-sort ID # Re-sort ID
self.keyword_index = 0 self.keyword_index = 0

View File

@ -340,6 +340,18 @@
"display": "display", "display": "display",
"stored": "StoredPlanner" "stored": "StoredPlanner"
}, },
"Item_Nail_of_the_Beast_Coffin": {
"type": "planner",
"value": {},
"display": "display",
"stored": "StoredPlanner"
},
"Item_A_Glass_of_the_Besotted_Era": {
"type": "planner",
"value": {},
"display": "display",
"stored": "StoredPlanner"
},
"Item_Dream_Flamer": { "Item_Dream_Flamer": {
"type": "planner", "type": "planner",
"value": {}, "value": {},
@ -466,6 +478,12 @@
"display": "display", "display": "display",
"stored": "StoredPlanner" "stored": "StoredPlanner"
}, },
"Item_Auspice_Sliver": {
"type": "planner",
"value": {},
"display": "display",
"stored": "StoredPlanner"
},
"Item_Squirming_Core": { "Item_Squirming_Core": {
"type": "planner", "type": "planner",
"value": {}, "value": {},
@ -554,8 +572,10 @@
"Stagnant_Shadow_Nectar", "Stagnant_Shadow_Nectar",
"Stagnant_Shadow_Fulmination", "Stagnant_Shadow_Fulmination",
"Stagnant_Shadow_Doom", "Stagnant_Shadow_Doom",
"Stagnant_Shadow_Mechwolf",
"Stagnant_Shadow_Gust", "Stagnant_Shadow_Gust",
"Stagnant_Shadow_Celestial", "Stagnant_Shadow_Celestial",
"Stagnant_Shadow_Gloam",
"Stagnant_Shadow_Quanta", "Stagnant_Shadow_Quanta",
"Stagnant_Shadow_Abomination", "Stagnant_Shadow_Abomination",
"Stagnant_Shadow_Roast", "Stagnant_Shadow_Roast",
@ -662,6 +682,7 @@
"DanHeng", "DanHeng",
"DanHengImbibitorLunae", "DanHengImbibitorLunae",
"DrRatio", "DrRatio",
"Feixiao",
"Firefly", "Firefly",
"FuXuan", "FuXuan",
"Gallagher", "Gallagher",
@ -683,6 +704,7 @@
"March7thPreservation", "March7thPreservation",
"March7thTheHunt", "March7thTheHunt",
"Misha", "Misha",
"Moze",
"Natasha", "Natasha",
"Pela", "Pela",
"Qingque", "Qingque",
@ -795,6 +817,7 @@
"type": "select", "type": "select",
"value": "Divergent_Universe_Eternal_Comedy", "value": "Divergent_Universe_Eternal_Comedy",
"option": [ "option": [
"Divergent_Universe_Famished_Worker",
"Divergent_Universe_Eternal_Comedy", "Divergent_Universe_Eternal_Comedy",
"Divergent_Universe_To_Sweet_Dreams", "Divergent_Universe_To_Sweet_Dreams",
"Divergent_Universe_Pouring_Blades", "Divergent_Universe_Pouring_Blades",
@ -858,6 +881,7 @@
"DanHeng", "DanHeng",
"DanHengImbibitorLunae", "DanHengImbibitorLunae",
"DrRatio", "DrRatio",
"Feixiao",
"Firefly", "Firefly",
"FuXuan", "FuXuan",
"Gallagher", "Gallagher",
@ -879,6 +903,7 @@
"March7thPreservation", "March7thPreservation",
"March7thTheHunt", "March7thTheHunt",
"Misha", "Misha",
"Moze",
"Natasha", "Natasha",
"Pela", "Pela",
"Qingque", "Qingque",
@ -1345,7 +1370,8 @@
"Echo_of_War_End_of_the_Eternal_Freeze", "Echo_of_War_End_of_the_Eternal_Freeze",
"Echo_of_War_Divine_Seed", "Echo_of_War_Divine_Seed",
"Echo_of_War_Borehole_Planet_Old_Crater", "Echo_of_War_Borehole_Planet_Old_Crater",
"Echo_of_War_Salutations_of_Ashen_Dreams" "Echo_of_War_Salutations_of_Ashen_Dreams",
"Echo_of_War_Inner_Beast_Battlefield"
] ]
}, },
"Team": { "Team": {
@ -1392,6 +1418,7 @@
"DanHeng", "DanHeng",
"DanHengImbibitorLunae", "DanHengImbibitorLunae",
"DrRatio", "DrRatio",
"Feixiao",
"Firefly", "Firefly",
"FuXuan", "FuXuan",
"Gallagher", "Gallagher",
@ -1413,6 +1440,7 @@
"March7thPreservation", "March7thPreservation",
"March7thTheHunt", "March7thTheHunt",
"Misha", "Misha",
"Moze",
"Natasha", "Natasha",
"Pela", "Pela",
"Qingque", "Qingque",

View File

@ -343,6 +343,28 @@
"order": 0, "order": 0,
"color": "#777777" "color": "#777777"
}, },
"Item_Nail_of_the_Beast_Coffin": {
"name": "Item_Nail_of_the_Beast_Coffin",
"path": "Dungeon.Planner.Item_Nail_of_the_Beast_Coffin",
"i18n": "Planner.Item_Nail_of_the_Beast_Coffin.name",
"stored": "StoredPlanner",
"attrs": {
"time": "2020-01-01 00:00:00"
},
"order": 0,
"color": "#777777"
},
"Item_A_Glass_of_the_Besotted_Era": {
"name": "Item_A_Glass_of_the_Besotted_Era",
"path": "Dungeon.Planner.Item_A_Glass_of_the_Besotted_Era",
"i18n": "Planner.Item_A_Glass_of_the_Besotted_Era.name",
"stored": "StoredPlanner",
"attrs": {
"time": "2020-01-01 00:00:00"
},
"order": 0,
"color": "#777777"
},
"Item_Dream_Flamer": { "Item_Dream_Flamer": {
"name": "Item_Dream_Flamer", "name": "Item_Dream_Flamer",
"path": "Dungeon.Planner.Item_Dream_Flamer", "path": "Dungeon.Planner.Item_Dream_Flamer",
@ -574,6 +596,17 @@
"order": 0, "order": 0,
"color": "#777777" "color": "#777777"
}, },
"Item_Auspice_Sliver": {
"name": "Item_Auspice_Sliver",
"path": "Dungeon.Planner.Item_Auspice_Sliver",
"i18n": "Planner.Item_Auspice_Sliver.name",
"stored": "StoredPlanner",
"attrs": {
"time": "2020-01-01 00:00:00"
},
"order": 0,
"color": "#777777"
},
"Item_Squirming_Core": { "Item_Squirming_Core": {
"name": "Item_Squirming_Core", "name": "Item_Squirming_Core",
"path": "Dungeon.Planner.Item_Squirming_Core", "path": "Dungeon.Planner.Item_Squirming_Core",

View File

@ -41,7 +41,7 @@ class GeneratedConfig:
Optimization_WhenTaskQueueEmpty = 'goto_main' # stay_there, goto_main, close_game Optimization_WhenTaskQueueEmpty = 'goto_main' # stay_there, goto_main, close_game
# Group `Dungeon` # 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_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_Mechwolf, Stagnant_Shadow_Gust, Stagnant_Shadow_Celestial, Stagnant_Shadow_Gloam, 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 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
Dungeon_NameAtDoubleRelic = 'Cavern_of_Corrosion_Path_of_Providence' # 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_NameAtDoubleRelic = 'Cavern_of_Corrosion_Path_of_Providence' # 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_Team = 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9 Dungeon_Team = 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9
@ -53,7 +53,7 @@ class GeneratedConfig:
# Group `DungeonSupport` # Group `DungeonSupport`
DungeonSupport_Use = 'when_daily' # always_use, when_daily, do_not_use DungeonSupport_Use = 'when_daily' # always_use, when_daily, do_not_use
DungeonSupport_Character = 'FirstCharacter' # 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, Jade, Jiaoqiu, JingYuan, Jingliu, Kafka, Luka, Luocha, Lynx, March7thPreservation, March7thTheHunt, Misha, Natasha, Pela, Qingque, Robin, RuanMei, Sampo, Seele, Serval, SilverWolf, Sparkle, Sushang, Tingyun, TopazNumby, TrailblazerDestruction, TrailblazerHarmony, TrailblazerPreservation, Welt, Xueyi, Yanqing, Yukong, Yunli DungeonSupport_Character = 'FirstCharacter' # FirstCharacter, Acheron, Argenti, Arlan, Asta, Aventurine, Bailu, BlackSwan, Blade, Boothill, Bronya, Clara, DanHeng, DanHengImbibitorLunae, DrRatio, Feixiao, Firefly, FuXuan, Gallagher, Gepard, Guinaifen, Hanya, Herta, Himeko, Hook, Huohuo, Jade, Jiaoqiu, JingYuan, Jingliu, Kafka, Luka, Luocha, Lynx, March7thPreservation, March7thTheHunt, Misha, Moze, Natasha, Pela, Qingque, Robin, RuanMei, Sampo, Seele, Serval, SilverWolf, Sparkle, Sushang, Tingyun, TopazNumby, TrailblazerDestruction, TrailblazerHarmony, TrailblazerPreservation, Welt, Xueyi, Yanqing, Yukong, Yunli
# Group `DungeonStorage` # Group `DungeonStorage`
DungeonStorage_TrailblazePower = {} DungeonStorage_TrailblazePower = {}
@ -90,6 +90,8 @@ class GeneratedConfig:
Planner_Item_IPC_Work_Permit = {} Planner_Item_IPC_Work_Permit = {}
Planner_Item_Raging_Heart = {} Planner_Item_Raging_Heart = {}
Planner_Item_Dream_Fridge = {} Planner_Item_Dream_Fridge = {}
Planner_Item_Nail_of_the_Beast_Coffin = {}
Planner_Item_A_Glass_of_the_Besotted_Era = {}
Planner_Item_Dream_Flamer = {} Planner_Item_Dream_Flamer = {}
Planner_Item_Worldbreaker_Blade = {} Planner_Item_Worldbreaker_Blade = {}
Planner_Item_Arrow_of_the_Starchaser = {} Planner_Item_Arrow_of_the_Starchaser = {}
@ -111,6 +113,7 @@ class GeneratedConfig:
Planner_Item_Regret_of_Infinite_Ochema = {} Planner_Item_Regret_of_Infinite_Ochema = {}
Planner_Item_Past_Evils_of_the_Borehole_Planet_Disaster = {} Planner_Item_Past_Evils_of_the_Borehole_Planet_Disaster = {}
Planner_Item_Lost_Echo_of_the_Shared_Wish = {} Planner_Item_Lost_Echo_of_the_Shared_Wish = {}
Planner_Item_Auspice_Sliver = {}
Planner_Item_Squirming_Core = {} Planner_Item_Squirming_Core = {}
Planner_Item_Conqueror_Will = {} Planner_Item_Conqueror_Will = {}
Planner_Item_Silvermane_Medal = {} Planner_Item_Silvermane_Medal = {}
@ -121,7 +124,7 @@ class GeneratedConfig:
Planner_Item_Shards_of_Desires = {} Planner_Item_Shards_of_Desires = {}
# Group `Weekly` # Group `Weekly`
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_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, Echo_of_War_Inner_Beast_Battlefield
Weekly_Team = 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9 Weekly_Team = 1 # 1, 2, 3, 4, 5, 6, 7, 8, 9
# Group `DailyStorage` # Group `DailyStorage`
@ -182,7 +185,7 @@ class GeneratedConfig:
RogueDebug_DebugMode = False RogueDebug_DebugMode = False
# Group `Ornament` # 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_Dungeon = 'Divergent_Universe_Eternal_Comedy' # Divergent_Universe_Famished_Worker, 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_UseImmersifier = True # True
Ornament_DoubleEvent = True # True Ornament_DoubleEvent = True # True
Ornament_UseStamina = False Ornament_UseStamina = False

View File

@ -100,7 +100,7 @@ class ConfigGenerator:
option_add(keys='Ornament.Dungeon.option', options=ornament) option_add(keys='Ornament.Dungeon.option', options=ornament)
# Insert characters # Insert characters
from tasks.character.keywords import CharacterList from tasks.character.keywords import CharacterList
unsupported_characters = [] unsupported_characters = ['Lingsha']
characters = [character.name for character in CharacterList.instances.values() characters = [character.name for character in CharacterList.instances.values()
if character.name not in unsupported_characters] if character.name not in unsupported_characters]
option_add(keys='DungeonSupport.Character.option', options=characters) option_add(keys='DungeonSupport.Character.option', options=characters)

View File

@ -238,15 +238,15 @@
"Name": { "Name": {
"name": "Dungeon Name", "name": "Dungeon Name",
"help": "Default dungeon setting", "help": "Default dungeon setting",
"Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-Ⅵ))", "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories)",
"Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: Character EXP (Bud of Memories (The Xianzhou Luofu))", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: Character EXP (Bud of Memories)",
"Calyx_Golden_Memories_Penacony": "Material: Character EXP (Bud of Memories (Penacony))", "Calyx_Golden_Memories_Penacony": "Material: Character EXP (Bud of Memories)",
"Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-Ⅵ))", "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether)",
"Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: Light Cone EXP (Bud of Aether (The Xianzhou Luofu))", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: Light Cone EXP (Bud of Aether)",
"Calyx_Golden_Aether_Penacony": "Material: Light Cone EXP (Bud of Aether (Penacony))", "Calyx_Golden_Aether_Penacony": "Material: Light Cone EXP (Bud of Aether)",
"Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-Ⅵ))", "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures)",
"Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Credit (Bud of Treasures (The Xianzhou Luofu))", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Credit (Bud of Treasures)",
"Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures (Penacony))", "Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures)",
"Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)", "Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)",
"Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Trace: Destruction (Scalegorge Waterscape)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Trace: Destruction (Scalegorge Waterscape)",
"Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)",
@ -266,14 +266,16 @@
"Stagnant_Shadow_Duty": "Ascension: Physical (Boothill / Robin / Yunli)", "Stagnant_Shadow_Duty": "Ascension: Physical (Boothill / Robin / Yunli)",
"Stagnant_Shadow_Blaze": "Ascension: Fire (Himeko / Asta / Hook)", "Stagnant_Shadow_Blaze": "Ascension: Fire (Himeko / Asta / Hook)",
"Stagnant_Shadow_Scorch": "Ascension: Fire (Guinaifen / Topaz & Numby)", "Stagnant_Shadow_Scorch": "Ascension: Fire (Guinaifen / Topaz & Numby)",
"Stagnant_Shadow_Ire": "Ascension: Fire (Firefly / Gallagher / Jiaoqiu)", "Stagnant_Shadow_Ire": "Ascension: Fire (Firefly / Gallagher / Jiaoqiu / Lingsha)",
"Stagnant_Shadow_Rime": "Ascension: Ice (March 7th / Herta / Gepard / Pela)", "Stagnant_Shadow_Rime": "Ascension: Ice (March 7th / Herta / Gepard / Pela)",
"Stagnant_Shadow_Icicle": "Ascension: Ice (Yanqing / Jingliu / Ruan Mei)", "Stagnant_Shadow_Icicle": "Ascension: Ice (Yanqing / Jingliu / Ruan Mei)",
"Stagnant_Shadow_Nectar": "Ascension: Ice (Misha)", "Stagnant_Shadow_Nectar": "Ascension: Ice (Misha)",
"Stagnant_Shadow_Fulmination": "Ascension: Lightning (Arlan / Serval / Tingyun / Bailu)", "Stagnant_Shadow_Fulmination": "Ascension: Lightning (Arlan / Serval / Tingyun / Bailu)",
"Stagnant_Shadow_Doom": "Ascension: Lightning (Kafka / Jing Yuan / Acheron)", "Stagnant_Shadow_Doom": "Ascension: Lightning (Kafka / Jing Yuan / Acheron)",
"Stagnant_Shadow_Mechwolf": "Ascension: Lightning (Moze)",
"Stagnant_Shadow_Gust": "Ascension: Wind (Dan Heng / Bronya / Sampo)", "Stagnant_Shadow_Gust": "Ascension: Wind (Dan Heng / Bronya / Sampo)",
"Stagnant_Shadow_Celestial": "Ascension: Wind (Blade / Huohuo / Black Swan)", "Stagnant_Shadow_Celestial": "Ascension: Wind (Blade / Huohuo / Black Swan)",
"Stagnant_Shadow_Gloam": "Ascension: Wind (Feixiao)",
"Stagnant_Shadow_Quanta": "Ascension: Quantum (Silver Wolf / Seele / Qingque)", "Stagnant_Shadow_Quanta": "Ascension: Quantum (Silver Wolf / Seele / Qingque)",
"Stagnant_Shadow_Abomination": "Ascension: Quantum (Lynx / Fu Xuan / Xueyi)", "Stagnant_Shadow_Abomination": "Ascension: Quantum (Lynx / Fu Xuan / Xueyi)",
"Stagnant_Shadow_Roast": "Ascension: Quantum (Jade / Sparkle)", "Stagnant_Shadow_Roast": "Ascension: Quantum (Jade / Sparkle)",
@ -293,15 +295,15 @@
"NameAtDoubleCalyx": { "NameAtDoubleCalyx": {
"name": "At Double Calyx Event, choose dungeon", "name": "At Double Calyx Event, choose dungeon",
"help": "Return to the default dungeon settings after double times exhausted", "help": "Return to the default dungeon settings after double times exhausted",
"Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories (Jarilo-Ⅵ))", "Calyx_Golden_Memories_Jarilo_VI": "Material: Character EXP (Bud of Memories)",
"Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: Character EXP (Bud of Memories (The Xianzhou Luofu))", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: Character EXP (Bud of Memories)",
"Calyx_Golden_Memories_Penacony": "Material: Character EXP (Bud of Memories (Penacony))", "Calyx_Golden_Memories_Penacony": "Material: Character EXP (Bud of Memories)",
"Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether (Jarilo-Ⅵ))", "Calyx_Golden_Aether_Jarilo_VI": "Material: Light Cone EXP (Bud of Aether)",
"Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: Light Cone EXP (Bud of Aether (The Xianzhou Luofu))", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: Light Cone EXP (Bud of Aether)",
"Calyx_Golden_Aether_Penacony": "Material: Light Cone EXP (Bud of Aether (Penacony))", "Calyx_Golden_Aether_Penacony": "Material: Light Cone EXP (Bud of Aether)",
"Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures (Jarilo-Ⅵ))", "Calyx_Golden_Treasures_Jarilo_VI": "Material: Credit (Bud of Treasures)",
"Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Credit (Bud of Treasures (The Xianzhou Luofu))", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Credit (Bud of Treasures)",
"Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures (Penacony))", "Calyx_Golden_Treasures_Penacony": "Material: Credit (Bud of Treasures)",
"Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)", "Calyx_Crimson_Destruction_Herta_StorageZone": "Trace: Destruction (Storage Zone)",
"Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Trace: Destruction (Scalegorge Waterscape)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Trace: Destruction (Scalegorge Waterscape)",
"Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)", "Calyx_Crimson_Preservation_Herta_SupplyZone": "Trace: Preservation (Supply Zone)",
@ -393,6 +395,7 @@
"DanHeng": "Dan Heng", "DanHeng": "Dan Heng",
"DanHengImbibitorLunae": "Dan Heng • Imbibitor Lunae", "DanHengImbibitorLunae": "Dan Heng • Imbibitor Lunae",
"DrRatio": "Dr. Ratio", "DrRatio": "Dr. Ratio",
"Feixiao": "Feixiao",
"Firefly": "Firefly", "Firefly": "Firefly",
"FuXuan": "Fu Xuan", "FuXuan": "Fu Xuan",
"Gallagher": "Gallagher", "Gallagher": "Gallagher",
@ -414,6 +417,7 @@
"March7thPreservation": "March 7th: Preservation", "March7thPreservation": "March 7th: Preservation",
"March7thTheHunt": "March 7th: The Hunt", "March7thTheHunt": "March 7th: The Hunt",
"Misha": "Misha", "Misha": "Misha",
"Moze": "Moze",
"Natasha": "Natasha", "Natasha": "Natasha",
"Pela": "Pela", "Pela": "Pela",
"Qingque": "Qingque", "Qingque": "Qingque",
@ -567,13 +571,21 @@
"help": "" "help": ""
}, },
"Item_Raging_Heart": { "Item_Raging_Heart": {
"name": "Ascension: Fire (Firefly / Gallagher / Jiaoqiu)", "name": "Ascension: Fire (Firefly / Gallagher / Jiaoqiu / Lingsha)",
"help": "" "help": ""
}, },
"Item_Dream_Fridge": { "Item_Dream_Fridge": {
"name": "Ascension: Ice (Misha)", "name": "Ascension: Ice (Misha)",
"help": "" "help": ""
}, },
"Item_Nail_of_the_Beast_Coffin": {
"name": "Ascension: Lightning (Moze)",
"help": ""
},
"Item_A_Glass_of_the_Besotted_Era": {
"name": "Ascension: Wind (Feixiao)",
"help": ""
},
"Item_Dream_Flamer": { "Item_Dream_Flamer": {
"name": "Ascension: Quantum (Jade / Sparkle)", "name": "Ascension: Quantum (Jade / Sparkle)",
"help": "" "help": ""
@ -658,6 +670,10 @@
"name": "Salutations of Ashen Dreams (Penacony)", "name": "Salutations of Ashen Dreams (Penacony)",
"help": "" "help": ""
}, },
"Item_Auspice_Sliver": {
"name": "Inner Beast's Battlefield (The Xianzhou Luofu)",
"help": ""
},
"Item_Squirming_Core": { "Item_Squirming_Core": {
"name": "Squirming Core", "name": "Squirming Core",
"help": "" "help": ""
@ -703,7 +719,8 @@
"Echo_of_War_End_of_the_Eternal_Freeze": "End of the Eternal Freeze (Jarilo-VI)", "Echo_of_War_End_of_the_Eternal_Freeze": "End of the Eternal Freeze (Jarilo-VI)",
"Echo_of_War_Divine_Seed": "Divine Seed (The Xianzhou Luofu)", "Echo_of_War_Divine_Seed": "Divine Seed (The Xianzhou Luofu)",
"Echo_of_War_Borehole_Planet_Old_Crater": "Borehole Planet's Old Crater (Herta Space Station)", "Echo_of_War_Borehole_Planet_Old_Crater": "Borehole Planet's Old Crater (Herta Space Station)",
"Echo_of_War_Salutations_of_Ashen_Dreams": "Salutations of Ashen Dreams (Penacony)" "Echo_of_War_Salutations_of_Ashen_Dreams": "Salutations of Ashen Dreams (Penacony)",
"Echo_of_War_Inner_Beast_Battlefield": "Inner Beast's Battlefield (The Xianzhou Luofu)"
}, },
"Team": { "Team": {
"name": "Dungeon Team", "name": "Dungeon Team",
@ -933,11 +950,11 @@
"World": { "World": {
"name": "World", "name": "World",
"help": "", "help": "",
"Simulated_Universe_World_3": "Simulated Universe: World 3", "Simulated_Universe_World_3": "World 3",
"Simulated_Universe_World_4": "Simulated Universe: World 4", "Simulated_Universe_World_4": "World 4",
"Simulated_Universe_World_5": "Simulated Universe: World 5", "Simulated_Universe_World_5": "World 5",
"Simulated_Universe_World_6": "Simulated Universe: World 6", "Simulated_Universe_World_6": "World 6",
"Simulated_Universe_World_8": "Simulated Universe: World 8" "Simulated_Universe_World_8": "World 8"
}, },
"Path": { "Path": {
"name": "Path", "name": "Path",
@ -1047,6 +1064,7 @@
"Dungeon": { "Dungeon": {
"name": "Dungeon Name", "name": "Dungeon Name",
"help": "", "help": "",
"Divergent_Universe_Famished_Worker": "Divergent_Universe_Famished_Worker (Famished Worker)",
"Divergent_Universe_Eternal_Comedy": "Running Wolves & Kalpagni Lantern (Eternal Comedy)", "Divergent_Universe_Eternal_Comedy": "Running Wolves & Kalpagni Lantern (Eternal Comedy)",
"Divergent_Universe_To_Sweet_Dreams": "Sigonia & Izumo Gensei (To Sweet Dreams)", "Divergent_Universe_To_Sweet_Dreams": "Sigonia & Izumo Gensei (To Sweet Dreams)",
"Divergent_Universe_Pouring_Blades": "Firmament & Penacony (Pouring Blades)", "Divergent_Universe_Pouring_Blades": "Firmament & Penacony (Pouring Blades)",

View File

@ -238,15 +238,15 @@
"Name": { "Name": {
"name": "Nombre de la Mazmorra", "name": "Nombre de la Mazmorra",
"help": "Ajustes predeterminados de las mazmorras", "help": "Ajustes predeterminados de las mazmorras",
"Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-Ⅵ))", "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos)",
"Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: EXP de personaje (Flor de los recuerdos (El Luofu de Xianzhou))", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: EXP de personaje (Flor de los recuerdos)",
"Calyx_Golden_Memories_Penacony": "Material: EXP de personaje (Flor de los recuerdos (Colonipenal))", "Calyx_Golden_Memories_Penacony": "Material: EXP de personaje (Flor de los recuerdos)",
"Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-Ⅵ))", "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter)",
"Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: EXP de conos de luz (Flor de éter (El Luofu de Xianzhou))", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: EXP de conos de luz (Flor de éter)",
"Calyx_Golden_Aether_Penacony": "Material: EXP de conos de luz (Flor de éter (Colonipenal))", "Calyx_Golden_Aether_Penacony": "Material: EXP de conos de luz (Flor de éter)",
"Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-Ⅵ))", "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros)",
"Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Créditos (Flor de tesoros (El Luofu de Xianzhou))", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Créditos (Flor de tesoros)",
"Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros (Colonipenal))", "Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros)",
"Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)", "Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)",
"Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Rastros: Destrucción (Desfiladero de Escamas)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Rastros: Destrucción (Desfiladero de Escamas)",
"Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)",
@ -266,14 +266,16 @@
"Stagnant_Shadow_Duty": "Ascension: Físico (Boothill / Robin / Yunli)", "Stagnant_Shadow_Duty": "Ascension: Físico (Boothill / Robin / Yunli)",
"Stagnant_Shadow_Blaze": "Ascension: Fuego (Himeko / Asta / Hook)", "Stagnant_Shadow_Blaze": "Ascension: Fuego (Himeko / Asta / Hook)",
"Stagnant_Shadow_Scorch": "Ascension: Fuego (Guinaifen / Topaz y Conti)", "Stagnant_Shadow_Scorch": "Ascension: Fuego (Guinaifen / Topaz y Conti)",
"Stagnant_Shadow_Ire": "Ascension: Fuego (Luciérnaga / Gallagher / Jiaoqiu)", "Stagnant_Shadow_Ire": "Ascension: Fuego (Luciérnaga / Gallagher / Jiaoqiu / Lingsha)",
"Stagnant_Shadow_Rime": "Ascension: Hielo (Siete de Marzo / Herta / Gepard / Pela)", "Stagnant_Shadow_Rime": "Ascension: Hielo (Siete de Marzo / Herta / Gepard / Pela)",
"Stagnant_Shadow_Icicle": "Ascension: Hielo (Yanqing / Jingliu / Ruan Mei)", "Stagnant_Shadow_Icicle": "Ascension: Hielo (Yanqing / Jingliu / Ruan Mei)",
"Stagnant_Shadow_Nectar": "Ascension: Hielo (Misha)", "Stagnant_Shadow_Nectar": "Ascension: Hielo (Misha)",
"Stagnant_Shadow_Fulmination": "Ascension: Rayo (Arlan / Serval / Tingyun / Bailu)", "Stagnant_Shadow_Fulmination": "Ascension: Rayo (Arlan / Serval / Tingyun / Bailu)",
"Stagnant_Shadow_Doom": "Ascension: Rayo (Kafka / Jing Yuan / Acheron)", "Stagnant_Shadow_Doom": "Ascension: Rayo (Kafka / Jing Yuan / Acheron)",
"Stagnant_Shadow_Mechwolf": "Ascension: Rayo (Moze)",
"Stagnant_Shadow_Gust": "Ascension: Viento (Dan Heng / Bronya / Sampo)", "Stagnant_Shadow_Gust": "Ascension: Viento (Dan Heng / Bronya / Sampo)",
"Stagnant_Shadow_Celestial": "Ascension: Viento (Blade / Huohuo / Cisne Negro)", "Stagnant_Shadow_Celestial": "Ascension: Viento (Blade / Huohuo / Cisne Negro)",
"Stagnant_Shadow_Gloam": "Ascension: Viento (Feixiao)",
"Stagnant_Shadow_Quanta": "Ascension: Cuántico (Silver Wolf / Seele / Qingque)", "Stagnant_Shadow_Quanta": "Ascension: Cuántico (Silver Wolf / Seele / Qingque)",
"Stagnant_Shadow_Abomination": "Ascension: Cuántico (Lynx / Fu Xuan / Xueyi)", "Stagnant_Shadow_Abomination": "Ascension: Cuántico (Lynx / Fu Xuan / Xueyi)",
"Stagnant_Shadow_Roast": "Ascension: Cuántico (Jade / Sparkle)", "Stagnant_Shadow_Roast": "Ascension: Cuántico (Jade / Sparkle)",
@ -293,15 +295,15 @@
"NameAtDoubleCalyx": { "NameAtDoubleCalyx": {
"name": "En los eventos de x2 de Cáliz", "name": "En los eventos de x2 de Cáliz",
"help": "Se volverán a los ajustes predeterminados una vez se acaben los intentos del evento", "help": "Se volverán a los ajustes predeterminados una vez se acaben los intentos del evento",
"Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos (Jarilo-Ⅵ))", "Calyx_Golden_Memories_Jarilo_VI": "Material: EXP de personaje (Flor de los recuerdos)",
"Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: EXP de personaje (Flor de los recuerdos (El Luofu de Xianzhou))", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "Material: EXP de personaje (Flor de los recuerdos)",
"Calyx_Golden_Memories_Penacony": "Material: EXP de personaje (Flor de los recuerdos (Colonipenal))", "Calyx_Golden_Memories_Penacony": "Material: EXP de personaje (Flor de los recuerdos)",
"Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter (Jarilo-Ⅵ))", "Calyx_Golden_Aether_Jarilo_VI": "Material: EXP de conos de luz (Flor de éter)",
"Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: EXP de conos de luz (Flor de éter (El Luofu de Xianzhou))", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "Material: EXP de conos de luz (Flor de éter)",
"Calyx_Golden_Aether_Penacony": "Material: EXP de conos de luz (Flor de éter (Colonipenal))", "Calyx_Golden_Aether_Penacony": "Material: EXP de conos de luz (Flor de éter)",
"Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros (Jarilo-Ⅵ))", "Calyx_Golden_Treasures_Jarilo_VI": "Material: Créditos (Flor de tesoros)",
"Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Créditos (Flor de tesoros (El Luofu de Xianzhou))", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "Material: Créditos (Flor de tesoros)",
"Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros (Colonipenal))", "Calyx_Golden_Treasures_Penacony": "Material: Créditos (Flor de tesoros)",
"Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)", "Calyx_Crimson_Destruction_Herta_StorageZone": "Rastros: Destrucción (Zona de almacenamiento)",
"Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Rastros: Destrucción (Desfiladero de Escamas)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "Rastros: Destrucción (Desfiladero de Escamas)",
"Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)", "Calyx_Crimson_Preservation_Herta_SupplyZone": "Rastros: Conservación (Zona de suministros)",
@ -393,6 +395,7 @@
"DanHeng": "Dan Heng", "DanHeng": "Dan Heng",
"DanHengImbibitorLunae": "Dan Heng - Imbibitor Lunae", "DanHengImbibitorLunae": "Dan Heng - Imbibitor Lunae",
"DrRatio": "Dr. Ratio", "DrRatio": "Dr. Ratio",
"Feixiao": "Feixiao",
"Firefly": "Luciérnaga", "Firefly": "Luciérnaga",
"FuXuan": "Fu Xuan", "FuXuan": "Fu Xuan",
"Gallagher": "Gallagher", "Gallagher": "Gallagher",
@ -414,6 +417,7 @@
"March7thPreservation": "Siete de Marzo: Conservación", "March7thPreservation": "Siete de Marzo: Conservación",
"March7thTheHunt": "Siete de Marzo: Cacería", "March7thTheHunt": "Siete de Marzo: Cacería",
"Misha": "Misha", "Misha": "Misha",
"Moze": "Moze",
"Natasha": "Natasha", "Natasha": "Natasha",
"Pela": "Pela", "Pela": "Pela",
"Qingque": "Qingque", "Qingque": "Qingque",
@ -567,13 +571,21 @@
"help": "" "help": ""
}, },
"Item_Raging_Heart": { "Item_Raging_Heart": {
"name": "Ascension: Fuego (Luciérnaga / Gallagher / Jiaoqiu)", "name": "Ascension: Fuego (Luciérnaga / Gallagher / Jiaoqiu / Lingsha)",
"help": "" "help": ""
}, },
"Item_Dream_Fridge": { "Item_Dream_Fridge": {
"name": "Ascension: Hielo (Misha)", "name": "Ascension: Hielo (Misha)",
"help": "" "help": ""
}, },
"Item_Nail_of_the_Beast_Coffin": {
"name": "Ascension: Rayo (Moze)",
"help": ""
},
"Item_A_Glass_of_the_Besotted_Era": {
"name": "Ascension: Viento (Feixiao)",
"help": ""
},
"Item_Dream_Flamer": { "Item_Dream_Flamer": {
"name": "Ascension: Cuántico (Jade / Sparkle)", "name": "Ascension: Cuántico (Jade / Sparkle)",
"help": "" "help": ""
@ -658,6 +670,10 @@
"name": "Tributo del sueño ceniciento (Colonipenal)", "name": "Tributo del sueño ceniciento (Colonipenal)",
"help": "" "help": ""
}, },
"Item_Auspice_Sliver": {
"name": "Campo de batalla de la bestia interior (El Luofu de Xianzhou)",
"help": ""
},
"Item_Squirming_Core": { "Item_Squirming_Core": {
"name": "Núcleo serpenteante", "name": "Núcleo serpenteante",
"help": "" "help": ""
@ -703,7 +719,8 @@
"Echo_of_War_End_of_the_Eternal_Freeze": "El fin del Hielo Eterno (Jarilo-VI)", "Echo_of_War_End_of_the_Eternal_Freeze": "El fin del Hielo Eterno (Jarilo-VI)",
"Echo_of_War_Divine_Seed": "Semilla divina (El Luofu de Xianzhou)", "Echo_of_War_Divine_Seed": "Semilla divina (El Luofu de Xianzhou)",
"Echo_of_War_Borehole_Planet_Old_Crater": "Cráter del planeta devorado (Estación Espacial Herta)", "Echo_of_War_Borehole_Planet_Old_Crater": "Cráter del planeta devorado (Estación Espacial Herta)",
"Echo_of_War_Salutations_of_Ashen_Dreams": "Tributo del sueño ceniciento (Colonipenal)" "Echo_of_War_Salutations_of_Ashen_Dreams": "Tributo del sueño ceniciento (Colonipenal)",
"Echo_of_War_Inner_Beast_Battlefield": "Campo de batalla de la bestia interior (El Luofu de Xianzhou)"
}, },
"Team": { "Team": {
"name": "Equipo de mazmorra", "name": "Equipo de mazmorra",
@ -1047,6 +1064,7 @@
"Dungeon": { "Dungeon": {
"name": "Nombre de la Mazmorra", "name": "Nombre de la Mazmorra",
"help": "", "help": "",
"Divergent_Universe_Famished_Worker": "Divergent_Universe_Famished_Worker (Obrero famélico)",
"Divergent_Universe_Eternal_Comedy": " (Comedia eterna)", "Divergent_Universe_Eternal_Comedy": " (Comedia eterna)",
"Divergent_Universe_To_Sweet_Dreams": " (Hasta los dulces sueños)", "Divergent_Universe_To_Sweet_Dreams": " (Hasta los dulces sueños)",
"Divergent_Universe_Pouring_Blades": " (Lluvia de espadas)", "Divergent_Universe_Pouring_Blades": " (Lluvia de espadas)",

View File

@ -238,15 +238,15 @@
"Name": { "Name": {
"name": "Dungeon.Name.name", "name": "Dungeon.Name.name",
"help": "Dungeon.Name.help", "help": "Dungeon.Name.help",
"Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-Ⅵ", "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾",
"Calyx_Golden_Memories_The_Xianzhou_Luofu": "素材:役割経験(回憶の蕾・仙舟羅浮", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "素材:役割経験(回憶の蕾",
"Calyx_Golden_Memories_Penacony": "素材:役割経験(回憶の蕾・ピノコニー", "Calyx_Golden_Memories_Penacony": "素材:役割経験(回憶の蕾",
"Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-Ⅵ", "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾",
"Calyx_Golden_Aether_The_Xianzhou_Luofu": "素材:武器経験(エーテルの蕾・仙舟羅浮", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "素材:武器経験(エーテルの蕾",
"Calyx_Golden_Aether_Penacony": "素材:武器経験(エーテルの蕾・ピノコニー", "Calyx_Golden_Aether_Penacony": "素材:武器経験(エーテルの蕾",
"Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-Ⅵ", "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾",
"Calyx_Golden_Treasures_The_Xianzhou_Luofu": "素材:クレジット(秘蔵の蕾・仙舟羅浮", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "素材:クレジット(秘蔵の蕾",
"Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾・ピノコニー", "Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾",
"Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)", "Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)",
"Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "軌跡素材:壊滅(鱗淵境)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "軌跡素材:壊滅(鱗淵境)",
"Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)",
@ -266,42 +266,44 @@
"Stagnant_Shadow_Duty": "キャラクター昇格素材:物理(ブートヒル / ロビン / 雲璃)", "Stagnant_Shadow_Duty": "キャラクター昇格素材:物理(ブートヒル / ロビン / 雲璃)",
"Stagnant_Shadow_Blaze": "キャラクター昇格素材:炎(姫子 / アスター / フック)", "Stagnant_Shadow_Blaze": "キャラクター昇格素材:炎(姫子 / アスター / フック)",
"Stagnant_Shadow_Scorch": "キャラクター昇格素材:炎(桂乃芬 / トパーズ&カブ)", "Stagnant_Shadow_Scorch": "キャラクター昇格素材:炎(桂乃芬 / トパーズ&カブ)",
"Stagnant_Shadow_Ire": "キャラクター昇格素材:炎(ホタル / ギャラガー / 椒丘", "Stagnant_Shadow_Ire": "キャラクター昇格素材:炎(ホタル / ギャラガー / 椒丘 / 霊砂",
"Stagnant_Shadow_Rime": "キャラクター昇格素材:氷(三月なのか / ヘルタ / ジェパード / ペラ)", "Stagnant_Shadow_Rime": "キャラクター昇格素材:氷(三月なのか / ヘルタ / ジェパード / ペラ)",
"Stagnant_Shadow_Icicle": "キャラクター昇格素材:氷(彦卿 / 鏡流 / ルアン・メェイ)", "Stagnant_Shadow_Icicle": "キャラクター昇格素材:氷(彦卿 / 鏡流 / ルアン・メェイ)",
"Stagnant_Shadow_Nectar": "キャラクター昇格素材:氷(ミーシャ)", "Stagnant_Shadow_Nectar": "キャラクター昇格素材:氷(ミーシャ)",
"Stagnant_Shadow_Fulmination": "キャラクター昇格素材:雷(アーラン / セーバル / 停雲 / 白露)", "Stagnant_Shadow_Fulmination": "キャラクター昇格素材:雷(アーラン / セーバル / 停雲 / 白露)",
"Stagnant_Shadow_Doom": "キャラクター昇格素材:雷(カフカ / 景元 / 黄泉)", "Stagnant_Shadow_Doom": "キャラクター昇格素材:雷(カフカ / 景元 / 黄泉)",
"Stagnant_Shadow_Mechwolf": "キャラクター昇格素材:雷(モゼ)",
"Stagnant_Shadow_Gust": "キャラクター昇格素材:風(丹恒 / ブローニャ / サンポ)", "Stagnant_Shadow_Gust": "キャラクター昇格素材:風(丹恒 / ブローニャ / サンポ)",
"Stagnant_Shadow_Celestial": "キャラクター昇格素材:風(刃 / フォフォ / ブラックスワン)", "Stagnant_Shadow_Celestial": "キャラクター昇格素材:風(刃 / フォフォ / ブラックスワン)",
"Stagnant_Shadow_Gloam": "キャラクター昇格素材:風(飛霄)",
"Stagnant_Shadow_Quanta": "キャラクター昇格素材:量子(銀狼 / ゼーレ / 青雀)", "Stagnant_Shadow_Quanta": "キャラクター昇格素材:量子(銀狼 / ゼーレ / 青雀)",
"Stagnant_Shadow_Abomination": "キャラクター昇格素材:量子(リンクス / 符玄 / 雪衣)", "Stagnant_Shadow_Abomination": "キャラクター昇格素材:量子(リンクス / 符玄 / 雪衣)",
"Stagnant_Shadow_Roast": "キャラクター昇格素材:量子(ジェイド / 花火)", "Stagnant_Shadow_Roast": "キャラクター昇格素材:量子(ジェイド / 花火)",
"Stagnant_Shadow_Mirage": "キャラクター昇格素材:虚数(ヴェルト / 羅刹 / 御空)", "Stagnant_Shadow_Mirage": "キャラクター昇格素材:虚数(ヴェルト / 羅刹 / 御空)",
"Stagnant_Shadow_Puppetry": "キャラクター昇格素材:虚数(丹恒・飲月 / アベンチュリン / Dr.レイシオ)", "Stagnant_Shadow_Puppetry": "キャラクター昇格素材:虚数(丹恒・飲月 / アベンチュリン / Dr.レイシオ)",
"Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路(侵蝕トンネル・霜風の路)", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路(霜風の路)",
"Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路(侵蝕トンネル・迅拳の路)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路(迅拳の路)",
"Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路(侵蝕トンネル・漂泊の路)", "Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路(漂泊の路)",
"Cavern_of_Corrosion_Path_of_Providence": "侵蝕トンネル・睿治の路(侵蝕トンネル・睿治の路)", "Cavern_of_Corrosion_Path_of_Providence": "侵蝕トンネル・睿治の路(睿治の路)",
"Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路(侵蝕トンネル・聖頌の路)", "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路(聖頌の路)",
"Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路(侵蝕トンネル・野焔の路)", "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路(野焔の路)",
"Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路(侵蝕トンネル・薬使の路)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路(薬使の路)",
"Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路(侵蝕トンネル・幽冥の路)", "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路(幽冥の路)",
"Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路(侵蝕トンネル・夢潜の路)", "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路(夢潜の路)",
"Cavern_of_Corrosion_Path_of_Cavalier": "侵蝕トンネル・勇騎の路(侵蝕トンネル・勇騎の路)" "Cavern_of_Corrosion_Path_of_Cavalier": "侵蝕トンネル・勇騎の路(勇騎の路)"
}, },
"NameAtDoubleCalyx": { "NameAtDoubleCalyx": {
"name": "Dungeon.NameAtDoubleCalyx.name", "name": "Dungeon.NameAtDoubleCalyx.name",
"help": "Dungeon.NameAtDoubleCalyx.help", "help": "Dungeon.NameAtDoubleCalyx.help",
"Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾・ヤリーロ-Ⅵ", "Calyx_Golden_Memories_Jarilo_VI": "素材:役割経験(回憶の蕾",
"Calyx_Golden_Memories_The_Xianzhou_Luofu": "素材:役割経験(回憶の蕾・仙舟羅浮", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "素材:役割経験(回憶の蕾",
"Calyx_Golden_Memories_Penacony": "素材:役割経験(回憶の蕾・ピノコニー", "Calyx_Golden_Memories_Penacony": "素材:役割経験(回憶の蕾",
"Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾・ヤリーロ-Ⅵ", "Calyx_Golden_Aether_Jarilo_VI": "素材:武器経験(エーテルの蕾",
"Calyx_Golden_Aether_The_Xianzhou_Luofu": "素材:武器経験(エーテルの蕾・仙舟羅浮", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "素材:武器経験(エーテルの蕾",
"Calyx_Golden_Aether_Penacony": "素材:武器経験(エーテルの蕾・ピノコニー", "Calyx_Golden_Aether_Penacony": "素材:武器経験(エーテルの蕾",
"Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾・ヤリーロ-Ⅵ", "Calyx_Golden_Treasures_Jarilo_VI": "素材:クレジット(秘蔵の蕾",
"Calyx_Golden_Treasures_The_Xianzhou_Luofu": "素材:クレジット(秘蔵の蕾・仙舟羅浮", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "素材:クレジット(秘蔵の蕾",
"Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾・ピノコニー", "Calyx_Golden_Treasures_Penacony": "素材:クレジット(秘蔵の蕾",
"Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)", "Calyx_Crimson_Destruction_Herta_StorageZone": "軌跡素材:壊滅(収容部分)",
"Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "軌跡素材:壊滅(鱗淵境)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "軌跡素材:壊滅(鱗淵境)",
"Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)", "Calyx_Crimson_Preservation_Herta_SupplyZone": "軌跡素材:存護(サポート部分)",
@ -320,16 +322,16 @@
"NameAtDoubleRelic": { "NameAtDoubleRelic": {
"name": "Dungeon.NameAtDoubleRelic.name", "name": "Dungeon.NameAtDoubleRelic.name",
"help": "Dungeon.NameAtDoubleRelic.help", "help": "Dungeon.NameAtDoubleRelic.help",
"Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路(侵蝕トンネル・霜風の路)", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "侵蝕トンネル・霜風の路(霜風の路)",
"Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路(侵蝕トンネル・迅拳の路)", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "侵蝕トンネル・迅拳の路(迅拳の路)",
"Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路(侵蝕トンネル・漂泊の路)", "Cavern_of_Corrosion_Path_of_Drifting": "侵蝕トンネル・漂泊の路(漂泊の路)",
"Cavern_of_Corrosion_Path_of_Providence": "侵蝕トンネル・睿治の路(侵蝕トンネル・睿治の路)", "Cavern_of_Corrosion_Path_of_Providence": "侵蝕トンネル・睿治の路(睿治の路)",
"Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路(侵蝕トンネル・聖頌の路)", "Cavern_of_Corrosion_Path_of_Holy_Hymn": "侵蝕トンネル・聖頌の路(聖頌の路)",
"Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路(侵蝕トンネル・野焔の路)", "Cavern_of_Corrosion_Path_of_Conflagration": "侵蝕トンネル・野焔の路(野焔の路)",
"Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路(侵蝕トンネル・薬使の路)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "侵蝕トンネル・薬使の路(薬使の路)",
"Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路(侵蝕トンネル・幽冥の路)", "Cavern_of_Corrosion_Path_of_Darkness": "侵蝕トンネル・幽冥の路(幽冥の路)",
"Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路(侵蝕トンネル・夢潜の路)", "Cavern_of_Corrosion_Path_of_Dreamdive": "侵蝕トンネル・夢潜の路(夢潜の路)",
"Cavern_of_Corrosion_Path_of_Cavalier": "侵蝕トンネル・勇騎の路(侵蝕トンネル・勇騎の路)" "Cavern_of_Corrosion_Path_of_Cavalier": "侵蝕トンネル・勇騎の路(勇騎の路)"
}, },
"Team": { "Team": {
"name": "Dungeon.Team.name", "name": "Dungeon.Team.name",
@ -393,6 +395,7 @@
"DanHeng": "丹恒", "DanHeng": "丹恒",
"DanHengImbibitorLunae": "丹恒・飲月", "DanHengImbibitorLunae": "丹恒・飲月",
"DrRatio": "Dr.レイシオ", "DrRatio": "Dr.レイシオ",
"Feixiao": "飛霄",
"Firefly": "ホタル", "Firefly": "ホタル",
"FuXuan": "符玄", "FuXuan": "符玄",
"Gallagher": "ギャラガー", "Gallagher": "ギャラガー",
@ -414,6 +417,7 @@
"March7thPreservation": "三月なのか・存護", "March7thPreservation": "三月なのか・存護",
"March7thTheHunt": "三月なのか・巡狩", "March7thTheHunt": "三月なのか・巡狩",
"Misha": "ミーシャ", "Misha": "ミーシャ",
"Moze": "モゼ",
"Natasha": "ナターシャ", "Natasha": "ナターシャ",
"Pela": "ペラ", "Pela": "ペラ",
"Qingque": "青雀", "Qingque": "青雀",
@ -567,13 +571,21 @@
"help": "" "help": ""
}, },
"Item_Raging_Heart": { "Item_Raging_Heart": {
"name": "キャラクター昇格素材:炎(ホタル / ギャラガー / 椒丘", "name": "キャラクター昇格素材:炎(ホタル / ギャラガー / 椒丘 / 霊砂",
"help": "" "help": ""
}, },
"Item_Dream_Fridge": { "Item_Dream_Fridge": {
"name": "キャラクター昇格素材:氷(ミーシャ)", "name": "キャラクター昇格素材:氷(ミーシャ)",
"help": "" "help": ""
}, },
"Item_Nail_of_the_Beast_Coffin": {
"name": "キャラクター昇格素材:雷(モゼ)",
"help": ""
},
"Item_A_Glass_of_the_Besotted_Era": {
"name": "キャラクター昇格素材:風(飛霄)",
"help": ""
},
"Item_Dream_Flamer": { "Item_Dream_Flamer": {
"name": "キャラクター昇格素材:量子(ジェイド / 花火)", "name": "キャラクター昇格素材:量子(ジェイド / 花火)",
"help": "" "help": ""
@ -658,6 +670,10 @@
"name": "歴戦余韻・現世の夢の礼賛 (ピノコニー)", "name": "歴戦余韻・現世の夢の礼賛 (ピノコニー)",
"help": "" "help": ""
}, },
"Item_Auspice_Sliver": {
"name": "歴戦余韻・心獣の戦場 (仙舟「羅浮」)",
"help": ""
},
"Item_Squirming_Core": { "Item_Squirming_Core": {
"name": "脈動する原核", "name": "脈動する原核",
"help": "" "help": ""
@ -703,7 +719,8 @@
"Echo_of_War_End_of_the_Eternal_Freeze": "歴戦余韻・寒波の幕切れ (ヤリーロ-VI)", "Echo_of_War_End_of_the_Eternal_Freeze": "歴戦余韻・寒波の幕切れ (ヤリーロ-VI)",
"Echo_of_War_Divine_Seed": "歴戦余韻・不死の神実 (仙舟「羅浮」)", "Echo_of_War_Divine_Seed": "歴戦余韻・不死の神実 (仙舟「羅浮」)",
"Echo_of_War_Borehole_Planet_Old_Crater": "歴戦余韻・星を蝕む往日の面影 (宇宙ステーション「ヘルタ」)", "Echo_of_War_Borehole_Planet_Old_Crater": "歴戦余韻・星を蝕む往日の面影 (宇宙ステーション「ヘルタ」)",
"Echo_of_War_Salutations_of_Ashen_Dreams": "歴戦余韻・現世の夢の礼賛 (ピノコニー)" "Echo_of_War_Salutations_of_Ashen_Dreams": "歴戦余韻・現世の夢の礼賛 (ピノコニー)",
"Echo_of_War_Inner_Beast_Battlefield": "歴戦余韻・心獣の戦場 (仙舟「羅浮」)"
}, },
"Team": { "Team": {
"name": "Weekly.Team.name", "name": "Weekly.Team.name",
@ -933,11 +950,11 @@
"World": { "World": {
"name": "RogueWorld.World.name", "name": "RogueWorld.World.name",
"help": "RogueWorld.World.help", "help": "RogueWorld.World.help",
"Simulated_Universe_World_3": "第三世界・模擬宇宙", "Simulated_Universe_World_3": "第三世界",
"Simulated_Universe_World_4": "第四世界・模擬宇宙", "Simulated_Universe_World_4": "第四世界",
"Simulated_Universe_World_5": "第五世界・模擬宇宙", "Simulated_Universe_World_5": "第五世界",
"Simulated_Universe_World_6": "第六世界・模擬宇宙", "Simulated_Universe_World_6": "第六世界",
"Simulated_Universe_World_8": "第八世界・模擬宇宙" "Simulated_Universe_World_8": "第八世界"
}, },
"Path": { "Path": {
"name": "RogueWorld.Path.name", "name": "RogueWorld.Path.name",
@ -1047,6 +1064,7 @@
"Dungeon": { "Dungeon": {
"name": "Ornament.Dungeon.name", "name": "Ornament.Dungeon.name",
"help": "Ornament.Dungeon.help", "help": "Ornament.Dungeon.help",
"Divergent_Universe_Famished_Worker": "Divergent_Universe_Famished_Worker飢えた虫卒",
"Divergent_Universe_Eternal_Comedy": "(永遠の喜劇)", "Divergent_Universe_Eternal_Comedy": "(永遠の喜劇)",
"Divergent_Universe_To_Sweet_Dreams": "(寄り添い眠る)", "Divergent_Universe_To_Sweet_Dreams": "(寄り添い眠る)",
"Divergent_Universe_Pouring_Blades": "(剣の雨)", "Divergent_Universe_Pouring_Blades": "(剣の雨)",

View File

@ -238,15 +238,15 @@
"Name": { "Name": {
"name": "副本名称", "name": "副本名称",
"help": "默认打本设置", "help": "默认打本设置",
"Calyx_Golden_Memories_Jarilo_VI": "材料:角色经验(回忆之蕾•雅利洛-Ⅵ", "Calyx_Golden_Memories_Jarilo_VI": "材料:角色经验(回忆之蕾",
"Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色经验(回忆之蕾•仙舟罗浮", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色经验(回忆之蕾",
"Calyx_Golden_Memories_Penacony": "材料:角色经验(回忆之蕾•匹诺康尼", "Calyx_Golden_Memories_Penacony": "材料:角色经验(回忆之蕾",
"Calyx_Golden_Aether_Jarilo_VI": "材料:武器经验(以太之蕾•雅利洛-Ⅵ", "Calyx_Golden_Aether_Jarilo_VI": "材料:武器经验(以太之蕾",
"Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器经验(以太之蕾•仙舟罗浮", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器经验(以太之蕾",
"Calyx_Golden_Aether_Penacony": "材料:武器经验(以太之蕾•匹诺康尼", "Calyx_Golden_Aether_Penacony": "材料:武器经验(以太之蕾",
"Calyx_Golden_Treasures_Jarilo_VI": "材料:信用点(藏珍之蕾•雅利洛-Ⅵ", "Calyx_Golden_Treasures_Jarilo_VI": "材料:信用点(藏珍之蕾",
"Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用点(藏珍之蕾•仙舟罗浮", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用点(藏珍之蕾",
"Calyx_Golden_Treasures_Penacony": "材料:信用点(藏珍之蕾•匹诺康尼", "Calyx_Golden_Treasures_Penacony": "材料:信用点(藏珍之蕾",
"Calyx_Crimson_Destruction_Herta_StorageZone": "行迹材料:毁灭(收容舱段)", "Calyx_Crimson_Destruction_Herta_StorageZone": "行迹材料:毁灭(收容舱段)",
"Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行迹材料:毁灭(鳞渊境)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行迹材料:毁灭(鳞渊境)",
"Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)",
@ -266,42 +266,44 @@
"Stagnant_Shadow_Duty": "角色晋阶材料:物理(波提欧 / 知更鸟 / 云璃)", "Stagnant_Shadow_Duty": "角色晋阶材料:物理(波提欧 / 知更鸟 / 云璃)",
"Stagnant_Shadow_Blaze": "角色晋阶材料:火(姬子 / 艾丝妲 / 虎克)", "Stagnant_Shadow_Blaze": "角色晋阶材料:火(姬子 / 艾丝妲 / 虎克)",
"Stagnant_Shadow_Scorch": "角色晋阶材料:火(桂乃芬 / 托帕&账账)", "Stagnant_Shadow_Scorch": "角色晋阶材料:火(桂乃芬 / 托帕&账账)",
"Stagnant_Shadow_Ire": "角色晋阶材料:火(流萤 / 加拉赫 / 椒丘", "Stagnant_Shadow_Ire": "角色晋阶材料:火(流萤 / 加拉赫 / 椒丘 / 灵砂",
"Stagnant_Shadow_Rime": "角色晋阶材料:冰(三月七 / 黑塔 / 杰帕德 / 佩拉)", "Stagnant_Shadow_Rime": "角色晋阶材料:冰(三月七 / 黑塔 / 杰帕德 / 佩拉)",
"Stagnant_Shadow_Icicle": "角色晋阶材料:冰(彦卿 / 镜流 / 阮•梅)", "Stagnant_Shadow_Icicle": "角色晋阶材料:冰(彦卿 / 镜流 / 阮•梅)",
"Stagnant_Shadow_Nectar": "角色晋阶材料:冰(米沙)", "Stagnant_Shadow_Nectar": "角色晋阶材料:冰(米沙)",
"Stagnant_Shadow_Fulmination": "角色晋阶材料:雷(阿兰 / 希露瓦 / 停云 / 白露)", "Stagnant_Shadow_Fulmination": "角色晋阶材料:雷(阿兰 / 希露瓦 / 停云 / 白露)",
"Stagnant_Shadow_Doom": "角色晋阶材料:雷(卡芙卡 / 景元 / 黄泉)", "Stagnant_Shadow_Doom": "角色晋阶材料:雷(卡芙卡 / 景元 / 黄泉)",
"Stagnant_Shadow_Mechwolf": "角色晋阶材料:雷(貊泽)",
"Stagnant_Shadow_Gust": "角色晋阶材料:风(丹恒 / 布洛妮娅 / 桑博)", "Stagnant_Shadow_Gust": "角色晋阶材料:风(丹恒 / 布洛妮娅 / 桑博)",
"Stagnant_Shadow_Celestial": "角色晋阶材料:风(刃 / 藿藿 / 黑天鹅)", "Stagnant_Shadow_Celestial": "角色晋阶材料:风(刃 / 藿藿 / 黑天鹅)",
"Stagnant_Shadow_Gloam": "角色晋阶材料:风(飞霄)",
"Stagnant_Shadow_Quanta": "角色晋阶材料:量子(银狼 / 希儿 / 青雀)", "Stagnant_Shadow_Quanta": "角色晋阶材料:量子(银狼 / 希儿 / 青雀)",
"Stagnant_Shadow_Abomination": "角色晋阶材料:量子(玲可 / 符玄 / 雪衣)", "Stagnant_Shadow_Abomination": "角色晋阶材料:量子(玲可 / 符玄 / 雪衣)",
"Stagnant_Shadow_Roast": "角色晋阶材料:量子(翡翠 / 花火)", "Stagnant_Shadow_Roast": "角色晋阶材料:量子(翡翠 / 花火)",
"Stagnant_Shadow_Mirage": "角色晋阶材料:虚数(瓦尔特 / 罗刹 / 驭空)", "Stagnant_Shadow_Mirage": "角色晋阶材料:虚数(瓦尔特 / 罗刹 / 驭空)",
"Stagnant_Shadow_Puppetry": "角色晋阶材料:虚数(丹恒•饮月 / 砂金 / 真理医生)", "Stagnant_Shadow_Puppetry": "角色晋阶材料:虚数(丹恒•饮月 / 砂金 / 真理医生)",
"Cavern_of_Corrosion_Path_of_Gelid_Wind": "遗器:冰套+风套(霜风之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "遗器:冰套+风套(霜风之径",
"Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遗器:物理套+击破套(迅拳之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遗器:物理套+击破套(迅拳之径",
"Cavern_of_Corrosion_Path_of_Drifting": "遗器:治疗套+快枪手(漂泊之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Drifting": "遗器:治疗套+快枪手(漂泊之径",
"Cavern_of_Corrosion_Path_of_Providence": "遗器:铁卫套+量子套(睿治之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Providence": "遗器:铁卫套+量子套(睿治之径",
"Cavern_of_Corrosion_Path_of_Holy_Hymn": "遗器:防御套+雷套(圣颂之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Holy_Hymn": "遗器:防御套+雷套(圣颂之径",
"Cavern_of_Corrosion_Path_of_Conflagration": "遗器:火套+虚数套(野焰之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Conflagration": "遗器:火套+虚数套(野焰之径",
"Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遗器:生命套+速度套(药使之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遗器:生命套+速度套(药使之径",
"Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套幽冥之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套幽冥之径",
"Cavern_of_Corrosion_Path_of_Dreamdive": "遗器:负面套+击破套(梦潜之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Dreamdive": "遗器:负面套+击破套(梦潜之径",
"Cavern_of_Corrosion_Path_of_Cavalier": "遗器:超击破套+终追套(勇骑之径•侵蚀隧洞" "Cavern_of_Corrosion_Path_of_Cavalier": "遗器:超击破套+终追套(勇骑之径"
}, },
"NameAtDoubleCalyx": { "NameAtDoubleCalyx": {
"name": "有双倍花活动时,选择副本", "name": "有双倍花活动时,选择副本",
"help": "次数耗尽后回退到默认打本设置", "help": "次数耗尽后回退到默认打本设置",
"Calyx_Golden_Memories_Jarilo_VI": "材料:角色经验(回忆之蕾•雅利洛-Ⅵ", "Calyx_Golden_Memories_Jarilo_VI": "材料:角色经验(回忆之蕾",
"Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色经验(回忆之蕾•仙舟罗浮", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色经验(回忆之蕾",
"Calyx_Golden_Memories_Penacony": "材料:角色经验(回忆之蕾•匹诺康尼", "Calyx_Golden_Memories_Penacony": "材料:角色经验(回忆之蕾",
"Calyx_Golden_Aether_Jarilo_VI": "材料:武器经验(以太之蕾•雅利洛-Ⅵ", "Calyx_Golden_Aether_Jarilo_VI": "材料:武器经验(以太之蕾",
"Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器经验(以太之蕾•仙舟罗浮", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器经验(以太之蕾",
"Calyx_Golden_Aether_Penacony": "材料:武器经验(以太之蕾•匹诺康尼", "Calyx_Golden_Aether_Penacony": "材料:武器经验(以太之蕾",
"Calyx_Golden_Treasures_Jarilo_VI": "材料:信用点(藏珍之蕾•雅利洛-Ⅵ", "Calyx_Golden_Treasures_Jarilo_VI": "材料:信用点(藏珍之蕾",
"Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用点(藏珍之蕾•仙舟罗浮", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用点(藏珍之蕾",
"Calyx_Golden_Treasures_Penacony": "材料:信用点(藏珍之蕾•匹诺康尼", "Calyx_Golden_Treasures_Penacony": "材料:信用点(藏珍之蕾",
"Calyx_Crimson_Destruction_Herta_StorageZone": "行迹材料:毁灭(收容舱段)", "Calyx_Crimson_Destruction_Herta_StorageZone": "行迹材料:毁灭(收容舱段)",
"Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行迹材料:毁灭(鳞渊境)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行迹材料:毁灭(鳞渊境)",
"Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)", "Calyx_Crimson_Preservation_Herta_SupplyZone": "行迹材料:存护(支援舱段)",
@ -320,16 +322,16 @@
"NameAtDoubleRelic": { "NameAtDoubleRelic": {
"name": "有遗器活动时,选择副本", "name": "有遗器活动时,选择副本",
"help": "次数耗尽后回退到默认打本设置", "help": "次数耗尽后回退到默认打本设置",
"Cavern_of_Corrosion_Path_of_Gelid_Wind": "遗器:冰套+风套(霜风之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "遗器:冰套+风套(霜风之径",
"Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遗器:物理套+击破套(迅拳之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遗器:物理套+击破套(迅拳之径",
"Cavern_of_Corrosion_Path_of_Drifting": "遗器:治疗套+快枪手(漂泊之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Drifting": "遗器:治疗套+快枪手(漂泊之径",
"Cavern_of_Corrosion_Path_of_Providence": "遗器:铁卫套+量子套(睿治之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Providence": "遗器:铁卫套+量子套(睿治之径",
"Cavern_of_Corrosion_Path_of_Holy_Hymn": "遗器:防御套+雷套(圣颂之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Holy_Hymn": "遗器:防御套+雷套(圣颂之径",
"Cavern_of_Corrosion_Path_of_Conflagration": "遗器:火套+虚数套(野焰之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Conflagration": "遗器:火套+虚数套(野焰之径",
"Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遗器:生命套+速度套(药使之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遗器:生命套+速度套(药使之径",
"Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套幽冥之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Darkness": "遗器:追击套+dot套幽冥之径",
"Cavern_of_Corrosion_Path_of_Dreamdive": "遗器:负面套+击破套(梦潜之径•侵蚀隧洞", "Cavern_of_Corrosion_Path_of_Dreamdive": "遗器:负面套+击破套(梦潜之径",
"Cavern_of_Corrosion_Path_of_Cavalier": "遗器:超击破套+终追套(勇骑之径•侵蚀隧洞" "Cavern_of_Corrosion_Path_of_Cavalier": "遗器:超击破套+终追套(勇骑之径"
}, },
"Team": { "Team": {
"name": "打本队伍", "name": "打本队伍",
@ -393,6 +395,7 @@
"DanHeng": "丹恒", "DanHeng": "丹恒",
"DanHengImbibitorLunae": "丹恒•饮月", "DanHengImbibitorLunae": "丹恒•饮月",
"DrRatio": "真理医生", "DrRatio": "真理医生",
"Feixiao": "飞霄",
"Firefly": "流萤", "Firefly": "流萤",
"FuXuan": "符玄", "FuXuan": "符玄",
"Gallagher": "加拉赫", "Gallagher": "加拉赫",
@ -414,6 +417,7 @@
"March7thPreservation": "三月七•存护", "March7thPreservation": "三月七•存护",
"March7thTheHunt": "三月七•巡猎", "March7thTheHunt": "三月七•巡猎",
"Misha": "米沙", "Misha": "米沙",
"Moze": "貊泽",
"Natasha": "娜塔莎", "Natasha": "娜塔莎",
"Pela": "佩拉", "Pela": "佩拉",
"Qingque": "青雀", "Qingque": "青雀",
@ -567,13 +571,21 @@
"help": "" "help": ""
}, },
"Item_Raging_Heart": { "Item_Raging_Heart": {
"name": "角色晋阶材料:火(流萤 / 加拉赫 / 椒丘", "name": "角色晋阶材料:火(流萤 / 加拉赫 / 椒丘 / 灵砂",
"help": "" "help": ""
}, },
"Item_Dream_Fridge": { "Item_Dream_Fridge": {
"name": "角色晋阶材料:冰(米沙)", "name": "角色晋阶材料:冰(米沙)",
"help": "" "help": ""
}, },
"Item_Nail_of_the_Beast_Coffin": {
"name": "角色晋阶材料:雷(貊泽)",
"help": ""
},
"Item_A_Glass_of_the_Besotted_Era": {
"name": "角色晋阶材料:风(飞霄)",
"help": ""
},
"Item_Dream_Flamer": { "Item_Dream_Flamer": {
"name": "角色晋阶材料:量子(翡翠 / 花火)", "name": "角色晋阶材料:量子(翡翠 / 花火)",
"help": "" "help": ""
@ -658,6 +670,10 @@
"name": "尘梦的赞礼•历战余响 (匹诺康尼)", "name": "尘梦的赞礼•历战余响 (匹诺康尼)",
"help": "" "help": ""
}, },
"Item_Auspice_Sliver": {
"name": "心兽的战场•历战余响 (仙舟「罗浮」)",
"help": ""
},
"Item_Squirming_Core": { "Item_Squirming_Core": {
"name": "蠢动原核", "name": "蠢动原核",
"help": "" "help": ""
@ -703,7 +719,8 @@
"Echo_of_War_End_of_the_Eternal_Freeze": "寒潮的落幕•历战余响 (雅利洛-Ⅵ)", "Echo_of_War_End_of_the_Eternal_Freeze": "寒潮的落幕•历战余响 (雅利洛-Ⅵ)",
"Echo_of_War_Divine_Seed": "不死的神实•历战余响 (仙舟「罗浮」)", "Echo_of_War_Divine_Seed": "不死的神实•历战余响 (仙舟「罗浮」)",
"Echo_of_War_Borehole_Planet_Old_Crater": "蛀星的旧靥•历战余响 (空间站「黑塔」)", "Echo_of_War_Borehole_Planet_Old_Crater": "蛀星的旧靥•历战余响 (空间站「黑塔」)",
"Echo_of_War_Salutations_of_Ashen_Dreams": "尘梦的赞礼•历战余响 (匹诺康尼)" "Echo_of_War_Salutations_of_Ashen_Dreams": "尘梦的赞礼•历战余响 (匹诺康尼)",
"Echo_of_War_Inner_Beast_Battlefield": "心兽的战场•历战余响 (仙舟「罗浮」)"
}, },
"Team": { "Team": {
"name": "打本队伍", "name": "打本队伍",
@ -933,11 +950,11 @@
"World": { "World": {
"name": "模拟宇宙关卡", "name": "模拟宇宙关卡",
"help": "", "help": "",
"Simulated_Universe_World_3": "第三世界•模拟宇宙", "Simulated_Universe_World_3": "第三世界",
"Simulated_Universe_World_4": "第四世界•模拟宇宙", "Simulated_Universe_World_4": "第四世界",
"Simulated_Universe_World_5": "第五世界•模拟宇宙", "Simulated_Universe_World_5": "第五世界",
"Simulated_Universe_World_6": "第六世界•模拟宇宙", "Simulated_Universe_World_6": "第六世界",
"Simulated_Universe_World_8": "第八世界•模拟宇宙" "Simulated_Universe_World_8": "第八世界"
}, },
"Path": { "Path": {
"name": "命途", "name": "命途",
@ -1047,6 +1064,7 @@
"Dungeon": { "Dungeon": {
"name": "副本名称", "name": "副本名称",
"help": "", "help": "",
"Divergent_Universe_Famished_Worker": "Divergent_Universe_Famished_Worker蠹役饥肠",
"Divergent_Universe_Eternal_Comedy": "奔狼+火宫(永恒笑剧)", "Divergent_Universe_Eternal_Comedy": "奔狼+火宫(永恒笑剧)",
"Divergent_Universe_To_Sweet_Dreams": "茨冈尼亚+出云神国(伴你入眠)", "Divergent_Universe_To_Sweet_Dreams": "茨冈尼亚+出云神国(伴你入眠)",
"Divergent_Universe_Pouring_Blades": "苍穹+匹诺康尼(天剑如雨)", "Divergent_Universe_Pouring_Blades": "苍穹+匹诺康尼(天剑如雨)",

View File

@ -238,15 +238,15 @@
"Name": { "Name": {
"name": "副本名稱", "name": "副本名稱",
"help": "默認打本設定", "help": "默認打本設定",
"Calyx_Golden_Memories_Jarilo_VI": "材料:角色經驗(回憶之蕾•雅利洛-Ⅵ", "Calyx_Golden_Memories_Jarilo_VI": "材料:角色經驗(回憶之蕾",
"Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色經驗(回憶之蕾•仙舟羅浮", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色經驗(回憶之蕾",
"Calyx_Golden_Memories_Penacony": "材料:角色經驗(回憶之蕾•匹諾康尼", "Calyx_Golden_Memories_Penacony": "材料:角色經驗(回憶之蕾",
"Calyx_Golden_Aether_Jarilo_VI": "材料:武器經驗(乙太之蕾•雅利洛-Ⅵ", "Calyx_Golden_Aether_Jarilo_VI": "材料:武器經驗(乙太之蕾",
"Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器經驗(乙太之蕾•仙舟羅浮", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器經驗(乙太之蕾",
"Calyx_Golden_Aether_Penacony": "材料:武器經驗(乙太之蕾•匹諾康尼", "Calyx_Golden_Aether_Penacony": "材料:武器經驗(乙太之蕾",
"Calyx_Golden_Treasures_Jarilo_VI": "材料:信用點(藏珍之蕾•雅利洛-Ⅵ", "Calyx_Golden_Treasures_Jarilo_VI": "材料:信用點(藏珍之蕾",
"Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用點(藏珍之蕾•仙舟羅浮", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用點(藏珍之蕾",
"Calyx_Golden_Treasures_Penacony": "材料:信用點(藏珍之蕾•匹諾康尼", "Calyx_Golden_Treasures_Penacony": "材料:信用點(藏珍之蕾",
"Calyx_Crimson_Destruction_Herta_StorageZone": "行跡材料:毀滅(收容艙段)", "Calyx_Crimson_Destruction_Herta_StorageZone": "行跡材料:毀滅(收容艙段)",
"Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行跡材料:毀滅(鱗淵境)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行跡材料:毀滅(鱗淵境)",
"Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)",
@ -266,42 +266,44 @@
"Stagnant_Shadow_Duty": "角色晉階材料:物理(波提歐 / 知更鳥 / 雲璃)", "Stagnant_Shadow_Duty": "角色晉階材料:物理(波提歐 / 知更鳥 / 雲璃)",
"Stagnant_Shadow_Blaze": "角色晉階材料:火(姬子 / 艾絲妲 / 虎克)", "Stagnant_Shadow_Blaze": "角色晉階材料:火(姬子 / 艾絲妲 / 虎克)",
"Stagnant_Shadow_Scorch": "角色晉階材料:火(桂乃芬 / 托帕&帳帳)", "Stagnant_Shadow_Scorch": "角色晉階材料:火(桂乃芬 / 托帕&帳帳)",
"Stagnant_Shadow_Ire": "角色晉階材料:火(流螢 / 加拉赫 / 椒丘", "Stagnant_Shadow_Ire": "角色晉階材料:火(流螢 / 加拉赫 / 椒丘 / 靈砂",
"Stagnant_Shadow_Rime": "角色晉階材料:冰(三月七 / 黑塔 / 傑帕德 / 佩拉)", "Stagnant_Shadow_Rime": "角色晉階材料:冰(三月七 / 黑塔 / 傑帕德 / 佩拉)",
"Stagnant_Shadow_Icicle": "角色晉階材料:冰(彥卿 / 鏡流 / 阮•梅)", "Stagnant_Shadow_Icicle": "角色晉階材料:冰(彥卿 / 鏡流 / 阮•梅)",
"Stagnant_Shadow_Nectar": "角色晉階材料:冰(米沙)", "Stagnant_Shadow_Nectar": "角色晉階材料:冰(米沙)",
"Stagnant_Shadow_Fulmination": "角色晉階材料:雷(阿蘭 / 希露瓦 / 停雲 / 白露)", "Stagnant_Shadow_Fulmination": "角色晉階材料:雷(阿蘭 / 希露瓦 / 停雲 / 白露)",
"Stagnant_Shadow_Doom": "角色晉階材料:雷(卡芙卡 / 景元 / 黃泉)", "Stagnant_Shadow_Doom": "角色晉階材料:雷(卡芙卡 / 景元 / 黃泉)",
"Stagnant_Shadow_Mechwolf": "角色晉階材料:雷(貊澤)",
"Stagnant_Shadow_Gust": "角色晉階材料:風(丹恆 / 布洛妮婭 / 桑博)", "Stagnant_Shadow_Gust": "角色晉階材料:風(丹恆 / 布洛妮婭 / 桑博)",
"Stagnant_Shadow_Celestial": "角色晉階材料:風(刃 / 藿藿 / 黑天鵝)", "Stagnant_Shadow_Celestial": "角色晉階材料:風(刃 / 藿藿 / 黑天鵝)",
"Stagnant_Shadow_Gloam": "角色晉階材料:風(飛霄)",
"Stagnant_Shadow_Quanta": "角色晉階材料:量子(銀狼 / 希兒 / 青雀)", "Stagnant_Shadow_Quanta": "角色晉階材料:量子(銀狼 / 希兒 / 青雀)",
"Stagnant_Shadow_Abomination": "角色晉階材料:量子(玲可 / 符玄 / 雪衣)", "Stagnant_Shadow_Abomination": "角色晉階材料:量子(玲可 / 符玄 / 雪衣)",
"Stagnant_Shadow_Roast": "角色晉階材料:量子(翡翠 / 花火)", "Stagnant_Shadow_Roast": "角色晉階材料:量子(翡翠 / 花火)",
"Stagnant_Shadow_Mirage": "角色晉階材料:虛數(瓦爾特 / 羅剎 / 馭空)", "Stagnant_Shadow_Mirage": "角色晉階材料:虛數(瓦爾特 / 羅剎 / 馭空)",
"Stagnant_Shadow_Puppetry": "角色晉階材料:虛數(丹恆•飲月 / 砂金 / 真理醫生)", "Stagnant_Shadow_Puppetry": "角色晉階材料:虛數(丹恆•飲月 / 砂金 / 真理醫生)",
"Cavern_of_Corrosion_Path_of_Gelid_Wind": "遺器:冰套+風套(霜風之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "遺器:冰套+風套(霜風之徑",
"Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遺器:物理套+擊破套(迅拳之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遺器:物理套+擊破套(迅拳之徑",
"Cavern_of_Corrosion_Path_of_Drifting": "遺器:治療套+快槍手(漂泊之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Drifting": "遺器:治療套+快槍手(漂泊之徑",
"Cavern_of_Corrosion_Path_of_Providence": "遺器:鐵衛套+量子套(睿治之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Providence": "遺器:鐵衛套+量子套(睿治之徑",
"Cavern_of_Corrosion_Path_of_Holy_Hymn": "遺器:防禦套+雷套(聖頌之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Holy_Hymn": "遺器:防禦套+雷套(聖頌之徑",
"Cavern_of_Corrosion_Path_of_Conflagration": "遺器:火套+虛數套(野焰之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Conflagration": "遺器:火套+虛數套(野焰之徑",
"Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遺器:生命套+速度套(藥使之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遺器:生命套+速度套(藥使之徑",
"Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套幽冥之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套幽冥之徑",
"Cavern_of_Corrosion_Path_of_Dreamdive": "遺器:負面套+擊破套(夢潛之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Dreamdive": "遺器:負面套+擊破套(夢潛之徑)",
"Cavern_of_Corrosion_Path_of_Cavalier": "遺器:超擊破套+終追套(勇騎之徑•侵蝕隧洞" "Cavern_of_Corrosion_Path_of_Cavalier": "遺器:超擊破套+終追套(勇騎之徑"
}, },
"NameAtDoubleCalyx": { "NameAtDoubleCalyx": {
"name": "有雙倍花活動時,選擇副本", "name": "有雙倍花活動時,選擇副本",
"help": "次數耗儘後回退到默認打本設定", "help": "次數耗儘後回退到默認打本設定",
"Calyx_Golden_Memories_Jarilo_VI": "材料:角色經驗(回憶之蕾•雅利洛-Ⅵ", "Calyx_Golden_Memories_Jarilo_VI": "材料:角色經驗(回憶之蕾",
"Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色經驗(回憶之蕾•仙舟羅浮", "Calyx_Golden_Memories_The_Xianzhou_Luofu": "材料:角色經驗(回憶之蕾",
"Calyx_Golden_Memories_Penacony": "材料:角色經驗(回憶之蕾•匹諾康尼", "Calyx_Golden_Memories_Penacony": "材料:角色經驗(回憶之蕾",
"Calyx_Golden_Aether_Jarilo_VI": "材料:武器經驗(乙太之蕾•雅利洛-Ⅵ", "Calyx_Golden_Aether_Jarilo_VI": "材料:武器經驗(乙太之蕾",
"Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器經驗(乙太之蕾•仙舟羅浮", "Calyx_Golden_Aether_The_Xianzhou_Luofu": "材料:武器經驗(乙太之蕾",
"Calyx_Golden_Aether_Penacony": "材料:武器經驗(乙太之蕾•匹諾康尼", "Calyx_Golden_Aether_Penacony": "材料:武器經驗(乙太之蕾",
"Calyx_Golden_Treasures_Jarilo_VI": "材料:信用點(藏珍之蕾•雅利洛-Ⅵ", "Calyx_Golden_Treasures_Jarilo_VI": "材料:信用點(藏珍之蕾",
"Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用點(藏珍之蕾•仙舟羅浮", "Calyx_Golden_Treasures_The_Xianzhou_Luofu": "材料:信用點(藏珍之蕾",
"Calyx_Golden_Treasures_Penacony": "材料:信用點(藏珍之蕾•匹諾康尼", "Calyx_Golden_Treasures_Penacony": "材料:信用點(藏珍之蕾",
"Calyx_Crimson_Destruction_Herta_StorageZone": "行跡材料:毀滅(收容艙段)", "Calyx_Crimson_Destruction_Herta_StorageZone": "行跡材料:毀滅(收容艙段)",
"Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行跡材料:毀滅(鱗淵境)", "Calyx_Crimson_Destruction_Luofu_ScalegorgeWaterscape": "行跡材料:毀滅(鱗淵境)",
"Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)", "Calyx_Crimson_Preservation_Herta_SupplyZone": "行跡材料:存護(支援艙段)",
@ -320,16 +322,16 @@
"NameAtDoubleRelic": { "NameAtDoubleRelic": {
"name": "有遺器活動時,選擇副本", "name": "有遺器活動時,選擇副本",
"help": "次數耗儘後回退到默認打本設定", "help": "次數耗儘後回退到默認打本設定",
"Cavern_of_Corrosion_Path_of_Gelid_Wind": "遺器:冰套+風套(霜風之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Gelid_Wind": "遺器:冰套+風套(霜風之徑",
"Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遺器:物理套+擊破套(迅拳之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Jabbing_Punch": "遺器:物理套+擊破套(迅拳之徑",
"Cavern_of_Corrosion_Path_of_Drifting": "遺器:治療套+快槍手(漂泊之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Drifting": "遺器:治療套+快槍手(漂泊之徑",
"Cavern_of_Corrosion_Path_of_Providence": "遺器:鐵衛套+量子套(睿治之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Providence": "遺器:鐵衛套+量子套(睿治之徑",
"Cavern_of_Corrosion_Path_of_Holy_Hymn": "遺器:防禦套+雷套(聖頌之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Holy_Hymn": "遺器:防禦套+雷套(聖頌之徑",
"Cavern_of_Corrosion_Path_of_Conflagration": "遺器:火套+虛數套(野焰之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Conflagration": "遺器:火套+虛數套(野焰之徑",
"Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遺器:生命套+速度套(藥使之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "遺器:生命套+速度套(藥使之徑",
"Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套幽冥之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Darkness": "遺器:追擊套+dot套幽冥之徑",
"Cavern_of_Corrosion_Path_of_Dreamdive": "遺器:負面套+擊破套(夢潛之徑•侵蝕隧洞", "Cavern_of_Corrosion_Path_of_Dreamdive": "遺器:負面套+擊破套(夢潛之徑)",
"Cavern_of_Corrosion_Path_of_Cavalier": "遺器:超擊破套+終追套(勇騎之徑•侵蝕隧洞" "Cavern_of_Corrosion_Path_of_Cavalier": "遺器:超擊破套+終追套(勇騎之徑"
}, },
"Team": { "Team": {
"name": "打本隊伍", "name": "打本隊伍",
@ -393,6 +395,7 @@
"DanHeng": "丹恆", "DanHeng": "丹恆",
"DanHengImbibitorLunae": "丹恆•飲月", "DanHengImbibitorLunae": "丹恆•飲月",
"DrRatio": "真理醫生", "DrRatio": "真理醫生",
"Feixiao": "飛霄",
"Firefly": "流螢", "Firefly": "流螢",
"FuXuan": "符玄", "FuXuan": "符玄",
"Gallagher": "加拉赫", "Gallagher": "加拉赫",
@ -414,6 +417,7 @@
"March7thPreservation": "三月七•存護", "March7thPreservation": "三月七•存護",
"March7thTheHunt": "三月七•巡獵", "March7thTheHunt": "三月七•巡獵",
"Misha": "米沙", "Misha": "米沙",
"Moze": "貊澤",
"Natasha": "娜塔莎", "Natasha": "娜塔莎",
"Pela": "佩拉", "Pela": "佩拉",
"Qingque": "青雀", "Qingque": "青雀",
@ -567,13 +571,21 @@
"help": "" "help": ""
}, },
"Item_Raging_Heart": { "Item_Raging_Heart": {
"name": "角色晉階材料:火(流螢 / 加拉赫 / 椒丘", "name": "角色晉階材料:火(流螢 / 加拉赫 / 椒丘 / 靈砂",
"help": "" "help": ""
}, },
"Item_Dream_Fridge": { "Item_Dream_Fridge": {
"name": "角色晉階材料:冰(米沙)", "name": "角色晉階材料:冰(米沙)",
"help": "" "help": ""
}, },
"Item_Nail_of_the_Beast_Coffin": {
"name": "角色晉階材料:雷(貊澤)",
"help": ""
},
"Item_A_Glass_of_the_Besotted_Era": {
"name": "角色晉階材料:風(飛霄)",
"help": ""
},
"Item_Dream_Flamer": { "Item_Dream_Flamer": {
"name": "角色晉階材料:量子(翡翠 / 花火)", "name": "角色晉階材料:量子(翡翠 / 花火)",
"help": "" "help": ""
@ -658,6 +670,10 @@
"name": "塵夢的讚禮•歷戰餘響 (匹諾康尼)", "name": "塵夢的讚禮•歷戰餘響 (匹諾康尼)",
"help": "" "help": ""
}, },
"Item_Auspice_Sliver": {
"name": "心獸的戰場•歷戰餘響 (仙舟「羅浮」)",
"help": ""
},
"Item_Squirming_Core": { "Item_Squirming_Core": {
"name": "蠢動原核", "name": "蠢動原核",
"help": "" "help": ""
@ -703,7 +719,8 @@
"Echo_of_War_End_of_the_Eternal_Freeze": "寒潮的落幕•歷戰餘響 (雅利洛-Ⅵ)", "Echo_of_War_End_of_the_Eternal_Freeze": "寒潮的落幕•歷戰餘響 (雅利洛-Ⅵ)",
"Echo_of_War_Divine_Seed": "不死的神實•歷戰餘響 (仙舟「羅浮」)", "Echo_of_War_Divine_Seed": "不死的神實•歷戰餘響 (仙舟「羅浮」)",
"Echo_of_War_Borehole_Planet_Old_Crater": "蛀星的舊靨•歷戰餘響 (太空站「黑塔」)", "Echo_of_War_Borehole_Planet_Old_Crater": "蛀星的舊靨•歷戰餘響 (太空站「黑塔」)",
"Echo_of_War_Salutations_of_Ashen_Dreams": "塵夢的讚禮•歷戰餘響 (匹諾康尼)" "Echo_of_War_Salutations_of_Ashen_Dreams": "塵夢的讚禮•歷戰餘響 (匹諾康尼)",
"Echo_of_War_Inner_Beast_Battlefield": "心獸的戰場•歷戰餘響 (仙舟「羅浮」)"
}, },
"Team": { "Team": {
"name": "打本隊伍", "name": "打本隊伍",
@ -933,11 +950,11 @@
"World": { "World": {
"name": "模拟宇宙关卡", "name": "模拟宇宙关卡",
"help": "", "help": "",
"Simulated_Universe_World_3": "第三世界•模擬宇宙", "Simulated_Universe_World_3": "第三世界",
"Simulated_Universe_World_4": "第四世界•模擬宇宙", "Simulated_Universe_World_4": "第四世界",
"Simulated_Universe_World_5": "第五世界•模擬宇宙", "Simulated_Universe_World_5": "第五世界",
"Simulated_Universe_World_6": "第六世界•模擬宇宙", "Simulated_Universe_World_6": "第六世界",
"Simulated_Universe_World_8": "第八世界•模擬宇宙" "Simulated_Universe_World_8": "第八世界"
}, },
"Path": { "Path": {
"name": "命途", "name": "命途",
@ -1047,6 +1064,7 @@
"Dungeon": { "Dungeon": {
"name": "副本名稱", "name": "副本名稱",
"help": "", "help": "",
"Divergent_Universe_Famished_Worker": "Divergent_Universe_Famished_Worker蠹役飢腸",
"Divergent_Universe_Eternal_Comedy": "奔狼+火宮(永恆笑劇)", "Divergent_Universe_Eternal_Comedy": "奔狼+火宮(永恆笑劇)",
"Divergent_Universe_To_Sweet_Dreams": "茨岡尼亞+出雲神國(伴你入眠)", "Divergent_Universe_To_Sweet_Dreams": "茨岡尼亞+出雲神國(伴你入眠)",
"Divergent_Universe_Pouring_Blades": "天空+匹諾康尼(天劍如雨)", "Divergent_Universe_Pouring_Blades": "天空+匹諾康尼(天劍如雨)",

View File

@ -56,6 +56,8 @@ class StoredGenerated:
Item_IPC_Work_Permit = StoredPlanner("Dungeon.Planner.Item_IPC_Work_Permit") Item_IPC_Work_Permit = StoredPlanner("Dungeon.Planner.Item_IPC_Work_Permit")
Item_Raging_Heart = StoredPlanner("Dungeon.Planner.Item_Raging_Heart") Item_Raging_Heart = StoredPlanner("Dungeon.Planner.Item_Raging_Heart")
Item_Dream_Fridge = StoredPlanner("Dungeon.Planner.Item_Dream_Fridge") Item_Dream_Fridge = StoredPlanner("Dungeon.Planner.Item_Dream_Fridge")
Item_Nail_of_the_Beast_Coffin = StoredPlanner("Dungeon.Planner.Item_Nail_of_the_Beast_Coffin")
Item_A_Glass_of_the_Besotted_Era = StoredPlanner("Dungeon.Planner.Item_A_Glass_of_the_Besotted_Era")
Item_Dream_Flamer = StoredPlanner("Dungeon.Planner.Item_Dream_Flamer") Item_Dream_Flamer = StoredPlanner("Dungeon.Planner.Item_Dream_Flamer")
Item_Worldbreaker_Blade = StoredPlanner("Dungeon.Planner.Item_Worldbreaker_Blade") Item_Worldbreaker_Blade = StoredPlanner("Dungeon.Planner.Item_Worldbreaker_Blade")
Item_Arrow_of_the_Starchaser = StoredPlanner("Dungeon.Planner.Item_Arrow_of_the_Starchaser") Item_Arrow_of_the_Starchaser = StoredPlanner("Dungeon.Planner.Item_Arrow_of_the_Starchaser")
@ -77,6 +79,7 @@ class StoredGenerated:
Item_Regret_of_Infinite_Ochema = StoredPlanner("Dungeon.Planner.Item_Regret_of_Infinite_Ochema") Item_Regret_of_Infinite_Ochema = StoredPlanner("Dungeon.Planner.Item_Regret_of_Infinite_Ochema")
Item_Past_Evils_of_the_Borehole_Planet_Disaster = StoredPlanner("Dungeon.Planner.Item_Past_Evils_of_the_Borehole_Planet_Disaster") Item_Past_Evils_of_the_Borehole_Planet_Disaster = StoredPlanner("Dungeon.Planner.Item_Past_Evils_of_the_Borehole_Planet_Disaster")
Item_Lost_Echo_of_the_Shared_Wish = StoredPlanner("Dungeon.Planner.Item_Lost_Echo_of_the_Shared_Wish") Item_Lost_Echo_of_the_Shared_Wish = StoredPlanner("Dungeon.Planner.Item_Lost_Echo_of_the_Shared_Wish")
Item_Auspice_Sliver = StoredPlanner("Dungeon.Planner.Item_Auspice_Sliver")
Item_Squirming_Core = StoredPlanner("Dungeon.Planner.Item_Squirming_Core") Item_Squirming_Core = StoredPlanner("Dungeon.Planner.Item_Squirming_Core")
Item_Conqueror_Will = StoredPlanner("Dungeon.Planner.Item_Conqueror_Will") Item_Conqueror_Will = StoredPlanner("Dungeon.Planner.Item_Conqueror_Will")
Item_Silvermane_Medal = StoredPlanner("Dungeon.Planner.Item_Silvermane_Medal") Item_Silvermane_Medal = StoredPlanner("Dungeon.Planner.Item_Silvermane_Medal")

View File

@ -2,6 +2,7 @@ import json
import os import os
import random import random
import string import string
from collections import deque
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
import yaml import yaml
@ -190,57 +191,95 @@ def alas_instance():
def deep_get(d, keys, default=None): def deep_get(d, keys, default=None):
""" # 240 + 30 * depth (ns)
Get values in dictionary safely. if type(keys) is str:
https://stackoverflow.com/questions/25833613/safe-method-to-get-value-of-nested-dictionary
Args:
d (dict):
keys (str, list): Such as `Scheduler.NextRun.value`
default: Default return if key not found.
Returns:
"""
if isinstance(keys, str):
keys = keys.split('.') keys = keys.split('.')
assert type(keys) is list
if d is None: try:
return default for k in keys:
if not keys: d = d[k]
return d return d
return deep_get(d.get(keys[0]), keys[1:], default) # No such key
except KeyError:
return default
# Input `keys` is not iterable or input `d` is not dict
except TypeError:
return default
def deep_set(d, keys, value): def deep_set(d, keys, value):
""" """
Set value into dictionary safely, imitating deep_get(). Set value into dictionary safely, imitating deep_get().
""" """
if isinstance(keys, str): # 150 * depth (ns)
if type(keys) is str:
keys = keys.split('.') keys = keys.split('.')
assert type(keys) is list
if not keys: first = True
return value exist = True
if not isinstance(d, dict): prev_d = None
d = {} prev_k = None
d[keys[0]] = deep_set(d.get(keys[0], {}), keys[1:], value) prev_k2 = None
return d try:
for k in keys:
if first:
prev_d = d
prev_k = k
first = False
continue
try:
# if key in dict: dict[key] > dict.get > dict.setdefault > try dict[key] except
if exist and prev_k in d:
prev_d = d
d = d[prev_k]
else:
exist = False
new = {}
d[prev_k] = new
d = new
except TypeError:
# `d` is not dict
exist = False
d = {}
prev_d[prev_k2] = {prev_k: d}
prev_k2 = prev_k
prev_k = k
# prev_k2, prev_k = prev_k, k
# Input `keys` is not iterable
except TypeError:
return
# Last key, set value
try:
d[prev_k] = value
return
# Last value `d` is not dict
except TypeError:
prev_d[prev_k2] = {prev_k: value}
return
def deep_pop(d, keys, default=None): def deep_pop(d, keys, default=None):
""" if type(keys) is str:
Pop value from dictionary safely, imitating deep_get().
"""
if isinstance(keys, str):
keys = keys.split('.') keys = keys.split('.')
assert type(keys) is list
if not isinstance(d, dict): try:
for k in keys[:-1]:
d = d[k]
return d.pop(keys[-1], default)
# No such key
except KeyError:
return default return default
if not keys: # Input `keys` is not iterable or input `d` is not dict
except TypeError:
return default
# Input `keys` out of index
except IndexError:
return default
# Last `d` is not dict
except AttributeError:
return default return default
elif len(keys) == 1:
return d.pop(keys[0], default)
return deep_pop(d.get(keys[0]), keys[1:], default)
def deep_default(d, keys, value): def deep_default(d, keys, value):
@ -262,26 +301,75 @@ def deep_default(d, keys, value):
return d return d
def deep_iter(data, depth=0, current_depth=1): def deep_iter(data, min_depth=None, depth=3):
""" """
Iter a dictionary safely. 300us on alas.json depth=3 (530+ rows)
Args: Args:
data (dict): data:
depth (int): Maximum depth to iter min_depth:
current_depth (int): depth:
Returns: Returns:
list: Key path
Any:
""" """
if isinstance(data, dict) \ if min_depth is None:
and (depth and current_depth <= depth): min_depth = depth
for key, value in data.items(): assert 1 <= min_depth <= depth
for child_path, child_value in deep_iter(value, depth=depth, current_depth=current_depth + 1):
yield [key] + child_path, child_value # Equivalent to dict.items()
else: try:
yield [], data if depth == 1:
for k, v in data.items():
yield [k], v
return
# Iter first depth
elif min_depth == 1:
q = deque()
for k, v in data.items():
key = [k]
if type(v) is dict:
q.append((key, v))
else:
yield key, v
# Iter target depth only
else:
q = deque()
for k, v in data.items():
key = [k]
if type(v) is dict:
q.append((key, v))
except AttributeError:
# `data` is not dict
return
# Iter depths
current = 2
while current <= depth:
new_q = deque()
# max depth
if current == depth:
for key, data in q:
for k, v in data.items():
yield key + [k], v
# in target depth
elif min_depth <= current < depth:
for key, data in q:
for k, v in data.items():
subkey = key + [k]
if type(v) is dict:
new_q.append((subkey, v))
else:
yield subkey, v
# Haven't reached min depth
else:
for key, data in q:
for k, v in data.items():
subkey = key + [k]
if type(v) is dict:
new_q.append((subkey, v))
q = new_q
current += 1
def parse_value(value, data): def parse_value(value, data):

View File

@ -721,7 +721,12 @@ class Connection(ConnectionAttr):
serial_list (list[str]): serial_list (list[str]):
""" """
import asyncio import asyncio
from concurrent.futures import ThreadPoolExecutor
ev = asyncio.new_event_loop() ev = asyncio.new_event_loop()
pool = ThreadPoolExecutor(
max_workers=len(serial_list),
thread_name_prefix='adb_brute_force_connect',
)
def _connect(serial): def _connect(serial):
msg = self.adb_client.connect(serial) msg = self.adb_client.connect(serial)
@ -729,10 +734,12 @@ class Connection(ConnectionAttr):
return msg return msg
async def connect(): async def connect():
tasks = [ev.run_in_executor(None, _connect, serial) for serial in serial_list] tasks = [ev.run_in_executor(pool, _connect, serial) for serial in serial_list]
await asyncio.gather(*tasks) await asyncio.gather(*tasks)
ev.run_until_complete(connect()) ev.run_until_complete(connect())
pool.shutdown(wait=False)
ev.close()
@Config.when(DEVICE_OVER_HTTP=True) @Config.when(DEVICE_OVER_HTTP=True)
def adb_connect(self): def adb_connect(self):

View File

@ -275,11 +275,25 @@ class NemuIpcImpl:
def __exit__(self, exc_type, exc_val, exc_tb): def __exit__(self, exc_type, exc_val, exc_tb):
self.disconnect() self.disconnect()
if has_cached_property(self, '_ev'):
self._ev.close()
del_cached_property(self, '_ev')
if has_cached_property(self, '_pool'):
self._pool.shutdown(wait=False)
del_cached_property(self, '_pool')
@cached_property @cached_property
def _ev(self): def _ev(self):
return asyncio.new_event_loop() return asyncio.new_event_loop()
@cached_property
def _pool(self):
from concurrent.futures import ThreadPoolExecutor
return ThreadPoolExecutor(
max_workers=1,
thread_name_prefix='NemuIpc',
)
async def ev_run_async(self, func, *args, timeout=0.15, **kwargs): async def ev_run_async(self, func, *args, timeout=0.15, **kwargs):
""" """
Args: Args:
@ -294,7 +308,7 @@ class NemuIpcImpl:
func_wrapped = partial(func, *args, **kwargs) func_wrapped = partial(func, *args, **kwargs)
# Increased timeout for slow PCs # 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 # 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=timeout) result = await asyncio.wait_for(self._ev.run_in_executor(self._pool, func_wrapped), timeout=timeout)
return result return result
def ev_run_sync(self, func, *args, **kwargs): def ev_run_sync(self, func, *args, **kwargs):

View File

@ -129,8 +129,17 @@ DrRatio = CharacterList(
jp='Dr.レイシオ', jp='Dr.レイシオ',
es='Dr. Ratio', es='Dr. Ratio',
) )
Firefly = CharacterList( Feixiao = CharacterList(
id=15, id=15,
name='Feixiao',
cn='飞霄',
cht='飛霄',
en='Feixiao',
jp='飛霄',
es='Feixiao',
)
Firefly = CharacterList(
id=16,
name='Firefly', name='Firefly',
cn='流萤', cn='流萤',
cht='流螢', cht='流螢',
@ -139,7 +148,7 @@ Firefly = CharacterList(
es='Luciérnaga', es='Luciérnaga',
) )
FuXuan = CharacterList( FuXuan = CharacterList(
id=16, id=17,
name='FuXuan', name='FuXuan',
cn='符玄', cn='符玄',
cht='符玄', cht='符玄',
@ -148,7 +157,7 @@ FuXuan = CharacterList(
es='Fu Xuan', es='Fu Xuan',
) )
Gallagher = CharacterList( Gallagher = CharacterList(
id=17, id=18,
name='Gallagher', name='Gallagher',
cn='加拉赫', cn='加拉赫',
cht='加拉赫', cht='加拉赫',
@ -157,7 +166,7 @@ Gallagher = CharacterList(
es='Gallagher', es='Gallagher',
) )
Gepard = CharacterList( Gepard = CharacterList(
id=18, id=19,
name='Gepard', name='Gepard',
cn='杰帕德', cn='杰帕德',
cht='傑帕德', cht='傑帕德',
@ -166,7 +175,7 @@ Gepard = CharacterList(
es='Gepard', es='Gepard',
) )
Guinaifen = CharacterList( Guinaifen = CharacterList(
id=19, id=20,
name='Guinaifen', name='Guinaifen',
cn='桂乃芬', cn='桂乃芬',
cht='桂乃芬', cht='桂乃芬',
@ -175,7 +184,7 @@ Guinaifen = CharacterList(
es='Guinaifen', es='Guinaifen',
) )
Hanya = CharacterList( Hanya = CharacterList(
id=20, id=21,
name='Hanya', name='Hanya',
cn='寒鸦', cn='寒鸦',
cht='寒鴉', cht='寒鴉',
@ -184,7 +193,7 @@ Hanya = CharacterList(
es='Hanya', es='Hanya',
) )
Herta = CharacterList( Herta = CharacterList(
id=21, id=22,
name='Herta', name='Herta',
cn='黑塔', cn='黑塔',
cht='黑塔', cht='黑塔',
@ -193,7 +202,7 @@ Herta = CharacterList(
es='Herta', es='Herta',
) )
Himeko = CharacterList( Himeko = CharacterList(
id=22, id=23,
name='Himeko', name='Himeko',
cn='姬子', cn='姬子',
cht='姬子', cht='姬子',
@ -202,7 +211,7 @@ Himeko = CharacterList(
es='Himeko', es='Himeko',
) )
Hook = CharacterList( Hook = CharacterList(
id=23, id=24,
name='Hook', name='Hook',
cn='虎克', cn='虎克',
cht='虎克', cht='虎克',
@ -211,7 +220,7 @@ Hook = CharacterList(
es='Hook', es='Hook',
) )
Huohuo = CharacterList( Huohuo = CharacterList(
id=24, id=25,
name='Huohuo', name='Huohuo',
cn='藿藿', cn='藿藿',
cht='藿藿', cht='藿藿',
@ -220,7 +229,7 @@ Huohuo = CharacterList(
es='Huohuo', es='Huohuo',
) )
Jade = CharacterList( Jade = CharacterList(
id=25, id=26,
name='Jade', name='Jade',
cn='翡翠', cn='翡翠',
cht='翡翠', cht='翡翠',
@ -229,7 +238,7 @@ Jade = CharacterList(
es='Jade', es='Jade',
) )
Jiaoqiu = CharacterList( Jiaoqiu = CharacterList(
id=26, id=27,
name='Jiaoqiu', name='Jiaoqiu',
cn='椒丘', cn='椒丘',
cht='椒丘', cht='椒丘',
@ -238,7 +247,7 @@ Jiaoqiu = CharacterList(
es='Jiaoqiu', es='Jiaoqiu',
) )
JingYuan = CharacterList( JingYuan = CharacterList(
id=27, id=28,
name='JingYuan', name='JingYuan',
cn='景元', cn='景元',
cht='景元', cht='景元',
@ -247,7 +256,7 @@ JingYuan = CharacterList(
es='Jing Yuan', es='Jing Yuan',
) )
Jingliu = CharacterList( Jingliu = CharacterList(
id=28, id=29,
name='Jingliu', name='Jingliu',
cn='镜流', cn='镜流',
cht='鏡流', cht='鏡流',
@ -256,7 +265,7 @@ Jingliu = CharacterList(
es='Jingliu', es='Jingliu',
) )
Kafka = CharacterList( Kafka = CharacterList(
id=29, id=30,
name='Kafka', name='Kafka',
cn='卡芙卡', cn='卡芙卡',
cht='卡芙卡', cht='卡芙卡',
@ -264,8 +273,17 @@ Kafka = CharacterList(
jp='カフカ', jp='カフカ',
es='Kafka', es='Kafka',
) )
Lingsha = CharacterList(
id=31,
name='Lingsha',
cn='灵砂',
cht='靈砂',
en='Lingsha',
jp='霊砂',
es='Lingsha',
)
Luka = CharacterList( Luka = CharacterList(
id=30, id=32,
name='Luka', name='Luka',
cn='卢卡', cn='卢卡',
cht='盧卡', cht='盧卡',
@ -274,7 +292,7 @@ Luka = CharacterList(
es='Luka', es='Luka',
) )
Luocha = CharacterList( Luocha = CharacterList(
id=31, id=33,
name='Luocha', name='Luocha',
cn='罗刹', cn='罗刹',
cht='羅剎', cht='羅剎',
@ -283,7 +301,7 @@ Luocha = CharacterList(
es='Luocha', es='Luocha',
) )
Lynx = CharacterList( Lynx = CharacterList(
id=32, id=34,
name='Lynx', name='Lynx',
cn='玲可', cn='玲可',
cht='玲可', cht='玲可',
@ -292,7 +310,7 @@ Lynx = CharacterList(
es='Lynx', es='Lynx',
) )
March7thPreservation = CharacterList( March7thPreservation = CharacterList(
id=33, id=35,
name='March7thPreservation', name='March7thPreservation',
cn='三月七•存护', cn='三月七•存护',
cht='三月七•存護', cht='三月七•存護',
@ -301,7 +319,7 @@ March7thPreservation = CharacterList(
es='Siete de Marzo: Conservación', es='Siete de Marzo: Conservación',
) )
March7thTheHunt = CharacterList( March7thTheHunt = CharacterList(
id=34, id=36,
name='March7thTheHunt', name='March7thTheHunt',
cn='三月七•巡猎', cn='三月七•巡猎',
cht='三月七•巡獵', cht='三月七•巡獵',
@ -310,7 +328,7 @@ March7thTheHunt = CharacterList(
es='Siete de Marzo: Cacería', es='Siete de Marzo: Cacería',
) )
Misha = CharacterList( Misha = CharacterList(
id=35, id=37,
name='Misha', name='Misha',
cn='米沙', cn='米沙',
cht='米沙', cht='米沙',
@ -318,8 +336,17 @@ Misha = CharacterList(
jp='ミーシャ', jp='ミーシャ',
es='Misha', es='Misha',
) )
Moze = CharacterList(
id=38,
name='Moze',
cn='貊泽',
cht='貊澤',
en='Moze',
jp='モゼ',
es='Moze',
)
Natasha = CharacterList( Natasha = CharacterList(
id=36, id=39,
name='Natasha', name='Natasha',
cn='娜塔莎', cn='娜塔莎',
cht='娜塔莎', cht='娜塔莎',
@ -328,7 +355,7 @@ Natasha = CharacterList(
es='Natasha', es='Natasha',
) )
Pela = CharacterList( Pela = CharacterList(
id=37, id=40,
name='Pela', name='Pela',
cn='佩拉', cn='佩拉',
cht='佩拉', cht='佩拉',
@ -337,7 +364,7 @@ Pela = CharacterList(
es='Pela', es='Pela',
) )
Qingque = CharacterList( Qingque = CharacterList(
id=38, id=41,
name='Qingque', name='Qingque',
cn='青雀', cn='青雀',
cht='青雀', cht='青雀',
@ -346,7 +373,7 @@ Qingque = CharacterList(
es='Qingque', es='Qingque',
) )
Robin = CharacterList( Robin = CharacterList(
id=39, id=42,
name='Robin', name='Robin',
cn='知更鸟', cn='知更鸟',
cht='知更鳥', cht='知更鳥',
@ -355,7 +382,7 @@ Robin = CharacterList(
es='Robin', es='Robin',
) )
RuanMei = CharacterList( RuanMei = CharacterList(
id=40, id=43,
name='RuanMei', name='RuanMei',
cn='阮•梅', cn='阮•梅',
cht='阮•梅', cht='阮•梅',
@ -364,7 +391,7 @@ RuanMei = CharacterList(
es='Ruan Mei', es='Ruan Mei',
) )
Sampo = CharacterList( Sampo = CharacterList(
id=41, id=44,
name='Sampo', name='Sampo',
cn='桑博', cn='桑博',
cht='桑博', cht='桑博',
@ -373,7 +400,7 @@ Sampo = CharacterList(
es='Sampo', es='Sampo',
) )
Seele = CharacterList( Seele = CharacterList(
id=42, id=45,
name='Seele', name='Seele',
cn='希儿', cn='希儿',
cht='希兒', cht='希兒',
@ -382,7 +409,7 @@ Seele = CharacterList(
es='Seele', es='Seele',
) )
Serval = CharacterList( Serval = CharacterList(
id=43, id=46,
name='Serval', name='Serval',
cn='希露瓦', cn='希露瓦',
cht='希露瓦', cht='希露瓦',
@ -391,7 +418,7 @@ Serval = CharacterList(
es='Serval', es='Serval',
) )
SilverWolf = CharacterList( SilverWolf = CharacterList(
id=44, id=47,
name='SilverWolf', name='SilverWolf',
cn='银狼', cn='银狼',
cht='銀狼', cht='銀狼',
@ -400,7 +427,7 @@ SilverWolf = CharacterList(
es='Silver Wolf', es='Silver Wolf',
) )
Sparkle = CharacterList( Sparkle = CharacterList(
id=45, id=48,
name='Sparkle', name='Sparkle',
cn='花火', cn='花火',
cht='花火', cht='花火',
@ -409,7 +436,7 @@ Sparkle = CharacterList(
es='Sparkle', es='Sparkle',
) )
Sushang = CharacterList( Sushang = CharacterList(
id=46, id=49,
name='Sushang', name='Sushang',
cn='素裳', cn='素裳',
cht='素裳', cht='素裳',
@ -418,7 +445,7 @@ Sushang = CharacterList(
es='Sushang', es='Sushang',
) )
Tingyun = CharacterList( Tingyun = CharacterList(
id=47, id=50,
name='Tingyun', name='Tingyun',
cn='停云', cn='停云',
cht='停雲', cht='停雲',
@ -427,7 +454,7 @@ Tingyun = CharacterList(
es='Tingyun', es='Tingyun',
) )
TopazNumby = CharacterList( TopazNumby = CharacterList(
id=48, id=51,
name='TopazNumby', name='TopazNumby',
cn='托帕&账账', cn='托帕&账账',
cht='托帕&帳帳', cht='托帕&帳帳',
@ -436,7 +463,7 @@ TopazNumby = CharacterList(
es='Topaz y Conti', es='Topaz y Conti',
) )
TrailblazerDestruction = CharacterList( TrailblazerDestruction = CharacterList(
id=49, id=52,
name='TrailblazerDestruction', name='TrailblazerDestruction',
cn='Trailblazer•毁灭', cn='Trailblazer•毁灭',
cht='Trailblazer•毀滅', cht='Trailblazer•毀滅',
@ -445,7 +472,7 @@ TrailblazerDestruction = CharacterList(
es='Trailblazer: Destrucción', es='Trailblazer: Destrucción',
) )
TrailblazerHarmony = CharacterList( TrailblazerHarmony = CharacterList(
id=50, id=53,
name='TrailblazerHarmony', name='TrailblazerHarmony',
cn='Trailblazer•同谐', cn='Trailblazer•同谐',
cht='Trailblazer•同諧', cht='Trailblazer•同諧',
@ -454,7 +481,7 @@ TrailblazerHarmony = CharacterList(
es='Trailblazer: Armonía', es='Trailblazer: Armonía',
) )
TrailblazerPreservation = CharacterList( TrailblazerPreservation = CharacterList(
id=51, id=54,
name='TrailblazerPreservation', name='TrailblazerPreservation',
cn='Trailblazer•存护', cn='Trailblazer•存护',
cht='Trailblazer•存護', cht='Trailblazer•存護',
@ -463,7 +490,7 @@ TrailblazerPreservation = CharacterList(
es='Trailblazer: Conservación', es='Trailblazer: Conservación',
) )
Welt = CharacterList( Welt = CharacterList(
id=52, id=55,
name='Welt', name='Welt',
cn='瓦尔特', cn='瓦尔特',
cht='瓦爾特', cht='瓦爾特',
@ -472,7 +499,7 @@ Welt = CharacterList(
es='Welt', es='Welt',
) )
Xueyi = CharacterList( Xueyi = CharacterList(
id=53, id=56,
name='Xueyi', name='Xueyi',
cn='雪衣', cn='雪衣',
cht='雪衣', cht='雪衣',
@ -481,7 +508,7 @@ Xueyi = CharacterList(
es='Xueyi', es='Xueyi',
) )
Yanqing = CharacterList( Yanqing = CharacterList(
id=54, id=57,
name='Yanqing', name='Yanqing',
cn='彦卿', cn='彦卿',
cht='彥卿', cht='彥卿',
@ -490,7 +517,7 @@ Yanqing = CharacterList(
es='Yanqing', es='Yanqing',
) )
Yukong = CharacterList( Yukong = CharacterList(
id=55, id=58,
name='Yukong', name='Yukong',
cn='驭空', cn='驭空',
cht='馭空', cht='馭空',
@ -499,7 +526,7 @@ Yukong = CharacterList(
es='Yukong', es='Yukong',
) )
Yunli = CharacterList( Yunli = CharacterList(
id=56, id=59,
name='Yunli', name='Yunli',
cn='云璃', cn='云璃',
cht='雲璃', cht='雲璃',

View File

@ -324,6 +324,9 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo
if self.is_in_main(): if self.is_in_main():
logger.info('Combat finishes at page_main') logger.info('Combat finishes at page_main')
return True return True
if self.appear(COMBAT_PREPARE):
logger.info('Combat finishes at COMBAT_PREPARE')
return True
if self.is_combat_executing(): if self.is_combat_executing():
logger.info('Combat finishes at another combat') logger.info('Combat finishes at another combat')
return False return False
@ -427,6 +430,7 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo
if self._combat_should_reenter(): if self._combat_should_reenter():
continue continue
if finish: if finish:
self.combat_exit()
break break
# Reset combat_wave_cost, so handle_combat_interact() won't activate before handle_combat_prepare() # Reset combat_wave_cost, so handle_combat_interact() won't activate before handle_combat_prepare()
self.combat_wave_cost = 10 self.combat_wave_cost = 10

View File

@ -21,7 +21,7 @@ from tasks.daily.synthesize import SynthesizeMaterialUI
from tasks.daily.use_technique import UseTechniqueUI from tasks.daily.use_technique import UseTechniqueUI
from tasks.dungeon.assets.assets_dungeon_ui import DAILY_TRAINING_CHECK from tasks.dungeon.assets.assets_dungeon_ui import DAILY_TRAINING_CHECK
from tasks.dungeon.keywords import KEYWORDS_DUNGEON_TAB from tasks.dungeon.keywords import KEYWORDS_DUNGEON_TAB
from tasks.dungeon.ui import DungeonUI from tasks.dungeon.ui.ui import DungeonUI
from tasks.item.consumable_usage import ConsumableUsageUI from tasks.item.consumable_usage import ConsumableUsageUI
from tasks.item.relics import RelicsUI from tasks.item.relics import RelicsUI
from tasks.map.route.loader import RouteLoader from tasks.map.route.loader import RouteLoader

View File

@ -3,36 +3,6 @@ from module.base.button import Button, ButtonWrapper
# This file was auto-generated, do not modify it manually. To generate: # This file was auto-generated, do not modify it manually. To generate:
# ``` python -m dev_tools.button_extract ``` # ``` python -m dev_tools.button_extract ```
CALYX_WORLD_1 = ButtonWrapper(
name='CALYX_WORLD_1',
share=Button(
file='./assets/share/dungeon/ui/CALYX_WORLD_1.png',
area=(490, 185, 540, 230),
search=(470, 165, 560, 250),
color=(197, 196, 196),
button=(490, 185, 540, 230),
),
)
CALYX_WORLD_2 = ButtonWrapper(
name='CALYX_WORLD_2',
share=Button(
file='./assets/share/dungeon/ui/CALYX_WORLD_2.png',
area=(590, 185, 640, 230),
search=(570, 165, 660, 250),
color=(199, 198, 198),
button=(590, 185, 640, 230),
),
)
CALYX_WORLD_3 = ButtonWrapper(
name='CALYX_WORLD_3',
share=Button(
file='./assets/share/dungeon/ui/CALYX_WORLD_3.png',
area=(689, 186, 739, 231),
search=(669, 166, 759, 251),
color=(158, 158, 158),
button=(689, 186, 739, 231),
),
)
DAILY_TRAINING_CHECK = ButtonWrapper( DAILY_TRAINING_CHECK = ButtonWrapper(
name='DAILY_TRAINING_CHECK', name='DAILY_TRAINING_CHECK',
share=Button( share=Button(
@ -73,16 +43,6 @@ LIST_LOADED_CHECK = ButtonWrapper(
button=(576, 606, 951, 664), button=(576, 606, 951, 664),
), ),
) )
OCR_DUNGEON_LIST = ButtonWrapper(
name='OCR_DUNGEON_LIST',
share=Button(
file='./assets/share/dungeon/ui/OCR_DUNGEON_LIST.png',
area=(581, 176, 1165, 661),
search=(561, 156, 1185, 681),
color=(212, 214, 220),
button=(440, 176, 588, 656),
),
)
OCR_DUNGEON_NAV = ButtonWrapper( OCR_DUNGEON_NAV = ButtonWrapper(
name='OCR_DUNGEON_NAV', name='OCR_DUNGEON_NAV',
share=Button( share=Button(

View File

@ -0,0 +1,65 @@
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 ```
LIST_ASCENDING = ButtonWrapper(
name='LIST_ASCENDING',
share=Button(
file='./assets/share/dungeon/ui_list/LIST_ASCENDING.png',
area=(1125, 643, 1143, 661),
search=(1105, 623, 1163, 681),
color=(195, 194, 196),
button=(1125, 643, 1143, 661),
),
)
LIST_DESCENDING = ButtonWrapper(
name='LIST_DESCENDING',
share=Button(
file='./assets/share/dungeon/ui_list/LIST_DESCENDING.png',
area=(1125, 643, 1143, 661),
search=(1105, 623, 1163, 681),
color=(195, 194, 196),
button=(1125, 643, 1143, 661),
),
)
OCR_DUNGEON_LIST = ButtonWrapper(
name='OCR_DUNGEON_LIST',
share=Button(
file='./assets/share/dungeon/ui_list/OCR_DUNGEON_LIST.png',
area=(581, 176, 1165, 661),
search=(561, 156, 1185, 681),
color=(212, 214, 220),
button=(440, 176, 588, 656),
),
)
OCR_DUNGEON_NAME = ButtonWrapper(
name='OCR_DUNGEON_NAME',
share=Button(
file='./assets/share/dungeon/ui_list/OCR_DUNGEON_NAME.png',
area=(563, 172, 788, 624),
search=(543, 152, 808, 644),
color=(245, 243, 245),
button=(563, 172, 788, 624),
),
)
OCR_DUNGEON_NAME_ROGUE = ButtonWrapper(
name='OCR_DUNGEON_NAME_ROGUE',
share=Button(
file='./assets/share/dungeon/ui_list/OCR_DUNGEON_NAME_ROGUE.png',
area=(563, 292, 788, 624),
search=(543, 272, 808, 644),
color=(249, 247, 249),
button=(563, 292, 788, 624),
),
)
OCR_DUNGEON_TELEPORT = ButtonWrapper(
name='OCR_DUNGEON_TELEPORT',
share=Button(
file='./assets/share/dungeon/ui_list/OCR_DUNGEON_TELEPORT.png',
area=(1013, 172, 1163, 624),
search=(993, 152, 1183, 644),
color=(231, 234, 230),
button=(1013, 172, 1163, 624),
),
)

View File

@ -213,7 +213,7 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
elif require and not self.support_once: elif require and not self.support_once:
# Run with support all the way # Run with support all the way
return self._dungeon_run(dungeon=dungeon, team=team, wave_limit=0, return self._dungeon_run(dungeon=dungeon, team=team, wave_limit=0,
support_character=self.config.DungeonSupport_Character) support_character=self.config.DungeonSupport_Character)
else: else:
# Normal run # Normal run
@ -250,10 +250,10 @@ class Dungeon(DungeonStamina, DungeonEvent, Combat):
if self.has_double_rogue_event(): if self.has_double_rogue_event():
rogue = self.get_double_rogue_remain() rogue = self.get_double_rogue_remain()
if self.has_double_calyx_event(): if self.has_double_calyx_event():
self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Calyx_Golden) self.dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Calyx_Golden)
calyx = self.get_double_event_remain() calyx = self.get_double_event_remain()
if self.has_double_relic_event(): if self.has_double_relic_event():
self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Cavern_of_Corrosion) self.dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Cavern_of_Corrosion)
relic = self.get_double_rogue_remain() relic = self.get_double_rogue_remain()
with self.config.multi_set(): with self.config.multi_set():
self.config.stored.DungeonDouble.calyx = calyx self.config.stored.DungeonDouble.calyx = calyx

File diff suppressed because it is too large Load Diff

View File

@ -150,11 +150,11 @@ Stagnant_Shadow_Roast = DungeonDetailed(
Stagnant_Shadow_Ire = DungeonDetailed( Stagnant_Shadow_Ire = DungeonDetailed(
id=17, id=17,
name='Stagnant_Shadow_Ire', name='Stagnant_Shadow_Ire',
cn='角色晋阶材料:火(流萤 / 加拉赫 / 椒丘', cn='角色晋阶材料:火(流萤 / 加拉赫 / 椒丘 / 灵砂',
cht='角色晉階材料:火(流螢 / 加拉赫 / 椒丘', cht='角色晉階材料:火(流螢 / 加拉赫 / 椒丘 / 靈砂',
en='Ascension: Fire (Firefly / Gallagher / Jiaoqiu)', en='Ascension: Fire (Firefly / Gallagher / Jiaoqiu / Lingsha)',
jp='キャラクター昇格素材:炎(ホタル / ギャラガー / 椒丘', jp='キャラクター昇格素材:炎(ホタル / ギャラガー / 椒丘 / 霊砂',
es='Ascension: Fuego (Luciérnaga / Gallagher / Jiaoqiu)', es='Ascension: Fuego (Luciérnaga / Gallagher / Jiaoqiu / Lingsha)',
) )
Stagnant_Shadow_Duty = DungeonDetailed( Stagnant_Shadow_Duty = DungeonDetailed(
id=18, id=18,
@ -165,3 +165,21 @@ Stagnant_Shadow_Duty = DungeonDetailed(
jp='キャラクター昇格素材:物理(ブートヒル / ロビン / 雲璃)', jp='キャラクター昇格素材:物理(ブートヒル / ロビン / 雲璃)',
es='Ascension: Físico (Boothill / Robin / Yunli)', es='Ascension: Físico (Boothill / Robin / Yunli)',
) )
Stagnant_Shadow_Mechwolf = DungeonDetailed(
id=19,
name='Stagnant_Shadow_Mechwolf',
cn='角色晋阶材料:雷(貊泽)',
cht='角色晉階材料:雷(貊澤)',
en='Ascension: Lightning (Moze)',
jp='キャラクター昇格素材:雷(モゼ)',
es='Ascension: Rayo (Moze)',
)
Stagnant_Shadow_Gloam = DungeonDetailed(
id=20,
name='Stagnant_Shadow_Gloam',
cn='角色晋阶材料:风(飞霄)',
cht='角色晉階材料:風(飛霄)',
en='Ascension: Wind (Feixiao)',
jp='キャラクター昇格素材:風(飛霄)',
es='Ascension: Viento (Feixiao)',
)

View File

@ -6,7 +6,7 @@ from tasks.base.page import page_guide
from tasks.combat.assets.assets_combat_stamina_status import ICON_SEARCH, IMMERSIFIER_ICON from tasks.combat.assets.assets_combat_stamina_status import ICON_SEARCH, IMMERSIFIER_ICON
from tasks.dungeon.assets.assets_dungeon_stamina import * from tasks.dungeon.assets.assets_dungeon_stamina import *
from tasks.dungeon.keywords import KEYWORDS_DUNGEON_TAB from tasks.dungeon.keywords import KEYWORDS_DUNGEON_TAB
from tasks.dungeon.ui import DungeonUI from tasks.dungeon.ui.ui import DungeonUI
class DungeonStamina(DungeonUI): class DungeonStamina(DungeonUI):

View File

@ -1,770 +0,0 @@
import re
import cv2
import numpy as np
from module.base.base import ModuleBase
from module.base.button import ClickButton
from module.base.decorator import run_once
from module.base.timer import Timer
from module.base.utils import get_color
from module.exception import ScriptError
from module.logger import logger
from module.ocr.ocr import Ocr, OcrResultButton
from module.ocr.utils import split_and_pair_button_attr, split_and_pair_buttons
from module.ui.draggable_list import DraggableList
from module.ui.switch import Switch
from tasks.base.page import page_guide
from tasks.combat.assets.assets_combat_interact import DUNGEON_COMBAT_INTERACT, DUNGEON_COMBAT_INTERACT_TEXT
from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE
from tasks.dungeon.assets.assets_dungeon_ui import *
from tasks.dungeon.assets.assets_dungeon_ui_rogue import *
from tasks.dungeon.keywords import (
DungeonList,
DungeonNav,
DungeonTab,
KEYWORDS_DUNGEON_ENTRANCE,
KEYWORDS_DUNGEON_LIST,
KEYWORDS_DUNGEON_NAV,
KEYWORDS_DUNGEON_TAB
)
from tasks.dungeon.keywords.classes import DungeonEntrance
from tasks.dungeon.state import DungeonState
from tasks.map.interact.aim import inrange
from tasks.map.keywords import KEYWORDS_MAP_WORLD, MapPlane
class DungeonTabSwitch(Switch):
SEARCH_BUTTON = TAB_SEARCH
def add_state(self, state, check_button, click_button=None):
# Load search
if check_button is not None:
check_button.load_search(self.__class__.SEARCH_BUTTON.area)
if click_button is not None:
click_button.load_search(self.__class__.SEARCH_BUTTON.area)
return super().add_state(state, check_button, click_button)
def click(self, state, main):
"""
Args:
state (str):
main (ModuleBase):
"""
button = self.get_data(state)['click_button']
_ = main.appear(button) # Search button to load offset
main.device.click(button)
SWITCH_DUNGEON_TAB = DungeonTabSwitch('DungeonTab', is_selector=True)
SWITCH_DUNGEON_TAB.add_state(
KEYWORDS_DUNGEON_TAB.Operation_Briefing,
check_button=OPERATION_BRIEFING_CHECK,
click_button=OPERATION_BRIEFING_CLICK
)
SWITCH_DUNGEON_TAB.add_state(
KEYWORDS_DUNGEON_TAB.Daily_Training,
check_button=DAILY_TRAINING_CHECK,
click_button=DAILY_TRAINING_CLICK
)
SWITCH_DUNGEON_TAB.add_state(
KEYWORDS_DUNGEON_TAB.Survival_Index,
check_button=SURVIVAL_INDEX_CHECK,
click_button=SURVIVAL_INDEX_CLICK
)
SWITCH_DUNGEON_TAB.add_state(
KEYWORDS_DUNGEON_TAB.Simulated_Universe,
check_button=SIMULATED_UNIVERSE_CHECK,
click_button=SIMULATED_UNIVERSE_CLICK
)
SWITCH_DUNGEON_TAB.add_state(
KEYWORDS_DUNGEON_TAB.Treasures_Lightward,
check_button=TREASURES_LIGHTWARD_CHECK,
click_button=TREASURES_LIGHTWARD_CLICK
)
class OcrDungeonNav(Ocr):
def after_process(self, result):
result = super().after_process(result)
result = result.replace('#', '')
if self.lang == 'cn':
result = result.replace('萼喜', '')
result = result.replace('', '') # 凝带虚影
return result
class OcrDungeonList(Ocr):
def after_process(self, result):
# 乙太之蕾•雅利洛-Ⅵ
result = re.sub(r'-[V][I]', '-Ⅵ', result)
# 苏乐达™热砂海选会场
result = re.sub(r'(苏乐达|蘇樂達|SoulGlad|スラーダ|FelizAlma)[rtT]*M', r'\1', result)
result = super().after_process(result)
if self.lang == 'cn':
result = result.replace('', '') # 巽风之形
result = result.replace('皖A0', '50').replace('', '')
# 燔灼之形•凝滞虚影
result = result.replace('', '')
result = re.sub('^灼之形', '燔灼之形', result)
# 偃偶之形•凝滞虚影
result = re.sub('^偶之形', '偃偶之形', result)
# 嗔怒之形•凝滞虚影
result = re.sub('^怒之形', '嗔怒之形', result)
# 蛀星的旧·历战余响
result = re.sub(r'蛀星的旧.*?历战', '蛀星的旧靥•历战', result)
# 9支援仓段
for word in 'Q9α':
result = result.removeprefix(word)
return result
class OcrDungeonListCalyxCrimson(OcrDungeonList):
def _match_result(self, *args, **kwargs):
"""
Convert MapPlane object to their corresponding DungeonList object
"""
plane = super()._match_result(*args, **kwargs)
if plane is not None:
for dungeon in DungeonList.instances.values():
if dungeon.is_Calyx_Crimson and dungeon.plane == plane:
return dungeon
return plane
class OcrDungeonListLimitEntrance(OcrDungeonList):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.button = ClickButton((*self.button.area[:3], self.button.area[3] - 70))
class OcrDungeonListCalyxCrimsonLimitEntrance(OcrDungeonListCalyxCrimson, OcrDungeonListLimitEntrance):
pass
class DraggableDungeonNav(DraggableList):
# 0.5 is the magic number to reach bottom in 1 swipe
# but relax we still have retires when magic doesn't work
drag_vector = (0.50, 0.52)
class DraggableDungeonList(DraggableList):
teleports: list[OcrResultButton] = []
navigates: list[OcrResultButton] = []
# use_plane: True to use map planes to predict dungeons only.
# Can only be True in Calyx Crimson
use_plane = False
# limit_entrance: True to ensure the teleport button is insight
limit_entrance = False
def load_rows(self, main: ModuleBase, allow_early_access=False):
"""
Args:
main:
allow_early_access: True to allow dungeons that are in temporarily early access during events
"""
relative_area = (0, 0, 1280, 120)
if self.use_plane:
self.keyword_class = [MapPlane, DungeonEntrance]
if self.limit_entrance:
self.ocr_class = OcrDungeonListCalyxCrimsonLimitEntrance
else:
self.ocr_class = OcrDungeonListCalyxCrimson
else:
self.keyword_class = [DungeonList, DungeonEntrance]
if self.limit_entrance:
self.ocr_class = OcrDungeonListLimitEntrance
else:
self.ocr_class = OcrDungeonList
super().load_rows(main=main)
# Check early access dungeons
buttons = DUNGEON_LIST.cur_buttons.copy()
for name, button in split_and_pair_buttons(
DUNGEON_LIST.cur_buttons,
split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Enter,
relative_area=relative_area
):
logger.warning(f'Early access dungeon: {name}')
buttons.remove(name)
buttons.remove(button)
# Remove early access dungeons
if not allow_early_access:
DUNGEON_LIST.cur_buttons = buttons
# From super.load_rows(), re-calculate indexes
indexes = [self.keyword2index(row.matched_keyword)
for row in self.cur_buttons]
indexes = [index for index in indexes if index]
if not indexes:
logger.warning(f'No valid rows loaded into {self}')
return
self.cur_min = min(indexes)
self.cur_max = max(indexes)
logger.attr(self.name, f'{self.cur_min} - {self.cur_max}')
# Replace dungeon.button with teleport
self.teleports = list(split_and_pair_button_attr(
DUNGEON_LIST.cur_buttons,
split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Teleport and x != KEYWORDS_DUNGEON_ENTRANCE.Enter,
relative_area=relative_area
))
self.navigates = list(split_and_pair_button_attr(
DUNGEON_LIST.cur_buttons,
split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Navigate,
relative_area=relative_area
))
DUNGEON_NAV_LIST = DraggableDungeonNav(
'DungeonNavList', keyword_class=DungeonNav, ocr_class=OcrDungeonNav, search_button=OCR_DUNGEON_NAV)
DUNGEON_LIST = DraggableDungeonList(
'DungeonList', keyword_class=[DungeonList, DungeonEntrance, MapPlane],
ocr_class=OcrDungeonList, search_button=OCR_DUNGEON_LIST)
class DungeonUI(DungeonState):
def dungeon_tab_goto(self, state: DungeonTab):
"""
Args:
state:
Returns:
bool: If UI switched
Examples:
self = DungeonUI('alas')
self.device.screenshot()
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Operation_Briefing)
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Daily_Training)
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index)
"""
logger.hr('Dungeon tab goto', level=2)
ui_switched = self.ui_ensure(page_guide)
tab_switched = SWITCH_DUNGEON_TAB.set(state, main=self)
if ui_switched or tab_switched:
if state == KEYWORDS_DUNGEON_TAB.Daily_Training:
logger.info(f'Tab goto {state}, wait until loaded')
self._dungeon_wait_daily_training_loaded()
elif state == KEYWORDS_DUNGEON_TAB.Survival_Index:
logger.info(f'Tab goto {state}, wait until loaded')
self._dungeon_wait_survival_index_loaded()
elif state == KEYWORDS_DUNGEON_TAB.Treasures_Lightward:
logger.info(f'Tab goto {state}, wait until loaded')
self._dungeon_wait_treasures_lightward_loaded()
return True
else:
return False
def _dungeon_wait_daily_training_loaded(self, skip_first_screenshot=True):
"""
Returns:
bool: True if wait success, False if wait timeout.
Pages:
in: page_guide, Daily_Training
"""
timeout = Timer(2, count=4).start()
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if timeout.reached():
logger.warning('Wait daily training loaded timeout')
return False
color = get_color(self.device.image, DAILY_TRAINING_LOADED.area)
if np.mean(color) < 128:
logger.info('Daily training loaded')
return True
def _dungeon_wait_survival_index_loaded(self, skip_first_screenshot=True):
"""
Returns:
bool: True if wait success, False if wait timeout.
Pages:
in: page_guide, Survival_Index
"""
timeout = Timer(2, count=4).start()
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if timeout.reached():
logger.warning('Wait survival index loaded timeout')
return False
if self.appear(SURVIVAL_INDEX_SU_LOADED):
logger.info('Survival index loaded, SURVIVAL_INDEX_SU_LOADED')
return True
if self.appear(SURVIVAL_INDEX_OE_LOADED):
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:
bool: True if wait success, False if wait timeout.
Pages:
in: page_guide, Survival_Index
"""
timeout = Timer(2, count=4).start()
TREASURES_LIGHTWARD_LOADED.set_search_offset((5, 5))
TREASURES_LIGHTWARD_LOCKED.set_search_offset((5, 5))
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if timeout.reached():
logger.warning('Wait treasures lightward loaded timeout')
return False
if self.appear(TREASURES_LIGHTWARD_LOADED):
logger.info('Treasures lightward loaded (event unlocked)')
return True
if self.appear(TREASURES_LIGHTWARD_LOCKED):
logger.info('Treasures lightward loaded (event locked)')
return True
def _dungeon_list_button_has_content(self):
# Check if having any content
# List background: 254, guild border: 225
r, g, b = cv2.split(self.image_crop(LIST_LOADED_CHECK, copy=False))
minimum = cv2.min(cv2.min(r, g), b)
minimum = inrange(minimum, lower=0, upper=180)
if minimum.size > 100:
return True
else:
return False
def _dungeon_wait_until_dungeon_list_loaded(self, skip_first_screenshot=True):
timeout = Timer(1, count=3).start()
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if timeout.reached():
logger.warning('Wait until dungeon list loaded timeout')
return False
if self._dungeon_list_button_has_content():
logger.info('Dungeon list loaded')
return True
def _dungeon_wait_until_echo_or_war_stabled(self, skip_first_screenshot=True):
"""
Returns:
bool: True if wait success, False if wait timeout.
Pages:
in: page_guide, Survival_Index
"""
# Wait until Forgotten_Hall stabled
timeout = Timer(2, count=4).start()
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if timeout.reached():
logger.warning('Wait until Echo_of_War stabled timeout')
return False
DUNGEON_NAV_LIST.load_rows(main=self)
# End
button = DUNGEON_NAV_LIST.keyword2button(KEYWORDS_DUNGEON_NAV.Echo_of_War, show_warning=False)
if button:
# 513 is the top of the last row of DungeonNav
if button.area[1] > 513:
logger.info('DungeonNav row Echo_of_War stabled')
return True
else:
logger.info('No Echo_of_War in list skip waiting')
return False
def _dungeon_nav_goto(self, nav: DungeonNav, skip_first_screenshot=True):
"""
Equivalent to `DUNGEON_NAV_LIST.select_row(dungeon.dungeon_nav, main=self)`
but with tricks to be faster
Args:
nav:
skip_first_screenshot:
"""
logger.hr('Dungeon nav goto', level=2)
logger.info(f'Dungeon nav goto {nav}')
# Wait rows
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
DUNGEON_NAV_LIST.load_rows(main=self)
if DUNGEON_NAV_LIST.cur_buttons:
break
# Wait first row selected
timeout = Timer(0.5, count=2).start()
skip_first_screenshot = True
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if timeout.reached():
logger.info('DUNGEON_NAV_LIST not selected')
break
if button := DUNGEON_NAV_LIST.get_selected_row(main=self):
logger.info(f'DUNGEON_NAV_LIST selected at {button}')
break
# Check if it's at the first page.
if DUNGEON_NAV_LIST.keyword2button(KEYWORDS_DUNGEON_NAV.Simulated_Universe, show_warning=False) \
or DUNGEON_NAV_LIST.keyword2button(KEYWORDS_DUNGEON_NAV.Ornament_Extraction, show_warning=False):
# Going to use a faster method to navigate but can only start from list top
logger.info('DUNGEON_NAV_LIST at top')
# Update points if possible
# 2.3, No longer weekly points after Divergent Universe unlocked
# if DUNGEON_NAV_LIST.is_row_selected(button, main=self):
# self.dungeon_update_simuni()
# Treasures lightward is always at top
elif DUNGEON_NAV_LIST.keyword2button(KEYWORDS_DUNGEON_NAV.Forgotten_Hall, show_warning=False) \
or DUNGEON_NAV_LIST.keyword2button(KEYWORDS_DUNGEON_NAV.Pure_Fiction, show_warning=False):
logger.info('DUNGEON_NAV_LIST at top')
else:
# To start from any list states.
logger.info('DUNGEON_NAV_LIST not at top')
DUNGEON_NAV_LIST.select_row(nav, main=self)
return True
# Check the first page
if nav in [
KEYWORDS_DUNGEON_NAV.Simulated_Universe,
KEYWORDS_DUNGEON_NAV.Divergent_Universe,
KEYWORDS_DUNGEON_NAV.Ornament_Extraction,
KEYWORDS_DUNGEON_NAV.Calyx_Golden,
KEYWORDS_DUNGEON_NAV.Calyx_Crimson,
KEYWORDS_DUNGEON_NAV.Stagnant_Shadow,
KEYWORDS_DUNGEON_NAV.Cavern_of_Corrosion,
KEYWORDS_DUNGEON_NAV.Forgotten_Hall,
KEYWORDS_DUNGEON_NAV.Pure_Fiction,
]:
button = DUNGEON_NAV_LIST.keyword2button(nav)
if button:
DUNGEON_NAV_LIST.select_row(nav, main=self, insight=False)
return True
# Check the second page
while 1:
DUNGEON_NAV_LIST.drag_page('down', main=self)
# No skip_first_screenshot since drag_page is just called
if self._dungeon_wait_until_echo_or_war_stabled(skip_first_screenshot=False):
DUNGEON_NAV_LIST.select_row(nav, main=self, insight=False)
return True
def _dungeon_world_set(self, dungeon: DungeonList, skip_first_screenshot=True):
"""
Switch worlds in Calyx_Golden
Returns:
bool: True if success to set
"""
logger.hr('Dungeon world set', level=2)
if not dungeon.is_Calyx_Golden:
logger.warning(f'Dungeon {dungeon} is not Calyx Golden, no need to set world')
return False
if dungeon.world is None:
logger.error(f'Dungeon {dungeon} does not belongs to any world')
return False
dic_world_button = {
KEYWORDS_MAP_WORLD.Jarilo_VI: CALYX_WORLD_1,
KEYWORDS_MAP_WORLD.The_Xianzhou_Luofu: CALYX_WORLD_2,
KEYWORDS_MAP_WORLD.Penacony: CALYX_WORLD_3,
}
button = dic_world_button.get(dungeon.world)
if button is None:
logger.error(f'Dungeon {dungeon} with world {dungeon.world} has no corresponding world button')
return False
logger.info(f'Dungeon world set {dungeon.world}')
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.image_color_count(button, color=(18, 18, 18), threshold=180, count=50):
logger.info(f'Dungeon world at {dungeon.world}')
return True
# Click
if self.ui_page_appear(page_guide, interval=2):
self.device.click(button)
continue
def _dungeon_world_set_wrapper(self, dungeon: DungeonList, skip_first_screenshot=True):
"""
Switch worlds in Calyx_Golden with error handling
If world tab is not unlocked, fallback to Jarilo dungeons
"""
# Wait world tab
button = CALYX_WORLD_1
tab = False
timeout = Timer(0.6, count=3).start()
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if timeout.reached():
break
# Selected tab
if self.image_color_count(button, color=(18, 18, 18), threshold=180, count=50):
tab = True
break
# Unselected tab
if self.image_color_count(button, color=(134, 134, 134), threshold=180, count=50):
tab = True
break
logger.attr('WorldTab', tab)
if not tab:
logger.warning('World tab is not unlocked, fallback to Jarilo dungeons')
if dungeon.is_Calyx_Golden_Memories:
dungeon = KEYWORDS_DUNGEON_LIST.Calyx_Golden_Treasures_Jarilo_VI
if dungeon.is_Calyx_Golden_Aether:
dungeon = KEYWORDS_DUNGEON_LIST.Calyx_Golden_Aether_Jarilo_VI
if dungeon.is_Calyx_Golden_Treasures:
dungeon = KEYWORDS_DUNGEON_LIST.Calyx_Golden_Treasures_Jarilo_VI
self._dungeon_world_set(dungeon, skip_first_screenshot=skip_first_screenshot)
return dungeon
def _dungeon_insight(self, dungeon: DungeonList):
"""
Pages:
in: page_guide, Survival_Index, nav including dungeon
out: page_guide, Survival_Index, nav including dungeon, dungeon insight
"""
logger.hr('Dungeon insight', level=2)
DUNGEON_LIST.use_plane = bool(dungeon.is_Calyx_Crimson)
# Insight dungeon
DUNGEON_LIST.insight_row(dungeon, main=self)
self.device.click_record_clear()
# Check if dungeon unlocked
for entrance in DUNGEON_LIST.navigates:
entrance: OcrResultButton = entrance
logger.warning(f'Teleport {entrance.matched_keyword} is not unlocked')
if entrance == dungeon:
logger.error(f'Trying to enter dungeon {dungeon}, but teleport is not unlocked')
return False
# Find teleport button
if dungeon not in [tp.matched_keyword for tp in DUNGEON_LIST.teleports]:
# Dungeon name is insight but teleport button is not
logger.info('Dungeon name is insight, swipe down a little bit to find the teleport button')
if dungeon.is_Forgotten_Hall:
DUNGEON_LIST.drag_vector = (-0.4, -0.2) # Keyword loaded is reversed
else:
DUNGEON_LIST.drag_vector = (0.2, 0.4)
DUNGEON_LIST.limit_entrance = True
DUNGEON_LIST.insight_row(dungeon, main=self)
self.device.click_record_clear()
DUNGEON_LIST.drag_vector = DraggableList.drag_vector
DUNGEON_LIST.limit_entrance = False
DUNGEON_LIST.load_rows(main=self)
# Check if dungeon unlocked
for entrance in DUNGEON_LIST.navigates:
if entrance == dungeon:
logger.error(f'Trying to enter dungeon {dungeon}, but teleport is not unlocked')
return False
return True
def _dungeon_enter(self, dungeon, enter_check_button=COMBAT_PREPARE, skip_first_screenshot=True):
"""
Pages:
in: page_guide, Survival_Index, nav including dungeon
out: COMBAT_PREPARE, FORGOTTEN_HALL_CHECK
"""
logger.hr('Dungeon enter', level=2)
DUNGEON_LIST.use_plane = bool(dungeon.is_Calyx_Crimson)
skip_first_load = skip_first_screenshot
@run_once
def screenshot_interval_set():
self.device.screenshot_interval_set('combat')
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.appear(enter_check_button):
logger.info(f'Arrive {enter_check_button.name}')
self.device.screenshot_interval_set()
break
# Additional
# Popup that confirm character switch
if self.handle_popup_confirm():
self.interval_reset(page_guide.check_button)
continue
# Click teleport
if self.appear(page_guide.check_button, interval=1):
if skip_first_load:
skip_first_load = False
else:
DUNGEON_LIST.load_rows(main=self)
entrance = DUNGEON_LIST.keyword2button(dungeon)
if entrance is not None:
self.device.click(entrance)
screenshot_interval_set()
self.interval_reset(page_guide.check_button)
continue
else:
logger.warning(f'Cannot find dungeon entrance of {dungeon}')
continue
def get_dungeon_interact(self) -> DungeonList | None:
"""
Pages:
in: page_main
"""
if not self.appear(DUNGEON_COMBAT_INTERACT):
logger.info('No dungeon interact')
return None
self.acquire_lang_checked()
ocr = OcrDungeonList(DUNGEON_COMBAT_INTERACT_TEXT)
result = ocr.detect_and_ocr(self.device.image)
dungeon = None
# Special match names in English
# Second row must have at least 3 characters which is the shortest name "Ire"
# Stangnant Shadow: Shape of
# Quanta
if len(result) == 2 and len(result[1].ocr_text) >= 3:
first, second = result[0].ocr_text, result[1].ocr_text
if re.search(r'Stagnant\s*Shadow', first):
dungeon = DungeonList.find_dungeon_by_string(en=second, is_Stagnant_Shadow=True)
elif re.search(r'Cavern\s*of\s*Corrosion', first):
dungeon = DungeonList.find_dungeon_by_string(en=second, is_Cavern_of_Corrosion=True)
elif re.search(r'Echo\s*of\s*War', first):
dungeon = DungeonList.find_dungeon_by_string(en=second, is_Echo_of_War=True)
elif re.search(r'Calyx[\s(]+Golden', first):
dungeon = DungeonList.find_dungeon_by_string(en=second, is_Calyx_Golden=True, world=self.plane.world)
elif re.search(r'Calyx[\s(]+Crimson', first):
dungeon = DungeonList.find_dungeon_by_string(en=second, is_Calyx_Crimson=True, plane=self.plane)
if dungeon is not None:
logger.attr('DungeonInteract', dungeon)
return dungeon
# Join
result = ' '.join([row.ocr_text for row in result])
# Special match names in Chinese
# Only calyxes need spacial match
if res := re.search(r'(^.+之蕾)', result):
dungeon = DungeonList.find_dungeon_by_string(cn=res.group(1), is_Calyx_Crimson=True, plane=self.plane)
if dungeon is not None:
logger.attr('DungeonInteract', dungeon)
return dungeon
dungeon = DungeonList.find_dungeon_by_string(cn=res.group(1), is_Calyx_Golden=True, world=self.plane.world)
if dungeon is not None:
logger.attr('DungeonInteract', dungeon)
return dungeon
# Dungeons
try:
dungeon = DungeonList.find(result)
logger.attr('DungeonInteract', dungeon)
return dungeon
except ScriptError:
pass
# Simulated Universe returns Simulated_Universe_World_1
try:
dungeon = DungeonNav.find(result)
if dungeon == KEYWORDS_DUNGEON_NAV.Simulated_Universe:
dungeon = KEYWORDS_DUNGEON_LIST.Simulated_Universe_World_1
logger.attr('DungeonInteract', dungeon)
return dungeon
except ScriptError:
pass
# Unknown
logger.attr('DungeonInteract', None)
return None
def dungeon_goto(self, dungeon: DungeonList):
"""
Returns:
bool: If success
Pages:
in: page_guide, Survival_Index
out: COMBAT_PREPARE if success
page_guide if failed
Examples:
from tasks.dungeon.keywords import KEYWORDS_DUNGEON_LIST
self = DungeonUI('src')
self.device.screenshot()
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index)
self.dungeon_goto(KEYWORDS_DUNGEON_LIST.Calyx_Crimson_Harmony)
"""
# Reset search button
DUNGEON_LIST.search_button = OCR_DUNGEON_LIST
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_Ornament_Extraction:
self._dungeon_nav_goto(dungeon.dungeon_nav)
self._dungeon_wait_until_dungeon_list_loaded()
self._dungeon_insight(dungeon)
self._dungeon_enter(dungeon)
return True
if dungeon.is_Calyx_Golden:
self._dungeon_nav_goto(dungeon.dungeon_nav)
self._dungeon_wait_until_dungeon_list_loaded()
dungeon = self._dungeon_world_set_wrapper(dungeon)
self._dungeon_wait_until_dungeon_list_loaded()
self._dungeon_insight(dungeon)
self._dungeon_enter(dungeon)
return True
logger.error(f'Goto dungeon {dungeon} is not supported')
return False

View File

@ -0,0 +1,85 @@
import re
from module.exception import ScriptError
from module.logger import logger
from tasks.base.ui import UI
from tasks.combat.assets.assets_combat_interact import DUNGEON_COMBAT_INTERACT, DUNGEON_COMBAT_INTERACT_TEXT
from tasks.dungeon.keywords import (
DungeonList,
DungeonNav,
KEYWORDS_DUNGEON_LIST,
KEYWORDS_DUNGEON_NAV
)
from tasks.dungeon.ui.llist import OcrDungeonName
class DungeonUIInteract(UI):
def get_dungeon_interact(self) -> DungeonList | None:
"""
Pages:
in: page_main
"""
if not self.appear(DUNGEON_COMBAT_INTERACT):
logger.info('No dungeon interact')
return None
self.acquire_lang_checked()
ocr = OcrDungeonName(DUNGEON_COMBAT_INTERACT_TEXT)
result = ocr.detect_and_ocr(self.device.image)
dungeon = None
# Special match names in English
# Second row must have at least 3 characters which is the shortest name "Ire"
# Stangnant Shadow: Shape of
# Quanta
if len(result) == 2 and len(result[1].ocr_text) >= 3:
first, second = result[0].ocr_text, result[1].ocr_text
if re.search(r'Stagnant\s*Shadow', first):
dungeon = DungeonList.find_dungeon_by_string(en=second, is_Stagnant_Shadow=True)
elif re.search(r'Cavern\s*of\s*Corrosion', first):
dungeon = DungeonList.find_dungeon_by_string(en=second, is_Cavern_of_Corrosion=True)
elif re.search(r'Echo\s*of\s*War', first):
dungeon = DungeonList.find_dungeon_by_string(en=second, is_Echo_of_War=True)
elif re.search(r'Calyx[\s(]+Golden', first):
dungeon = DungeonList.find_dungeon_by_string(en=second, is_Calyx_Golden=True, world=self.plane.world)
elif re.search(r'Calyx[\s(]+Crimson', first):
dungeon = DungeonList.find_dungeon_by_string(en=second, is_Calyx_Crimson=True, plane=self.plane)
if dungeon is not None:
logger.attr('DungeonInteract', dungeon)
return dungeon
# Join
result = ' '.join([row.ocr_text for row in result])
# Special match names in Chinese
# Only calyxes need spacial match
if res := re.search(r'(^.+之蕾)', result):
dungeon = DungeonList.find_dungeon_by_string(cn=res.group(1), is_Calyx_Crimson=True, plane=self.plane)
if dungeon is not None:
logger.attr('DungeonInteract', dungeon)
return dungeon
dungeon = DungeonList.find_dungeon_by_string(cn=res.group(1), is_Calyx_Golden=True, world=self.plane.world)
if dungeon is not None:
logger.attr('DungeonInteract', dungeon)
return dungeon
# Dungeons
try:
dungeon = DungeonList.find(result)
logger.attr('DungeonInteract', dungeon)
return dungeon
except ScriptError:
pass
# Simulated Universe returns Simulated_Universe_World_1
try:
dungeon = DungeonNav.find(result)
if dungeon == KEYWORDS_DUNGEON_NAV.Simulated_Universe:
dungeon = KEYWORDS_DUNGEON_LIST.Simulated_Universe_World_1
logger.attr('DungeonInteract', dungeon)
return dungeon
except ScriptError:
pass
# Unknown
logger.attr('DungeonInteract', None)
return None

398
tasks/dungeon/ui/llist.py Normal file
View File

@ -0,0 +1,398 @@
import re
import cv2
from pponnxcr.predict_system import BoxedResult
from module.base.base import ModuleBase
from module.base.button import ClickButton
from module.base.decorator import run_once
from module.base.timer import Timer
from module.base.utils import area_center, area_limit, area_offset, crop, image_size
from module.logger import logger
from module.ocr.ocr import Ocr, OcrResultButton
from module.ocr.utils import split_and_pair_button_attr, split_and_pair_buttons
from module.ui.draggable_list import DraggableList
from module.ui.switch import Switch
from tasks.base.page import page_guide
from tasks.base.ui import UI
from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE
from tasks.dungeon.assets.assets_dungeon_ui_list import *
from tasks.dungeon.keywords import (
DungeonList,
KEYWORDS_DUNGEON_ENTRANCE,
KEYWORDS_DUNGEON_LIST
)
from tasks.dungeon.keywords.classes import DungeonEntrance
from tasks.map.keywords import MapPlane
LIST_SORTING = Switch('DUNGEON_LIST_SORTING', is_selector=True)
LIST_SORTING.add_state('Ascending', check_button=LIST_ASCENDING)
LIST_SORTING.add_state('Descending', check_button=LIST_DESCENDING)
LIST_SORTING.Ascending = 'Ascending'
LIST_SORTING.Descending = 'Descending'
class OcrDungeonName(Ocr):
def after_process(self, result):
# 乙太之蕾•雅利洛-Ⅵ
result = re.sub(r'-[V][I]', '-Ⅵ', result)
# 苏乐达™热砂海选会场
result = re.sub(r'(苏乐达|蘇樂達|SoulGlad|スラーダ|FelizAlma)[rtT]*M*', r'\1', result)
result = re.sub(r'["\']', '', result)
result = super().after_process(result)
if self.lang == 'cn':
result = result.replace('', '') # 巽风之形
result = result.replace('皖A0', '50').replace('', '')
# 燔灼之形•凝滞虚影
result = result.replace('', '')
result = re.sub('^灼之形', '燔灼之形', result)
# 偃偶之形•凝滞虚影
result = re.sub('^偶之形', '偃偶之形', result)
# 嗔怒之形•凝滞虚影
result = re.sub('^怒之形', '嗔怒之形', result)
# 蛀星的旧·历战余响
result = re.sub(r'蛀星的旧.*?历战', '蛀星的旧靥•历战', result)
# 9支援仓段
for word in 'Q9α':
result = result.removeprefix(word)
return result
class OcrDungeonList(OcrDungeonName):
# Keep __init__ parameter unused
def __init__(self, button: ButtonWrapper = None, lang=None, name=None):
super().__init__(button=button, lang=lang, name='OcrDungeonList')
# target_dungeon: Dungeon attribute to use map planes to predict dungeons only.
self.target_dungeon = None
# limit_entrance: True to ensure the teleport button is insight
self.limit_entrance = False
def detect_and_ocr(self, image, direct_ocr=False) -> list[BoxedResult]:
if self.button != OCR_DUNGEON_NAME:
if self.limit_entrance:
self.button = ClickButton((*self.button.area[:3], self.button.area[3] - 70))
return super().detect_and_ocr(image, direct_ocr=direct_ocr)
# Concat OCR_DUNGEON_NAME and OCR_DUNGEON_TELEPORT
# so they can be OCRed at one time
left = crop(image, OCR_DUNGEON_NAME.area, copy=False)
right = crop(image, OCR_DUNGEON_TELEPORT.area, copy=False)
lw, lh = image_size(left)
rw, rh = image_size(right)
if lh != rh:
logger.error('OCR_DUNGEON_NAME and OCR_DUNGEON_TELEPORT does not have same height, image cannot concat')
image = cv2.hconcat([left, right])
if self.limit_entrance:
w, h = image_size(image)
image = crop(image, (0, 0, w, h - 70), copy=False)
results = super().detect_and_ocr(image, direct_ocr=True)
# Move box
for result in results:
x, _ = area_center(result.box)
# Belongs to right image
if x >= lw:
result.box = area_offset(result.box, offset=(-lw, 0))
result.box = area_offset(result.box, offset=OCR_DUNGEON_TELEPORT.area[:2])
# Belongs to left image
else:
result.box = area_offset(result.box, offset=OCR_DUNGEON_NAME.area[:2])
return results
def _match_result(self, *args, **kwargs):
"""
Convert MapPlane object to their corresponding DungeonList object
"""
matched = super()._match_result(*args, **kwargs)
if self.target_dungeon is not None and matched is not None:
if self.target_dungeon.is_Calyx_Golden:
# convert MapPlane and ignore DungeonList
if isinstance(matched, DungeonList):
return
for dungeon in DungeonList.instances.values():
if dungeon.is_Calyx_Golden and dungeon.plane == matched:
return dungeon
if self.target_dungeon.is_Calyx_Crimson:
if isinstance(matched, DungeonList):
return
for dungeon in DungeonList.instances.values():
if dungeon.is_Calyx_Crimson and dungeon.plane == matched:
return dungeon
else:
if isinstance(matched, MapPlane):
return
return matched
class DraggableDungeonList(DraggableList):
teleports: list[OcrResultButton] = []
navigates: list[OcrResultButton] = []
# target_dungeon: Dungeon attribute to use map planes to predict dungeons only.
target_dungeon = None
# limit_entrance: True to ensure the teleport button is insight
limit_entrance = False
def load_rows(self, main: ModuleBase, allow_early_access=False):
"""
Args:
main:
allow_early_access: True to allow dungeons that are in temporarily early access during events
"""
relative_area = (0, -40, 1280, 120)
def create_ocr_class(*args, **kwargs):
# Passing to OcrDungeonList
obj = OcrDungeonList(*args, **kwargs)
obj.target_dungeon = self.target_dungeon
obj.limit_entrance = self.limit_entrance
return obj
self.ocr_class = create_ocr_class
super().load_rows(main=main)
# Check early access dungeons
buttons = DUNGEON_LIST.cur_buttons.copy()
for name, button in split_and_pair_buttons(
DUNGEON_LIST.cur_buttons,
split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Enter,
relative_area=relative_area
):
logger.warning(f'Early access dungeon: {name}')
buttons.remove(name)
buttons.remove(button)
# Remove early access dungeons
if not allow_early_access:
DUNGEON_LIST.cur_buttons = buttons
# From super.load_rows(), re-calculate indexes
indexes = [self.keyword2index(row.matched_keyword)
for row in self.cur_buttons]
indexes = [index for index in indexes if index]
if not indexes:
logger.warning(f'No valid rows loaded into {self}')
return
self.cur_min = min(indexes)
self.cur_max = max(indexes)
logger.attr(self.name, f'{self.cur_min} - {self.cur_max}')
# Replace dungeon.button with teleport
self.teleports = list(split_and_pair_button_attr(
self.cur_buttons,
split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Teleport and x != KEYWORDS_DUNGEON_ENTRANCE.Enter,
relative_area=relative_area
))
self.navigates = list(split_and_pair_button_attr(
self.cur_buttons,
split_func=lambda x: x != KEYWORDS_DUNGEON_ENTRANCE.Navigate,
relative_area=relative_area
))
DUNGEON_LIST = DraggableDungeonList(
'DungeonList', keyword_class=[DungeonList, DungeonEntrance, MapPlane],
ocr_class=OcrDungeonList, search_button=OCR_DUNGEON_NAME)
class DungeonUIList(UI):
def _dungeon_list_reset(self):
"""
Reset list to top
Returns:
bool: If success
"""
logger.info('Dungeon list reset')
current = LIST_SORTING.get(main=self)
if current == LIST_SORTING.Descending:
another = LIST_SORTING.Ascending
elif current == LIST_SORTING.Ascending:
another = LIST_SORTING.Descending
else:
logger.warning('Unknown dungeon LIST_SORTING')
return False
LIST_SORTING.set(another, main=self)
LIST_SORTING.set(current, main=self)
return True
def _dungeon_insight_index(self, dungeon: DungeonList):
"""
Insight a dungeon using pre-defined dungeon indexes from DUNGEON_LIST
Pages:
in: page_guide, Survival_Index, nav including dungeon
out: page_guide, Survival_Index, nav including dungeon, dungeon insight
"""
logger.hr('Dungeon insight (index)', level=2)
if dungeon.is_Ornament_Extraction:
# Limit drag area in iOrnament_Extraction
DUNGEON_LIST.search_button = OCR_DUNGEON_NAME_ROGUE
elif dungeon.is_Echo_of_War:
DUNGEON_LIST.search_button = OCR_DUNGEON_LIST
else:
DUNGEON_LIST.search_button = OCR_DUNGEON_NAME
# Predict dungeon by plane name in calyxes where dungeons share the same names
DUNGEON_LIST.target_dungeon = dungeon
DUNGEON_LIST.check_row_order = True
# Insight dungeon
DUNGEON_LIST.insight_row(dungeon, main=self)
self.device.click_record_clear()
# Check if dungeon unlocked
for entrance in DUNGEON_LIST.navigates:
entrance: OcrResultButton = entrance
logger.warning(f'Teleport {entrance.matched_keyword} is not unlocked')
if entrance == dungeon:
logger.error(f'Trying to enter dungeon {dungeon}, but teleport is not unlocked')
return False
# Find teleport button
if dungeon not in [tp.matched_keyword for tp in DUNGEON_LIST.teleports]:
# Dungeon name is insight but teleport button is not
logger.info('Dungeon name is insight, swipe down a little bit to find the teleport button')
if dungeon.is_Forgotten_Hall:
DUNGEON_LIST.drag_vector = (-0.4, -0.2) # Keyword loaded is reversed
else:
DUNGEON_LIST.drag_vector = (0.2, 0.4)
DUNGEON_LIST.limit_entrance = True
DUNGEON_LIST.insight_row(dungeon, main=self)
self.device.click_record_clear()
DUNGEON_LIST.drag_vector = DraggableList.drag_vector
DUNGEON_LIST.limit_entrance = False
DUNGEON_LIST.load_rows(main=self)
# Check if dungeon unlocked
for entrance in DUNGEON_LIST.navigates:
if entrance.matched_keyword == dungeon:
logger.error(f'Trying to enter dungeon {dungeon}, but teleport is not unlocked')
return False
return True
def _dungeon_insight_sort(self, dungeon: DungeonList):
"""
Insight a dungeon using sorter and plain drag, reset list on error
"""
logger.hr('Dungeon insight (sort)', level=2)
logger.info(f'Dungeon insight: {dungeon}')
DUNGEON_LIST.search_button = OCR_DUNGEON_NAME
DUNGEON_LIST.target_dungeon = dungeon
DUNGEON_LIST.check_row_order = False
for _ in range(3):
visited = set()
end_count = 0
self.device.click_record_clear()
while 1:
visited_count = len(visited)
# Load
DUNGEON_LIST.load_rows(main=self, allow_early_access=True)
for entrance in DUNGEON_LIST.teleports:
if entrance.matched_keyword == dungeon:
logger.info(f'Found dungeon {dungeon}')
return True
for entrance in DUNGEON_LIST.navigates:
if entrance.matched_keyword == dungeon:
logger.error(f'Trying to enter dungeon {dungeon}, but teleport is not unlocked')
return False
# Check end
for entrance in DUNGEON_LIST.cur_buttons:
visited.add(entrance.matched_keyword.name)
if len(visited) <= visited_count:
logger.warning('No more rows loaded')
end_count += 1
if end_count >= 3:
logger.error('Dungeon list reached end but target dungeon not found')
break
# Drag down
DUNGEON_LIST.drag_page('down', main=self)
self.wait_until_stable(DUNGEON_LIST.search_button, timer=Timer(
0, count=0), timeout=Timer(1.5, count=5))
self._dungeon_list_reset()
logger.error('Failed to insight dungeon after 3 trial')
return False
def dungeon_insight(self, dungeon: DungeonList):
"""
Insight a dungeon
Pages:
in: page_guide, Survival_Index, nav including dungeon
out: page_guide, Survival_Index, nav including dungeon, dungeon insight
"""
if dungeon.is_Calyx_Crimson or dungeon.is_Stagnant_Shadow:
# Having dungeon sorting and early access
self._dungeon_insight_sort(dungeon)
else:
self._dungeon_insight_index(dungeon)
def _dungeon_enter(self, dungeon, enter_check_button=COMBAT_PREPARE, skip_first_screenshot=True):
"""
Pages:
in: page_guide, Survival_Index, nav including dungeon
out: COMBAT_PREPARE, FORGOTTEN_HALL_CHECK
"""
logger.hr('Dungeon enter', level=2)
DUNGEON_LIST.target_dungeon = dungeon
skip_first_load = skip_first_screenshot
@run_once
def screenshot_interval_set():
self.device.screenshot_interval_set('combat')
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.appear(enter_check_button):
logger.info(f'Arrive {enter_check_button.name}')
break
# Additional
# Popup that confirm character switch
if self.handle_popup_confirm():
self.interval_reset(page_guide.check_button)
continue
# Click teleport
if self.appear(page_guide.check_button, interval=1):
if skip_first_load:
skip_first_load = False
else:
DUNGEON_LIST.load_rows(main=self)
entrance = DUNGEON_LIST.keyword2button(dungeon)
if entrance is not None:
# Avoid clicking the soring button
entrance.button = area_limit(entrance.button, OCR_DUNGEON_TELEPORT.area)
self.device.click(entrance)
screenshot_interval_set()
self.interval_reset(page_guide.check_button)
continue
else:
logger.warning(f'Cannot find dungeon entrance of {dungeon}')
continue
self.device.screenshot_interval_set()
if __name__ == '__main__':
self = DungeonUIList('src')
self.device.screenshot()
self.dungeon_insight(KEYWORDS_DUNGEON_LIST.Echo_of_War_Divine_Seed)

351
tasks/dungeon/ui/nav.py Normal file
View File

@ -0,0 +1,351 @@
import cv2
import numpy as np
from module.base.base import ModuleBase
from module.base.timer import Timer
from module.base.utils import get_color
from module.logger import logger
from module.ocr.ocr import Ocr
from module.ui.draggable_list import DraggableList
from module.ui.switch import Switch
from tasks.base.page import page_guide
from tasks.base.ui import UI
from tasks.dungeon.assets.assets_dungeon_ui import *
from tasks.dungeon.assets.assets_dungeon_ui_rogue import *
from tasks.dungeon.keywords import (
DungeonNav,
DungeonTab,
KEYWORDS_DUNGEON_NAV,
KEYWORDS_DUNGEON_TAB
)
from tasks.map.interact.aim import inrange
class DungeonTabSwitch(Switch):
SEARCH_BUTTON = TAB_SEARCH
def add_state(self, state, check_button, click_button=None):
# Load search
if check_button is not None:
check_button.load_search(self.__class__.SEARCH_BUTTON.area)
if click_button is not None:
click_button.load_search(self.__class__.SEARCH_BUTTON.area)
return super().add_state(state, check_button, click_button)
def click(self, state, main):
"""
Args:
state (str):
main (ModuleBase):
"""
button = self.get_data(state)['click_button']
_ = main.appear(button) # Search button to load offset
main.device.click(button)
SWITCH_DUNGEON_TAB = DungeonTabSwitch('DungeonTab', is_selector=True)
SWITCH_DUNGEON_TAB.add_state(
KEYWORDS_DUNGEON_TAB.Operation_Briefing,
check_button=OPERATION_BRIEFING_CHECK,
click_button=OPERATION_BRIEFING_CLICK
)
SWITCH_DUNGEON_TAB.add_state(
KEYWORDS_DUNGEON_TAB.Daily_Training,
check_button=DAILY_TRAINING_CHECK,
click_button=DAILY_TRAINING_CLICK
)
SWITCH_DUNGEON_TAB.add_state(
KEYWORDS_DUNGEON_TAB.Survival_Index,
check_button=SURVIVAL_INDEX_CHECK,
click_button=SURVIVAL_INDEX_CLICK
)
SWITCH_DUNGEON_TAB.add_state(
KEYWORDS_DUNGEON_TAB.Simulated_Universe,
check_button=SIMULATED_UNIVERSE_CHECK,
click_button=SIMULATED_UNIVERSE_CLICK
)
SWITCH_DUNGEON_TAB.add_state(
KEYWORDS_DUNGEON_TAB.Treasures_Lightward,
check_button=TREASURES_LIGHTWARD_CHECK,
click_button=TREASURES_LIGHTWARD_CLICK
)
class OcrDungeonNav(Ocr):
def after_process(self, result):
result = super().after_process(result)
result = result.replace('#', '')
if self.lang == 'cn':
result = result.replace('萼喜', '')
result = result.replace('', '') # 凝带虚影
return result
class DraggableDungeonNav(DraggableList):
# 0.5 is the magic number to reach bottom in 1 swipe
# but relax we still have retires when magic doesn't work
drag_vector = (0.50, 0.52)
DUNGEON_NAV_LIST = DraggableDungeonNav(
'DungeonNavList', keyword_class=DungeonNav, ocr_class=OcrDungeonNav, search_button=OCR_DUNGEON_NAV)
class DungeonUINav(UI):
def dungeon_tab_goto(self, state: DungeonTab):
"""
Args:
state:
Returns:
bool: If UI switched
Examples:
self = DungeonUI('alas')
self.device.screenshot()
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Operation_Briefing)
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Daily_Training)
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index)
"""
logger.hr('Dungeon tab goto', level=2)
ui_switched = self.ui_ensure(page_guide)
tab_switched = SWITCH_DUNGEON_TAB.set(state, main=self)
if ui_switched or tab_switched:
if state == KEYWORDS_DUNGEON_TAB.Daily_Training:
logger.info(f'Tab goto {state}, wait until loaded')
self._dungeon_wait_daily_training_loaded()
elif state == KEYWORDS_DUNGEON_TAB.Survival_Index:
logger.info(f'Tab goto {state}, wait until loaded')
self._dungeon_wait_survival_index_loaded()
elif state == KEYWORDS_DUNGEON_TAB.Treasures_Lightward:
logger.info(f'Tab goto {state}, wait until loaded')
self._dungeon_wait_treasures_lightward_loaded()
return True
else:
return False
def _dungeon_wait_daily_training_loaded(self, skip_first_screenshot=True):
"""
Returns:
bool: True if wait success, False if wait timeout.
Pages:
in: page_guide, Daily_Training
"""
timeout = Timer(2, count=4).start()
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if timeout.reached():
logger.warning('Wait daily training loaded timeout')
return False
color = get_color(self.device.image, DAILY_TRAINING_LOADED.area)
if np.mean(color) < 128:
logger.info('Daily training loaded')
return True
def _dungeon_wait_survival_index_loaded(self, skip_first_screenshot=True):
"""
Returns:
bool: True if wait success, False if wait timeout.
Pages:
in: page_guide, Survival_Index
"""
timeout = Timer(2, count=4).start()
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if timeout.reached():
logger.warning('Wait survival index loaded timeout')
return False
if self.appear(SURVIVAL_INDEX_SU_LOADED):
logger.info('Survival index loaded, SURVIVAL_INDEX_SU_LOADED')
return True
if self.appear(SURVIVAL_INDEX_OE_LOADED):
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:
bool: True if wait success, False if wait timeout.
Pages:
in: page_guide, Survival_Index
"""
timeout = Timer(2, count=4).start()
TREASURES_LIGHTWARD_LOADED.set_search_offset((5, 5))
TREASURES_LIGHTWARD_LOCKED.set_search_offset((5, 5))
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if timeout.reached():
logger.warning('Wait treasures lightward loaded timeout')
return False
if self.appear(TREASURES_LIGHTWARD_LOADED):
logger.info('Treasures lightward loaded (event unlocked)')
return True
if self.appear(TREASURES_LIGHTWARD_LOCKED):
logger.info('Treasures lightward loaded (event locked)')
return True
def _dungeon_list_button_has_content(self):
# Check if having any content
# List background: 254, guild border: 225
r, g, b = cv2.split(self.image_crop(LIST_LOADED_CHECK, copy=False))
minimum = cv2.min(cv2.min(r, g), b)
minimum = inrange(minimum, lower=0, upper=180)
if minimum.size > 100:
return True
else:
return False
def _dungeon_wait_until_dungeon_list_loaded(self, skip_first_screenshot=True):
timeout = Timer(1, count=3).start()
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if timeout.reached():
logger.warning('Wait until dungeon list loaded timeout')
return False
if self._dungeon_list_button_has_content():
logger.info('Dungeon list loaded')
return True
def _dungeon_wait_until_echo_or_war_stabled(self, skip_first_screenshot=True):
"""
Returns:
bool: True if wait success, False if wait timeout.
Pages:
in: page_guide, Survival_Index
"""
# Wait until Forgotten_Hall stabled
timeout = Timer(2, count=4).start()
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if timeout.reached():
logger.warning('Wait until Echo_of_War stabled timeout')
return False
DUNGEON_NAV_LIST.load_rows(main=self)
# End
button = DUNGEON_NAV_LIST.keyword2button(KEYWORDS_DUNGEON_NAV.Echo_of_War, show_warning=False)
if button:
# 513 is the top of the last row of DungeonNav
if button.area[1] > 513:
logger.info('DungeonNav row Echo_of_War stabled')
return True
else:
logger.info('No Echo_of_War in list skip waiting')
return False
def dungeon_nav_goto(self, nav: DungeonNav, skip_first_screenshot=True):
"""
Equivalent to `DUNGEON_NAV_LIST.select_row(dungeon.dungeon_nav, main=self)`
but with tricks to be faster
Args:
nav:
skip_first_screenshot:
"""
logger.hr('Dungeon nav goto', level=2)
logger.info(f'Dungeon nav goto {nav}')
# Wait rows
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
DUNGEON_NAV_LIST.load_rows(main=self)
if DUNGEON_NAV_LIST.cur_buttons:
break
# Wait first row selected
timeout = Timer(0.5, count=2).start()
skip_first_screenshot = True
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if timeout.reached():
logger.info('DUNGEON_NAV_LIST not selected')
break
if button := DUNGEON_NAV_LIST.get_selected_row(main=self):
logger.info(f'DUNGEON_NAV_LIST selected at {button}')
break
# Check if it's at the first page.
if DUNGEON_NAV_LIST.keyword2button(KEYWORDS_DUNGEON_NAV.Simulated_Universe, show_warning=False) \
or DUNGEON_NAV_LIST.keyword2button(KEYWORDS_DUNGEON_NAV.Ornament_Extraction, show_warning=False):
# Going to use a faster method to navigate but can only start from list top
logger.info('DUNGEON_NAV_LIST at top')
# Update points if possible
# 2.3, No longer weekly points after Divergent Universe unlocked
# if DUNGEON_NAV_LIST.is_row_selected(button, main=self):
# self.dungeon_update_simuni()
# Treasures lightward is always at top
elif DUNGEON_NAV_LIST.keyword2button(KEYWORDS_DUNGEON_NAV.Forgotten_Hall, show_warning=False) \
or DUNGEON_NAV_LIST.keyword2button(KEYWORDS_DUNGEON_NAV.Pure_Fiction, show_warning=False):
logger.info('DUNGEON_NAV_LIST at top')
else:
# To start from any list states.
logger.info('DUNGEON_NAV_LIST not at top')
DUNGEON_NAV_LIST.select_row(nav, main=self)
return True
# Check the first page
if nav in [
KEYWORDS_DUNGEON_NAV.Simulated_Universe,
KEYWORDS_DUNGEON_NAV.Divergent_Universe,
KEYWORDS_DUNGEON_NAV.Ornament_Extraction,
KEYWORDS_DUNGEON_NAV.Calyx_Golden,
KEYWORDS_DUNGEON_NAV.Calyx_Crimson,
KEYWORDS_DUNGEON_NAV.Stagnant_Shadow,
KEYWORDS_DUNGEON_NAV.Cavern_of_Corrosion,
KEYWORDS_DUNGEON_NAV.Forgotten_Hall,
KEYWORDS_DUNGEON_NAV.Pure_Fiction,
]:
button = DUNGEON_NAV_LIST.keyword2button(nav)
if button:
DUNGEON_NAV_LIST.select_row(nav, main=self, insight=False)
return True
# Check the second page
while 1:
DUNGEON_NAV_LIST.drag_page('down', main=self)
# No skip_first_screenshot since drag_page is just called
if self._dungeon_wait_until_echo_or_war_stabled(skip_first_screenshot=False):
DUNGEON_NAV_LIST.select_row(nav, main=self, insight=False)
return True

41
tasks/dungeon/ui/ui.py Normal file
View File

@ -0,0 +1,41 @@
from module.logger import logger
from tasks.dungeon.keywords import DungeonList
from tasks.dungeon.ui.interact import DungeonUIInteract
from tasks.dungeon.ui.llist import DungeonUIList
from tasks.dungeon.ui.nav import DungeonUINav
from tasks.dungeon.ui.state import DungeonState
class DungeonUI(DungeonState, DungeonUINav, DungeonUIList, DungeonUIInteract):
def dungeon_goto(self, dungeon: DungeonList):
"""
Returns:
bool: If success
Pages:
in: page_guide, Survival_Index
out: COMBAT_PREPARE if success
page_guide if failed
Examples:
from tasks.dungeon.keywords import KEYWORDS_DUNGEON_LIST
self = DungeonUI('src')
self.device.screenshot()
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index)
self.dungeon_goto(KEYWORDS_DUNGEON_LIST.Calyx_Crimson_Harmony)
"""
# Reset search button
if dungeon.is_Calyx_Golden \
or dungeon.is_Calyx_Crimson \
or dungeon.is_Stagnant_Shadow \
or dungeon.is_Cavern_of_Corrosion \
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)
self._dungeon_enter(dungeon)
return True
logger.error(f'Goto dungeon {dungeon} is not supported')
return False

View File

@ -3,9 +3,11 @@ from module.base.utils import random_rectangle_vector
from module.logger import logger from module.logger import logger
from tasks.base.page import page_guide from tasks.base.page import page_guide
from tasks.dungeon.assets.assets_dungeon_ui import * from tasks.dungeon.assets.assets_dungeon_ui import *
from tasks.dungeon.assets.assets_dungeon_ui_list import OCR_DUNGEON_LIST
from tasks.dungeon.assets.assets_dungeon_ui_rogue import * from tasks.dungeon.assets.assets_dungeon_ui_rogue import *
from tasks.dungeon.keywords import KEYWORDS_DUNGEON_NAV, KEYWORDS_DUNGEON_TAB from tasks.dungeon.keywords import KEYWORDS_DUNGEON_NAV, KEYWORDS_DUNGEON_TAB
from tasks.dungeon.ui import DungeonUI, SWITCH_DUNGEON_TAB from tasks.dungeon.ui.nav import SWITCH_DUNGEON_TAB
from tasks.dungeon.ui.ui import DungeonUI
from tasks.forgotten_hall.assets.assets_forgotten_hall_ui import TELEPORT from tasks.forgotten_hall.assets.assets_forgotten_hall_ui import TELEPORT
@ -41,7 +43,7 @@ class DungeonRogueUI(DungeonUI):
logger.info(f'Tab goto {state}, wait until loaded') logger.info(f'Tab goto {state}, wait until loaded')
self._dungeon_wait_until_rogue_loaded() self._dungeon_wait_until_rogue_loaded()
# Switch nav # Switch nav
self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Simulated_Universe) self.dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Simulated_Universe)
# No idea how to wait list loaded # No idea how to wait list loaded
# List is not able to swipe without fully loaded # List is not able to swipe without fully loaded
self.wait_until_stable(LIST_LOADED_CHECK) self.wait_until_stable(LIST_LOADED_CHECK)
@ -59,7 +61,7 @@ class DungeonRogueUI(DungeonUI):
if self.appear(SURVIVAL_INDEX_SU_LOADED): if self.appear(SURVIVAL_INDEX_SU_LOADED):
logger.info('Already at nav Simulated_Universe') logger.info('Already at nav Simulated_Universe')
else: else:
self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Simulated_Universe) self.dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Simulated_Universe)
def _dungeon_wait_until_rogue_loaded(self, skip_first_screenshot=True): def _dungeon_wait_until_rogue_loaded(self, skip_first_screenshot=True):
""" """

View File

@ -2,10 +2,9 @@ from module.config.utils import get_server_next_monday_update
from module.logger import logger from module.logger import logger
from module.ocr.ocr import DigitCounter from module.ocr.ocr import DigitCounter
from tasks.daily.keywords import KEYWORDS_DAILY_QUEST from tasks.daily.keywords import KEYWORDS_DAILY_QUEST
from tasks.dungeon.assets.assets_dungeon_ui import OCR_DUNGEON_LIST, OCR_WEEKLY_LIMIT from tasks.dungeon.assets.assets_dungeon_ui import OCR_WEEKLY_LIMIT
from tasks.dungeon.dungeon import Dungeon from tasks.dungeon.dungeon import Dungeon
from tasks.dungeon.keywords import DungeonList, KEYWORDS_DUNGEON_NAV, KEYWORDS_DUNGEON_TAB from tasks.dungeon.keywords import DungeonList, KEYWORDS_DUNGEON_NAV, KEYWORDS_DUNGEON_TAB
from tasks.dungeon.ui import DUNGEON_LIST
class OcrWeeklyLimit(DigitCounter): class OcrWeeklyLimit(DigitCounter):
@ -78,8 +77,7 @@ class WeeklyDungeon(Dungeon):
# UI switches # UI switches
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index) self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Survival_Index)
# Equivalent to self.dungeon_goto(dungeon), but check limit remains # Equivalent to self.dungeon_goto(dungeon), but check limit remains
DUNGEON_LIST.search_button = OCR_DUNGEON_LIST self.dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Echo_of_War)
self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Echo_of_War)
self._dungeon_wait_until_dungeon_list_loaded() self._dungeon_wait_until_dungeon_list_loaded()
monday = get_server_next_monday_update(self.config.Scheduler_ServerUpdate) monday = get_server_next_monday_update(self.config.Scheduler_ServerUpdate)
@ -94,7 +92,7 @@ class WeeklyDungeon(Dungeon):
self.config.task_delay(target=monday) self.config.task_delay(target=monday)
self.config.task_stop() self.config.task_stop()
self._dungeon_insight(dungeon) self.dungeon_insight(dungeon)
self._dungeon_enter(dungeon) self._dungeon_enter(dungeon)
# Combat # Combat

View File

@ -10,8 +10,8 @@ from module.ocr.keyword import Keyword
from module.ocr.ocr import Ocr, OcrResultButton from module.ocr.ocr import Ocr, OcrResultButton
from module.ui.draggable_list import DraggableList from module.ui.draggable_list import DraggableList
from tasks.base.assets.assets_base_page import FORGOTTEN_HALL_CHECK, MAP_EXIT from tasks.base.assets.assets_base_page import FORGOTTEN_HALL_CHECK, MAP_EXIT
from tasks.dungeon.ui.ui import DungeonUI
from tasks.dungeon.keywords import DungeonList, KEYWORDS_DUNGEON_LIST, KEYWORDS_DUNGEON_NAV, KEYWORDS_DUNGEON_TAB from tasks.dungeon.keywords import DungeonList, KEYWORDS_DUNGEON_LIST, KEYWORDS_DUNGEON_NAV, KEYWORDS_DUNGEON_TAB
from tasks.dungeon.ui import DungeonUI
from tasks.forgotten_hall.assets.assets_forgotten_hall_nav import * from tasks.forgotten_hall.assets.assets_forgotten_hall_nav import *
from tasks.forgotten_hall.assets.assets_forgotten_hall_ui import * from tasks.forgotten_hall.assets.assets_forgotten_hall_ui import *
from tasks.forgotten_hall.keywords import ForgottenHallStage, KEYWORDS_FORGOTTEN_HALL_STAGE from tasks.forgotten_hall.keywords import ForgottenHallStage, KEYWORDS_FORGOTTEN_HALL_STAGE
@ -187,7 +187,7 @@ class ForgottenHallUI(DungeonUI, ForgottenHallTeam):
logger.info('Already in forgotten hall') logger.info('Already in forgotten hall')
else: else:
self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Treasures_Lightward) self.dungeon_tab_goto(KEYWORDS_DUNGEON_TAB.Treasures_Lightward)
self._dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Forgotten_Hall) self.dungeon_nav_goto(KEYWORDS_DUNGEON_NAV.Forgotten_Hall)
self.stage_choose(dungeon) self.stage_choose(dungeon)
logger.info(f'Stage list select: {stage_keyword}') logger.info(f'Stage list select: {stage_keyword}')

View File

@ -465,8 +465,19 @@ Luofu_TheShacklingPrison = MapPlane(
world_id=2, world_id=2,
plane_id=2024101, plane_id=2024101,
) )
Penacony_TheReverieReality = MapPlane( Luofu_Skysplitter = MapPlane(
id=43, id=43,
name='Luofu_Skysplitter',
cn='竞锋舰',
cht='競鋒艦',
en='Skysplitter',
jp='競鋒艦',
es='Bifurcacielos',
world_id=2,
plane_id=2024201,
)
Penacony_TheReverieReality = MapPlane(
id=44,
name='Penacony_TheReverieReality', name='Penacony_TheReverieReality',
cn='「白日梦」酒店-现实', cn='「白日梦」酒店-现实',
cht='「白日夢」飯店-現實', cht='「白日夢」飯店-現實',
@ -477,7 +488,7 @@ Penacony_TheReverieReality = MapPlane(
plane_id=1030501, plane_id=1030501,
) )
Penacony_GoldenHour = MapPlane( Penacony_GoldenHour = MapPlane(
id=44, id=45,
name='Penacony_GoldenHour', name='Penacony_GoldenHour',
cn='黄金的时刻', cn='黄金的时刻',
cht='黃金的時刻', cht='黃金的時刻',
@ -488,7 +499,7 @@ Penacony_GoldenHour = MapPlane(
plane_id=1030101, plane_id=1030101,
) )
Penacony_DreamEdge = MapPlane( Penacony_DreamEdge = MapPlane(
id=45, id=46,
name='Penacony_DreamEdge', name='Penacony_DreamEdge',
cn='筑梦边境', cn='筑梦边境',
cht='築夢邊境', cht='築夢邊境',
@ -499,7 +510,7 @@ Penacony_DreamEdge = MapPlane(
plane_id=2031301, plane_id=2031301,
) )
Penacony_AChildDream = MapPlane( Penacony_AChildDream = MapPlane(
id=46, id=47,
name='Penacony_AChildDream', name='Penacony_AChildDream',
cn='稚子的梦', cn='稚子的梦',
cht='稚子的夢', cht='稚子的夢',
@ -510,7 +521,7 @@ Penacony_AChildDream = MapPlane(
plane_id=2031201, plane_id=2031201,
) )
Penacony_TheReverieDreamscape = MapPlane( Penacony_TheReverieDreamscape = MapPlane(
id=47, id=48,
name='Penacony_TheReverieDreamscape', name='Penacony_TheReverieDreamscape',
cn='「白日梦」酒店-梦境', cn='「白日梦」酒店-梦境',
cht='「白日夢」飯店-夢境', cht='「白日夢」飯店-夢境',
@ -521,7 +532,7 @@ Penacony_TheReverieDreamscape = MapPlane(
plane_id=2031101, plane_id=2031101,
) )
Penacony_DewlightPavilion = MapPlane( Penacony_DewlightPavilion = MapPlane(
id=48, id=49,
name='Penacony_DewlightPavilion', name='Penacony_DewlightPavilion',
cn='朝露公馆', cn='朝露公馆',
cht='朝露公館', cht='朝露公館',
@ -532,7 +543,7 @@ Penacony_DewlightPavilion = MapPlane(
plane_id=2032201, plane_id=2032201,
) )
Penacony_ClockStudiosThemePark = MapPlane( Penacony_ClockStudiosThemePark = MapPlane(
id=49, id=50,
name='Penacony_ClockStudiosThemePark', name='Penacony_ClockStudiosThemePark',
cn='克劳克影视乐园', cn='克劳克影视乐园',
cht='克勞克影視樂園', cht='克勞克影視樂園',
@ -543,7 +554,7 @@ Penacony_ClockStudiosThemePark = MapPlane(
plane_id=2032101, plane_id=2032101,
) )
Penacony_DreamfluxReef = MapPlane( Penacony_DreamfluxReef = MapPlane(
id=50, id=51,
name='Penacony_DreamfluxReef', name='Penacony_DreamfluxReef',
cn='流梦礁', cn='流梦礁',
cht='流夢礁', cht='流夢礁',
@ -554,7 +565,7 @@ Penacony_DreamfluxReef = MapPlane(
plane_id=1030401, plane_id=1030401,
) )
Penacony_SoulGladScorchsandAuditionVenue = MapPlane( Penacony_SoulGladScorchsandAuditionVenue = MapPlane(
id=51, id=52,
name='Penacony_SoulGladScorchsandAuditionVenue', name='Penacony_SoulGladScorchsandAuditionVenue',
cn='苏乐达热砂海选会场', cn='苏乐达热砂海选会场',
cht='蘇樂達熱砂海選會場', cht='蘇樂達熱砂海選會場',
@ -565,7 +576,7 @@ Penacony_SoulGladScorchsandAuditionVenue = MapPlane(
plane_id=2033101, plane_id=2033101,
) )
Penacony_PenaconyGrandTheater = MapPlane( Penacony_PenaconyGrandTheater = MapPlane(
id=52, id=53,
name='Penacony_PenaconyGrandTheater', name='Penacony_PenaconyGrandTheater',
cn='匹诺康尼大剧院', cn='匹诺康尼大剧院',
cht='匹諾康尼大劇院', cht='匹諾康尼大劇院',

View File

@ -6,7 +6,7 @@ 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_prepare import COMBAT_PREPARE
from tasks.combat.assets.assets_combat_support import COMBAT_SUPPORT_LIST from tasks.combat.assets.assets_combat_support import COMBAT_SUPPORT_LIST
from tasks.dungeon.dungeon import Dungeon from tasks.dungeon.dungeon import Dungeon
from tasks.dungeon.state import DungeonState from tasks.dungeon.ui.state import DungeonState
from tasks.map.route.loader import RouteLoader from tasks.map.route.loader import RouteLoader
from tasks.map.route.route.daily import OrnamentExtraction__route from tasks.map.route.route.daily import OrnamentExtraction__route
from tasks.ornament.assets.assets_ornament_combat import * from tasks.ornament.assets.assets_ornament_combat import *

View File

@ -224,8 +224,34 @@ Dream_Fridge = ItemAscension(
item_group=1100, item_group=1100,
dungeon_id=1115, dungeon_id=1115,
) )
Dream_Flamer = ItemAscension( Nail_of_the_Beast_Coffin = ItemAscension(
id=18, id=18,
name='Nail_of_the_Beast_Coffin',
cn='兽棺之钉',
cht='獸棺之釘',
en='Nail of the Beast Coffin',
jp='獣棺の釘',
es='Clavo del ataúd bestial',
rarity='VeryRare',
item_id=110424,
item_group=1100,
dungeon_id=1120,
)
A_Glass_of_the_Besotted_Era = ItemAscension(
id=19,
name='A_Glass_of_the_Besotted_Era',
cn='一杯酩酊的时代',
cht='一杯酩酊的時代',
en='A Glass of the Besotted Era',
jp='酩酊する時代の一杯',
es='Copa de la era embriagada',
rarity='VeryRare',
item_id=110425,
item_group=1100,
dungeon_id=1121,
)
Dream_Flamer = ItemAscension(
id=20,
name='Dream_Flamer', name='Dream_Flamer',
cn='炙梦喷枪', cn='炙梦喷枪',
cht='炙夢噴槍', cht='炙夢噴槍',

View File

@ -81,3 +81,16 @@ Lost_Echo_of_the_Shared_Wish = ItemWeekly(
item_group=1310, item_group=1310,
dungeon_id=1305, dungeon_id=1305,
) )
Auspice_Sliver = ItemWeekly(
id=7,
name='Auspice_Sliver',
cn='吉光片羽',
cht='吉光片羽',
en='Auspice Sliver',
jp='吉光の羽',
es='Pluma auspiciosa',
rarity='VeryRare',
item_id=110506,
item_group=1310,
dungeon_id=1306,
)

View File

@ -37,6 +37,8 @@ class OcrItemName(Ocr):
# Error words on blank background # Error words on blank background
result = re.sub('^[國東]', '', result) result = re.sub('^[國東]', '', result)
result = re.sub('時$', '', result) result = re.sub('時$', '', result)
# 一杯酩酊的时代
result = re.sub('一杯[酪酩酊酐]*的', '一杯酩酊的', result)
return result return result

View File

@ -14,8 +14,8 @@ from tasks.base.assets.assets_base_page import MAP_EXIT
from tasks.base.page import page_guide, page_item, page_main, page_rogue from tasks.base.page import page_guide, page_item, page_main, page_rogue
from tasks.dungeon.keywords import DungeonList from tasks.dungeon.keywords import DungeonList
from tasks.dungeon.keywords.dungeon import Simulated_Universe_World_1 from tasks.dungeon.keywords.dungeon import Simulated_Universe_World_1
from tasks.dungeon.state import OcrSimUniPoint from tasks.dungeon.ui.state import OcrSimUniPoint
from tasks.dungeon.ui_rogue import DungeonRogueUI from tasks.dungeon.ui.ui_rogue import DungeonRogueUI
from tasks.forgotten_hall.assets.assets_forgotten_hall_ui import TELEPORT from tasks.forgotten_hall.assets.assets_forgotten_hall_ui import TELEPORT
from tasks.rogue.assets.assets_rogue_entry import ( from tasks.rogue.assets.assets_rogue_entry import (
LEVEL_CONFIRM, LEVEL_CONFIRM,

View File

@ -123,8 +123,8 @@ STRATEGY_COMMON = {
KEYWORDS_ROGUE_EVENT_OPTION.Leave_3c49 KEYWORDS_ROGUE_EVENT_OPTION.Leave_3c49
], ],
KEYWORDS_ROGUE_EVENT_TITLE.Robot_Sales_Terminal: [ KEYWORDS_ROGUE_EVENT_TITLE.Robot_Sales_Terminal: [
KEYWORDS_ROGUE_EVENT_OPTION.Purchase_a_1_3_star_Blessing, KEYWORDS_ROGUE_EVENT_OPTION.Purchase_1_Blessing_of_1_to_3_star_rarity,
KEYWORDS_ROGUE_EVENT_OPTION.Purchase_a_1_2_star_Blessing, KEYWORDS_ROGUE_EVENT_OPTION.Purchase_1_Blessing_of_1_to_3_star_rarity,
KEYWORDS_ROGUE_EVENT_OPTION.Leave_3c49 KEYWORDS_ROGUE_EVENT_OPTION.Leave_3c49
], ],
KEYWORDS_ROGUE_EVENT_TITLE.History_Fictionologists: [ KEYWORDS_ROGUE_EVENT_TITLE.History_Fictionologists: [

View File

@ -4,7 +4,7 @@ from module.base.timer import Timer
from module.logger import logger from module.logger import logger
from tasks.base.assets.assets_base_popup import GET_REWARD from tasks.base.assets.assets_base_popup import GET_REWARD
from tasks.combat.interact import CombatInteract from tasks.combat.interact import CombatInteract
from tasks.dungeon.state import DungeonState from tasks.dungeon.ui.state import DungeonState
from tasks.rogue.assets.assets_rogue_reward import REWARD_CLOSE, USE_IMMERSIFIER, USE_STAMINA from tasks.rogue.assets.assets_rogue_reward import REWARD_CLOSE, USE_IMMERSIFIER, USE_STAMINA
from tasks.rogue.blessing.ui import RogueUI from tasks.rogue.blessing.ui import RogueUI

View File

@ -75,32 +75,32 @@ Equilibrium_Universe = RogueBonus(
jp='均衡な宇宙', jp='均衡な宇宙',
es='Universo equilibrado', es='Universo equilibrado',
) )
Path_of_Preservation = RogueBonus( Mechanic = RogueBonus(
id=9, id=9,
name='Path_of_Preservation', name='Mechanic',
cn='存护之路', cn='机修工',
cht='存護之路', cht='機修工',
en='Path of Preservation', en='Mechanic',
jp='存護の道', jp='機械修理工',
es='Camino de la Conservación', es='Mecánic',
) )
Path_of_Remembrance = RogueBonus( Surveyor = RogueBonus(
id=10, id=10,
name='Path_of_Remembrance', name='Surveyor',
cn='记忆之路', cn='测绘师',
cht='記憶之路', cht='測繪師',
en='Path of Remembrance', en='Surveyor',
jp='記憶の道', jp='測量士',
es='Camino de la Reminiscencia', es='Topógraf',
) )
Path_of_Nihility = RogueBonus( Adventurer = RogueBonus(
id=11, id=11,
name='Path_of_Nihility', name='Adventurer',
cn='虚无之路', cn='冒险家',
cht='虛無之路', cht='冒險家',
en='Path of Nihility', en='Adventurer',
jp='虚無の道', jp='冒険家',
es='Camino de la Nihilidad', es='Aventurero',
) )
Path_of_Abundance = RogueBonus( Path_of_Abundance = RogueBonus(
id=12, id=12,
@ -246,3 +246,39 @@ Lying_Cap = RogueBonus(
jp='ペテンハット', jp='ペテンハット',
es='Sombrero mentiroso', es='Sombrero mentiroso',
) )
Case_Folder = RogueBonus(
id=28,
name='Case_Folder',
cn='案件簿',
cht='案件簿',
en='Case Folder',
jp='事件簿',
es='Expediente de casos',
)
Bloodguilt_Tome = RogueBonus(
id=29,
name='Bloodguilt_Tome',
cn='血罪书',
cht='血罪書',
en='Bloodguilt Tome',
jp='血罪書',
es='Tomo de la culpa sangrienta',
)
Shuttle_Boat = RogueBonus(
id=30,
name='Shuttle_Boat',
cn='梭子船',
cht='渡船',
en='Shuttle Boat',
jp='杼船',
es='Nave lanzadera',
)
Consciousness_Cluster = RogueBonus(
id=31,
name='Consciousness_Cluster',
cn='意识群',
cht='意識群',
en='Consciousness Cluster',
jp='意識群',
es='Grupo de conciencia',
)

View File

@ -1218,21 +1218,21 @@ Let_the_sleeping_soldiers_wake_up_again = RogueEventOption(
jp='熟睡する兵士を「再び目覚めさせる」', jp='熟睡する兵士を「再び目覚めさせる」',
es='Dejas que los soldados dormidos despierten nuevamente.', es='Dejas que los soldados dormidos despierten nuevamente.',
) )
Purchase_a_1_2_star_Blessing = RogueEventOption( Purchase_1_Blessing_of_1_to_2_star_rarity = RogueEventOption(
id=136, id=136,
name='Purchase_a_1_2_star_Blessing', name='Purchase_1_Blessing_of_1_to_2_star_rarity',
cn='购买1个1-2星祝福', cn='购买1个1-2星祝福',
cht='購買1個一至二星祝福', cht='購買1個一至二星祝福',
en='Purchase a 12 star Blessing', en='Purchase 1 Blessing of 1- to 2-star rarity',
jp='★12の祝福を1個購入する', jp='★12の祝福を1個購入する',
es='Compra 1 bendición de 1-2 estrellas.', es='Compra 1 bendición de 1-2 estrellas.',
) )
Purchase_a_1_3_star_Blessing = RogueEventOption( Purchase_1_Blessing_of_1_to_3_star_rarity = RogueEventOption(
id=137, id=137,
name='Purchase_a_1_3_star_Blessing', name='Purchase_1_Blessing_of_1_to_3_star_rarity',
cn='购买1个1-3星祝福', cn='购买1个1-3星祝福',
cht='購買1個一至三星祝福', cht='購買1個一至三星祝福',
en='Purchase a 1-3 star Blessing', en='Purchase 1 Blessing of 1- to 3-star rarity',
jp='★13の祝福を1個購入する', jp='★13の祝福を1個購入する',
es='Compra 1 bendición de 1-3 estrellas.', es='Compra 1 bendición de 1-3 estrellas.',
) )
@ -2892,12 +2892,12 @@ Charge_head_on = RogueEventOption(
jp='正面から突入する!', jp='正面から突入する!',
es='¡A la carga de frente!', es='¡A la carga de frente!',
) )
It_is_an_all_or_nothing_move = RogueEventOption( It_is_a_daring_move_that_risks_it_all = RogueEventOption(
id=322, id=322,
name='It_is_an_all_or_nothing_move', name='It_is_a_daring_move_that_risks_it_all',
cn='这是一场孤注一掷的行动。', cn='这是一场孤注一掷的行动。',
cht='這是一場孤注一擲的行動。', cht='這是一場孤注一擲的行動。',
en='It is an all-or-nothing move.', en='It is a daring move that risks it all.',
jp='これは一か八かの作戦だ', jp='これは一か八かの作戦だ',
es='Es una acción desesperada.', es='Es una acción desesperada.',
) )
@ -3549,3 +3549,723 @@ Increase_experimental_samples = RogueEventOption(
jp='実験サンプルを増やす。', jp='実験サンプルを増やす。',
es='Aumentas las muestras experimentales.', es='Aumentas las muestras experimentales.',
) )
The_vending_machine_displays_a_discount = RogueEventOption(
id=395,
name='The_vending_machine_displays_a_discount',
cn='售货机亮出了折扣。',
cht='販賣機亮出了折扣。',
en='The vending machine displays a discount.',
jp='自動販売機が割引と表示した',
es='La máquina expendedora muestra un descuento.',
)
It_too_expensive = RogueEventOption(
id=396,
name='It_too_expensive',
cn='太贵了。',
cht='太貴了。',
en="It's too expensive.",
jp='高すぎる',
es='Es muy caro.',
)
The_vending_machine_displays_the_price = RogueEventOption(
id=397,
name='The_vending_machine_displays_the_price',
cn='售货机亮出了售价。',
cht='販賣機亮出了售價。',
en='The vending machine displays the price.',
jp='自動販売機が販売価格を表示した',
es='La máquina expendedora muestra el precio.',
)
I_want_freebies = RogueEventOption(
id=398,
name='I_want_freebies',
cn='我要免费的!',
cht='我要免費的!',
en='I want freebies!',
jp='無料がいい!',
es='¡Quiero cosas gratis!',
)
You_better_reconsider = RogueEventOption(
id=399,
name='You_better_reconsider',
cn='你最好再想想。',
cht='你最好再想想。',
en='You better reconsider.',
jp='考え直したほうがいい',
es='Será mejor que lo reconsideres.',
)
Is_this_enough = RogueEventOption(
id=400,
name='Is_this_enough',
cn='这个够了吗?',
cht='這個夠了嗎?',
en='Is this enough?',
jp='これでいい?',
es='¿Acaso es suficiente?',
)
Do_me_a_favor = RogueEventOption(
id=401,
name='Do_me_a_favor',
cn='给我个面子。',
cht='給我一個面子。',
en='Do me a favor.',
jp='顔を立ててほしい',
es='Hazme un favor.',
)
The_vending_machine_spits_out_the_product = RogueEventOption(
id=402,
name='The_vending_machine_spits_out_the_product',
cn='售货机吐出了商品。',
cht='販賣機吐出了商品。',
en='The vending machine spits out the product.',
jp='自動販売機が商品を吐き出した',
es='La máquina expendedora escupe el producto.',
)
Show_it_how_strong_you_are = RogueEventOption(
id=403,
name='Show_it_how_strong_you_are',
cn='让它看看你有多强。',
cht='讓它看看你有多強。',
en='Show it how strong you are.',
jp='強さを見せつける',
es='Demuéstrale lo fuerte que eres.',
)
Can_t_beat_it_Time_to_run = RogueEventOption(
id=404,
name='Can_t_beat_it_Time_to_run',
cn='打不过,溜了溜了。',
cht='打不過,溜了溜了。',
en="Can't beat it. Time to run!",
jp='勝てないから逃げる',
es='Si no puedes con él, sal pitando.',
)
Listen_to_him_speak = RogueEventOption(
id=405,
name='Listen_to_him_speak',
cn='听他说下去。',
cht='聽他說下去。',
en='Listen to him speak.',
jp='彼の話を聞き続ける',
es='Escucha lo que dice.',
)
Leave_after_tasting = RogueEventOption(
id=406,
name='Leave_after_tasting',
cn='试吃后离开。',
cht='試吃後離開。',
en='Leave after tasting.',
jp='試食して立ち去る',
es='Vete después de probarlo.',
)
Is_there_anything_else = RogueEventOption(
id=407,
name='Is_there_anything_else',
cn='还有别的吗?',
cht='還有別的嗎?',
en='Is there anything else?',
jp='まだ他に何かある?',
es='¿Hay algo más?',
)
Take_away_the_sample_testers = RogueEventOption(
id=408,
name='Take_away_the_sample_testers',
cn='带走试吃品。',
cht='帶走試吃品。',
en='Take away the sample testers.',
jp='試食品を持ち帰る',
es='Llévate las muestras.',
)
I_wanna_buy_em_all = RogueEventOption(
id=409,
name='I_wanna_buy_em_all',
cn='我全买了!',
cht='我全買了!',
en="I wanna buy em' all!",
jp='全部もらう!',
es='¡Quiero comprarlos todos!',
)
Stop_his_imperial_worshiping_behavior = RogueEventOption(
id=410,
name='Stop_his_imperial_worshiping_behavior',
cn='制止他的帝国崇拜行为。',
cht='制止他的帝國崇拜行為。',
en='Stop his imperial worshiping behavior.',
jp='帝国を崇拝する彼の行為を止める',
es='Detén su comportamiento de adoración imperialista.',
)
Find_a_excuse_and_leave_this_place = RogueEventOption(
id=411,
name='Find_a_excuse_and_leave_this_place',
cn='找借口离开这里。',
cht='找藉口離開這裡。',
en='Find a excuse and leave this place.',
jp='言い訳を見つけてここを離れる',
es='Encuentra una excusa y deja este lugar.',
)
Pale_gold = RogueEventOption(
id=412,
name='Pale_gold',
cn='淡金色。',
cht='淡金色。',
en='Pale gold.',
jp='淡い金色',
es='Oro pálido.',
)
Blood_red = RogueEventOption(
id=413,
name='Blood_red',
cn='血红色。',
cht='血紅色。',
en='Blood red.',
jp='血のような赤色',
es='Rojo sangre.',
)
Dark_gray = RogueEventOption(
id=414,
name='Dark_gray',
cn='深灰色。',
cht='深灰色。',
en='Dark gray.',
jp='濃い灰色',
es='Gris oscuro.',
)
Remove_the_creation = RogueEventOption(
id=415,
name='Remove_the_creation',
cn='取出造物。',
cht='取出造物。',
en='Remove the creation.',
jp='造物を取り出す',
es='Retira la creación.',
)
Security_Verification_Failed_Leave_for_now = RogueEventOption(
id=416,
name='Security_Verification_Failed_Leave_for_now',
cn='密保验证失败,先离开吧。',
cht='驗證失敗,先離開吧。',
en='Security Verification Failed. Leave for now.',
jp='セキュリティ認証失敗、一旦離れよう',
es='Verificación de seguridad fallida. Vete por ahora.',
)
Device_IX_unit_compound = RogueEventOption(
id=417,
name='Device_IX_unit_compound',
cn='第Ⅸ机关单位大院。',
cht='第Ⅸ機關單位大院。',
en='Device IX unit compound.',
jp='第IX機関の敷地内',
es='Recinto de la unidad Dispositivo IX.',
)
Herta_Space_Station = RogueEventOption(
id=418,
name='Herta_Space_Station',
cn='黑塔空间站。',
cht='黑塔太空站。',
en='Herta Space Station.',
jp='宇宙ステーション「ヘルタ」',
es='Estación Espacial Herta.',
)
Superalloy_concrete = RogueEventOption(
id=419,
name='Superalloy_concrete',
cn='超合金混凝土。',
cht='超合金混凝土。',
en='Superalloy concrete.',
jp='超合金コンクリート',
es='Cemento superaleado.',
)
Homo_sapiens = RogueEventOption(
id=420,
name='Homo_sapiens',
cn='智人。',
cht='智人。',
en='Homo sapiens.',
jp='ホモ・サピエンス',
es='Homo sapiens.',
)
Insect_eating_fungi = RogueEventOption(
id=421,
name='Insect_eating_fungi',
cn='食虫菌毯。',
cht='食蟲菌毯。',
en='Insect-eating fungi.',
jp='食虫微生物マット',
es='Hongos que se alimentan de insectos.',
)
Retrieve_the_bank_card = RogueEventOption(
id=422,
name='Retrieve_the_bank_card',
cn='取走银行卡。',
cht='拿走銀行卡。',
en='Retrieve the bank card.',
jp='キャッシュカードを取る',
es='Recupera la tarjeta de banco.',
)
Withdraw_investment = RogueEventOption(
id=423,
name='Withdraw_investment',
cn='提取本金。',
cht='提取本金。',
en='Withdraw investment.',
jp='元金を引き出す',
es='Retira el efectivo.',
)
Withdraw_interest = RogueEventOption(
id=424,
name='Withdraw_interest',
cn='提取利息。',
cht='提取利息。',
en='Withdraw interest.',
jp='利息を引き出す',
es='Retira los intereses.',
)
Withdraw_knowledge = RogueEventOption(
id=425,
name='Withdraw_knowledge',
cn='提取知识。',
cht='提取知識。',
en='Withdraw knowledge.',
jp='知識を引き出す',
es='Retira el conocimiento.',
)
Withdraw_memories = RogueEventOption(
id=426,
name='Withdraw_memories',
cn='提取记忆。',
cht='提取記憶。',
en='Withdraw memories.',
jp='記憶を引き出す',
es='Retira los recuerdos.',
)
The_extremity_of_a_tomato = RogueEventOption(
id=427,
name='The_extremity_of_a_tomato',
cn='西红柿的末端。',
cht='蕃茄的末端。',
en='The extremity of a tomato.',
jp='トマトのヘタの部分',
es='La extremidad de un tomate.',
)
Press_it = RogueEventOption(
id=428,
name='Press_it',
cn='按下它。',
cht='按下它。',
en='Press it.',
jp='それを押す',
es='Presiona.',
)
Remove_your_hand = RogueEventOption(
id=429,
name='Remove_your_hand',
cn='把手拿开。',
cht='把手拿開。',
en='Remove your hand.',
jp='手を離す',
es='Quita la mano.',
)
You_re_teaching_me_how_to_do_my_job = RogueEventOption(
id=430,
name='You_re_teaching_me_how_to_do_my_job',
cn='你在教我做事?',
cht='你在教我做事?',
en="You're teaching me how to do my job?",
jp='に指図するの?',
es='¿Me estás diciendo cómo hacer mi trabajo?',
)
Be_receptive_to_feedback = RogueEventOption(
id=431,
name='Be_receptive_to_feedback',
cn='要善于听取意见。',
cht='要善於聽取意見。',
en='Be receptive to feedback.',
jp='意見をよく聞くべきだ',
es='Mantente abiert a los comentarios.',
)
I_told_you_to_stop_pressing_the_button = RogueEventOption(
id=432,
name='I_told_you_to_stop_pressing_the_button',
cn='都叫你别按按钮了。',
cht='都叫你別按按鈕了。',
en='I told you to stop pressing the button.',
jp='もうボタンを押すなと言っているのに',
es='Te dije que no presionaras el botón.',
)
Xianzhou_collab_set_meal = RogueEventOption(
id=433,
name='Xianzhou_collab_set_meal',
cn='仙舟联名套餐。',
cht='仙舟聯名套餐。',
en='Xianzhou collab set meal.',
jp='仙舟同盟コラボセット',
es='Menú de colaboración de Xianzhou.',
)
Terrorbird_fruit_stew = RogueEventOption(
id=434,
name='Terrorbird_fruit_stew',
cn='骇鸟水果乱炖。',
cht='駭鳥水果亂燉。',
en='Terrorbird-fruit stew.',
jp='フォルスラコスフルーツのごった煮',
es='Estofado de fruta terrorpájaro.',
)
The_big_data_will_provide_the_answers = RogueEventOption(
id=435,
name='The_big_data_will_provide_the_answers',
cn='大数据会给出答案。',
cht='大資料會給出答案。',
en='The big data will provide the answers.',
jp='ビッグデータが答えを出してくれる',
es='Los macrodatos darán las respuestas.',
)
Awesome_big_W = RogueEventOption(
id=436,
name='Awesome_big_W',
cn='真好,赚到。',
cht='真好,賺到。',
en='Awesome, big W.',
jp='よかった、得した',
es='Genial, una buena ganancia.',
)
Life_support_meal_combo = RogueEventOption(
id=437,
name='Life_support_meal_combo',
cn='生命维持套餐。',
cht='生命維持套餐。',
en='Life support meal combo.',
jp='生命維持セット',
es='Comida de soporte vital.',
)
Challenge_A_sentence_of_ten_words = RogueEventOption(
id=438,
name='Challenge_A_sentence_of_ten_words',
cn='挑战十个字的句子。',
cht='挑戰十個字的句子。',
en='Challenge: A sentence of ten words.',
jp='10文字の文章に挑戦する',
es='Desafío: una frase de diez palabras.',
)
Challenge_Two_short_sentences_of_five_words_each = RogueEventOption(
id=439,
name='Challenge_Two_short_sentences_of_five_words_each',
cn='挑战两个五字短语。',
cht='挑戰兩個五字短語。',
en='Challenge: Two short sentences of five words each.',
jp='5文字の短文2つに挑戦する',
es='Desafío: dos frases cortas de cinco palabras cada una.',
)
Disassemble_the_characters_it_carries = RogueEventOption(
id=440,
name='Disassemble_the_characters_it_carries',
cn='拆散它携带的字符。',
cht='拆散它攜帶的字元。',
en='Disassemble the characters it carries.',
jp='持っている文字をバラバラにする',
es='Desmonta las letras que lleva.',
)
Choose_Pineapple = RogueEventOption(
id=441,
name='Choose_Pineapple',
cn='选择菠萝。',
cht='選擇鳳梨。',
en='Choose Pineapple.',
jp='パイナップルを選ぶ',
es='Elige la piña.',
)
Choose_Bread = RogueEventOption(
id=442,
name='Choose_Bread',
cn='选择面包。',
cht='選擇麵包。',
en='Choose Bread.',
jp='パンを選ぶ',
es='Elige el pan.',
)
Take_a_drink_and_calm_down = RogueEventOption(
id=443,
name='Take_a_drink_and_calm_down',
cn='喝瓶水冷静冷静。',
cht='喝瓶水冷靜一下。',
en='Take a drink and calm down.',
jp='水を飲んで落ち着こう',
es='Tómate una bebida y cálmate.',
)
I_will_not_turn_my_back_on_humanity = RogueEventOption(
id=444,
name='I_will_not_turn_my_back_on_humanity',
cn='我绝不会背叛人类。',
cht='我絕不會背叛人類。',
en='I will not turn my back on humanity.',
jp='絶対に人を裏切ったりしない',
es='Nunca traicionaré a la humanidad.',
)
I_am_the_king_of_trashcans = RogueEventOption(
id=445,
name='I_am_the_king_of_trashcans',
cn='我才是垃圾桶之王!',
cht='我才是垃圾桶之王!',
en='I am the king of trashcans!',
jp='ゴミ箱の王はこのだ!',
es='¡Soy el rey de los cubos de basura!',
)
Reforge_weapon = RogueEventOption(
id=446,
name='Reforge_weapon',
cn='重铸武器。',
cht='重鑄武器。',
en='Reforge weapon.',
jp='武器を鋳造し直す',
es='Vuelve a forjar un arma.',
)
Smelt_weapon = RogueEventOption(
id=447,
name='Smelt_weapon',
cn='熔炼武器。',
cht='熔鍊武器。',
en='Smelt weapon.',
jp='武器を溶解し、製錬する',
es='Funde un arma.',
)
Precision_forge_weapon = RogueEventOption(
id=448,
name='Precision_forge_weapon',
cn='精锻武器。',
cht='精鍛武器。',
en='Precision-forge weapon.',
jp='武器を精密鍛造する',
es='Refina un arma de calidad.',
)
There_something_hidden_in_its_fur = RogueEventOption(
id=449,
name='There_something_hidden_in_its_fur',
cn='有什么藏在毛茸茸里。',
cht='有什麼藏在茸毛裡?',
en="There's something hidden in its fur.",
jp='ふわふわに何かが隠れている',
es='Hay algo oculto en su pelaje.',
)
Reel_in_the_line = RogueEventOption(
id=450,
name='Reel_in_the_line',
cn='收线。',
cht='收線。',
en='Reel in the line.',
jp='引き上げる',
es='Recoge el sedal.',
)
Offer_blood = RogueEventOption(
id=451,
name='Offer_blood',
cn='献上鲜血。',
cht='獻上鮮血。',
en='Offer blood.',
jp='血を捧げる',
es='Ofrece sangre.',
)
Offer_money = RogueEventOption(
id=452,
name='Offer_money',
cn='献上金钱。',
cht='獻上金錢。',
en='Offer money.',
jp='信用ポイントを捧げる',
es='Ofrece dinero.',
)
Offer_the_past = RogueEventOption(
id=453,
name='Offer_the_past',
cn='献上过去。',
cht='獻上過去。',
en='Offer the past.',
jp='過去を捧げる',
es='Ofrece el pasado.',
)
Offer_the_future = RogueEventOption(
id=454,
name='Offer_the_future',
cn='献上未来。',
cht='獻上未來。',
en='Offer the future.',
jp='未来を捧げる',
es='Ofrece el futuro.',
)
I_want_to_get_rich = RogueEventOption(
id=455,
name='I_want_to_get_rich',
cn='我想获得财富。',
cht='我想獲得財富。',
en='I want to get rich.',
jp='富を手に入れたい',
es='Quiero ser millonari.',
)
I_want_to_receive_benedictions = RogueEventOption(
id=456,
name='I_want_to_receive_benedictions',
cn='我想获得恩赐。',
cht='我想獲得恩賜。',
en='I want to receive benedictions.',
jp='恩恵を受けたい',
es='Quiero recibir bendiciones.',
)
I_want_to_touch_upon_the_unknown = RogueEventOption(
id=457,
name='I_want_to_touch_upon_the_unknown',
cn='我想触及未知。',
cht='我想觸及未知。',
en='I want to touch upon the unknown.',
jp='未知に触れたい',
es='Quiero tocar lo desconocido.',
)
I_want_to_obtain_wisdom = RogueEventOption(
id=458,
name='I_want_to_obtain_wisdom',
cn='我想触及智慧。',
cht='我想觸及智慧。',
en='I want to obtain wisdom.',
jp='知恵に触れたい',
es='Quiero sabiduría.',
)
Give_up_on_fishing = RogueEventOption(
id=459,
name='Give_up_on_fishing',
cn='放弃垂钓。',
cht='放棄垂釣。',
en='Give up on fishing.',
jp='釣りを諦める',
es='Deja de pescar.',
)
A_primordial_bloodthirsty_beast = RogueEventOption(
id=460,
name='A_primordial_bloodthirsty_beast',
cn='远古的渴血巨兽。',
cht='遠古的渴血巨獸。',
en='A primordial, bloodthirsty beast.',
jp='血に飢えた古代の巨獣',
es='Una antigua bestia sedienta de sangre.',
)
A_cooking_Lordly_Trashcan = RogueEventOption(
id=461,
name='A_cooking_Lordly_Trashcan',
cn='下厨的王下一桶。',
cht='下廚的王下一桶。',
en='A cooking Lordly Trashcan.',
jp='料理をする王のゴミ箱',
es='Un Cubo de basura señorial cocinillas.',
)
A_game_of_Rock_Paper_Scissors_with_the_calculator = RogueEventOption(
id=462,
name='A_game_of_Rock_Paper_Scissors_with_the_calculator',
cn='计算机的猜拳游戏。',
cht='電腦的猜拳遊戲。',
en='A game of Rock, Paper, Scissors with the calculator.',
jp='コンピュータのじゃんけんゲーム',
es='Una ronda de piedra, papel o tijera de la calculadora.',
)
Last_night_dream = RogueEventOption(
id=463,
name='Last_night_dream',
cn='昨晚的梦。',
cht='昨晚的夢。',
en="Last night's dream.",
jp='昨日の夢',
es='El sueño de anoche.',
)
Pom_Pom_tail = RogueEventOption(
id=464,
name='Pom_Pom_tail',
cn='帕姆的尾巴。',
cht='帕姆的尾巴。',
en="Pom-Pom's tail.",
jp='パムの尻尾',
es='La cola de Pom-Pom.',
)
Himeko_coffee = RogueEventOption(
id=465,
name='Himeko_coffee',
cn='姬子的咖啡。',
cht='姬子的咖啡。',
en="Himeko's coffee.",
jp='姫子のコーヒー',
es='El café de Himeko.',
)
Bounty_Hunter_of_the_Snow_Plains = RogueEventOption(
id=466,
name='Bounty_Hunter_of_the_Snow_Plains',
cn='雪原的赏金猎人。',
cht='雪原的賞金獵人。',
en='Bounty Hunter of the Snow Plains.',
jp='雪原の賞金稼ぎ',
es='Cazarrecompensas de las llanuras nevadas.',
)
An_Aha_Stuffed_Toy_asking_to_be_hit = RogueEventOption(
id=467,
name='An_Aha_Stuffed_Toy_asking_to_be_hit',
cn='欠揍的阿哈玩偶。',
cht='欠揍的阿哈玩偶。',
en='An Aha Stuffed Toy asking to be hit.',
jp='ムカつくアッハ人形',
es='Un muñeco de Aha que quiere que lo golpeen.',
)
The_library_History_Fictionologist = RogueEventOption(
id=468,
name='The_library_History_Fictionologist',
cn='图书馆的虚构史学家。',
cht='圖書館的虛構史學家。',
en="The library's History Fictionologist.",
jp='図書館にいる虚構歴史学者',
es='Los Historiadores Espurios de la biblioteca.',
)
Describe_a_colorful_journey = RogueEventOption(
id=469,
name='Describe_a_colorful_journey',
cn='讲述多彩的旅途。',
cht='講述多彩的旅途。',
en='Describe a colorful journey.',
jp='多彩な旅の話をする',
es='Describe un viaje extravagante.',
)
Describe_a_wondrous_adventure = RogueEventOption(
id=470,
name='Describe_a_wondrous_adventure',
cn='讲述惊奇的冒险。',
cht='講述驚奇的冒險。',
en='Describe a wondrous adventure.',
jp='不思議な冒険の話をする',
es='Describe una aventura maravillosa.',
)
Describe_a_simple_life = RogueEventOption(
id=471,
name='Describe_a_simple_life',
cn='讲述朴实的生活。',
cht='講述樸實的生活。',
en='Describe a simple life.',
jp='素朴な生活の話をする',
es='Describe una vida simple.',
)
Recount_your_empty_past = RogueEventOption(
id=472,
name='Recount_your_empty_past',
cn='讲述空白的过往。',
cht='講述空白的過往。',
en='Recount your empty past.',
jp='空っぽな過去を語る',
es='Describe tu vacío pasado.',
)
Chasing_excitement = RogueEventOption(
id=473,
name='Chasing_excitement',
cn='玩的就是一个刺激。',
cht='越刺激就會越好玩。',
en='Chasing excitement.',
jp='エキサイティングであればあるほどいい',
es='Divertirse es emocionante.',
)
Consider_it_as_helping_out_the_Guild_business = RogueEventOption(
id=474,
name='Consider_it_as_helping_out_the_Guild_business',
cn='就当照顾学会的生意。',
cht='就當關照學會的生意。',
en="Consider it as helping out the Guild's business.",
jp='学会のビジネスを贔屓するってことで',
es='Considéralo como un apoyo a los negocios de la Sociedad.',
)

View File

@ -1383,3 +1383,173 @@ Ruan_Mei_III = RogueEventTitle(
es='Ruan Mei III', es='Ruan Mei III',
option_ids=[392, 393, 394], option_ids=[392, 393, 394],
) )
Special_Discount = RogueEventTitle(
id=139,
name='Special_Discount',
cn='特别优惠',
cht='特別優惠',
en='Special Discount',
jp='特別割引',
es='Descuento especial',
option_ids=[395, 396, 397, 398, 399, 400, 401, 402, 403, 404],
)
Metal_Life = RogueEventTitle(
id=140,
name='Metal_Life',
cn='金属生活',
cht='金屬生活',
en='Metal Life',
jp='金属生活',
es='Vida metálica',
option_ids=[405, 406, 407, 408, 409, 410, 411],
)
A_Dash_of_Color = RogueEventTitle(
id=141,
name='A_Dash_of_Color',
cn='一抹色彩',
cht='一抹色彩',
en='A Dash of Color',
jp='一抹の色彩',
es='Una pizca de color',
option_ids=[412, 413, 414],
)
Creation_Unit = RogueEventTitle(
id=142,
name='Creation_Unit',
cn='造物单元',
cht='造物單元',
en='Creation Unit',
jp='造物ユニット',
es='Unidad de creación',
option_ids=[415],
)
Time_Bank_I = RogueEventTitle(
id=143,
name='Time_Bank_I',
cn='时间银行(其一)',
cht='時間銀行(其一)',
en='Time Bank (I)',
jp='タイムバンクその1',
es='Banco del tiempo (I)',
option_ids=[416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427],
)
Time_Bank_II = RogueEventTitle(
id=144,
name='Time_Bank_II',
cn='时间银行(其二)',
cht='時間銀行(其二)',
en='Time Bank (II)',
jp='タイムバンクその2',
es='Banco del tiempo (II)',
option_ids=[426, 427],
)
Red_Temptation = RogueEventTitle(
id=145,
name='Red_Temptation',
cn='红色诱惑',
cht='紅色誘惑',
en='Red Temptation',
jp='赤い誘惑',
es='Tentación roja',
option_ids=[428, 429, 430, 431, 432],
)
Selection_Difficulties_I = RogueEventTitle(
id=146,
name='Selection_Difficulties_I',
cn='选择困难(其一)',
cht='選擇困難(其一)',
en='Selection Difficulties (I)',
jp='選択困難その1',
es='Dificultad de elección (I)',
option_ids=[433, 434, 435, 436, 437],
)
Selection_Difficulties_II = RogueEventTitle(
id=147,
name='Selection_Difficulties_II',
cn='选择困难(其二)',
cht='選擇困難(其二)',
en='Selection Difficulties (II)',
jp='選択困難その2',
es='Dificultad de elección (II)',
option_ids=[434, 435, 436, 437],
)
Semantic_Mismatch = RogueEventTitle(
id=148,
name='Semantic_Mismatch',
cn='语义不符',
cht='語義不符',
en='Semantic Mismatch',
jp='本義の不一致',
es='Inconsistencia semántica',
option_ids=[438, 439, 440],
)
Pineapple_Bread = RogueEventTitle(
id=149,
name='Pineapple_Bread',
cn='菠萝面包',
cht='鳳梨麵包',
en='Pineapple Bread',
jp='パイナップルパン',
es='Pan de piña',
option_ids=[441, 442, 443],
)
Trash_Symphony = RogueEventTitle(
id=150,
name='Trash_Symphony',
cn='垃圾交响曲',
cht='垃圾交響曲',
en='Trash Symphony',
jp='トラッシュシンフォニー',
es='Sinfonía de la basura',
option_ids=[444, 445],
)
Lava = RogueEventTitle(
id=151,
name='Lava',
cn='熔岩',
cht='熔岩',
en='Lava',
jp='溶岩',
es='Lava',
option_ids=[446, 447, 448],
)
Apes_Such_As_You = RogueEventTitle(
id=152,
name='Apes_Such_As_You',
cn='像你这样的苍猿',
cht='像你這樣的蒼猿',
en='Apes Such As You',
jp='あなたのような蒼猿は',
es='Simios como tú',
option_ids=[449],
)
Fishing_Ceremony = RogueEventTitle(
id=153,
name='Fishing_Ceremony',
cn='垂钓仪式',
cht='垂釣儀式',
en='Fishing Ceremony',
jp='釣りの儀式',
es='Ceremonia de pesca',
option_ids=[450, 451, 452, 453, 454, 455, 456, 457, 458, 459],
)
Flea_Market = RogueEventTitle(
id=154,
name='Flea_Market',
cn='跳蚤市场',
cht='跳蚤市場',
en='Flea Market',
jp='蚤の市',
es='Mercadillo',
option_ids=[460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472],
)
Collab_Product = RogueEventTitle(
id=155,
name='Collab_Product',
cn='联名产品',
cht='聯名產品',
en='Collab Product',
jp='コラボ商品',
es='Producto de colaboración',
option_ids=[5, 473, 474],
)