Merge pull request #598 from LmeSzinc/dev

Bug fix
This commit is contained in:
LmeSzinc 2024-07-31 19:28:04 +08:00 committed by GitHub
commit 0068a2a860
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
35 changed files with 359 additions and 222 deletions

BIN
assets/character/Jade.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

BIN
assets/character/Yunli.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -124,6 +124,10 @@ class KeywordExtract:
""" """
quest_data = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'QuestData.json')) quest_data = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'QuestData.json'))
quest_data = {
str(deep_get(data, 'QuestID')): data
for data in quest_data
}
quests_hash = [quest_data[str(quest_id)]["QuestTitle"]["Hash"] for quest_id in quests] quests_hash = [quest_data[str(quest_id)]["QuestTitle"]["Hash"] for quest_id in quests]
quest_keywords = list(dict.fromkeys([self.text_map[lang].find(quest_hash)[1] for quest_hash in quests_hash])) quest_keywords = list(dict.fromkeys([self.text_map[lang].find(quest_hash)[1] for quest_hash in quests_hash]))
self.load_keywords(quest_keywords, lang) self.load_keywords(quest_keywords, lang)
@ -140,12 +144,15 @@ class KeywordExtract:
old_quest = [ old_quest = [
"Go_on_assignment_1_time", # -> Dispatch_1_assignments "Go_on_assignment_1_time", # -> Dispatch_1_assignments
"Complete_Simulated_Universe_1_times", # same "Complete_Simulated_Universe_1_times", # same
"Complete_1_stage_in_Simulated_Universe_Any_world", # -> Complete_Divergent_Universe_or_Simulated_Universe_1_times "Complete_1_stage_in_Simulated_Universe_Any_world",
# -> Complete_Divergent_Universe_or_Simulated_Universe_1_times
"Complete_Calyx_Crimson_1_time", # -> Clear_Calyx_Crimson_1_times "Complete_Calyx_Crimson_1_time", # -> Clear_Calyx_Crimson_1_times
"Enter_combat_by_attacking_enemy_Weakness_and_win_3_times", # -> Enter_combat_by_attacking_enemie_Weakness_and_win_1_times "Enter_combat_by_attacking_enemy_Weakness_and_win_3_times",
# -> Enter_combat_by_attacking_enemie_Weakness_and_win_1_times
"Use_Technique_2_times", # -> Use_Technique_1_times "Use_Technique_2_times", # -> Use_Technique_1_times
"Destroy_3_destructible_objects", # -> Destroy_1_destructible_objects "Destroy_3_destructible_objects", # -> Destroy_1_destructible_objects
"Obtain_victory_in_combat_with_Support_Characters_1_time", # -> Obtain_victory_in_combat_with_Support_Characters_1_times "Obtain_victory_in_combat_with_Support_Characters_1_time",
# -> Obtain_victory_in_combat_with_Support_Characters_1_times
"Level_up_any_character_1_time", # -> Level_up_any_character_1_times "Level_up_any_character_1_time", # -> Level_up_any_character_1_times
"Level_up_any_Light_Cone_1_time", # -> Level_up_any_Light_Cone_1_times "Level_up_any_Light_Cone_1_time", # -> Level_up_any_Light_Cone_1_times
"Synthesize_Consumable_1_time", # -> Use_the_Omni_Synthesizer_1_times "Synthesize_Consumable_1_time", # -> Use_the_Omni_Synthesizer_1_times
@ -170,7 +177,8 @@ class KeywordExtract:
"Consume_1_Trailblaze_Power": 120 "Consume_1_Trailblaze_Power": 120
} }
def replace_templates_quest(text: str, correct_time = 1) -> str:
def replace_templates_quest(text: str, correct_time=1) -> str:
text = replace_templates(text) text = replace_templates(text)
text = text.replace('1', f'{correct_time}') text = text.replace('1', f'{correct_time}')
return text return text
@ -187,7 +195,8 @@ class KeywordExtract:
gen.ObjectAttr(key='id', value=index + last_id + 1) gen.ObjectAttr(key='id', value=index + last_id + 1)
gen.ObjectAttr(key='name', value=name) gen.ObjectAttr(key='name', value=name)
for lang in UI_LANGUAGES: for lang in UI_LANGUAGES:
gen.ObjectAttr(key=lang, value=replace_templates_quest(self.find_keyword(keyword, lang=lang)[1], correct_times.setdefault(old_name, 1))) gen.ObjectAttr(key=lang, value=replace_templates_quest(self.find_keyword(keyword, lang=lang)[1],
correct_times.setdefault(old_name, 1)))
gen.last_id = index + last_id + 1 gen.last_id = index + last_id + 1
output_file = './tasks/daily/keywords/daily_quest.py' output_file = './tasks/daily/keywords/daily_quest.py'
@ -198,14 +207,14 @@ class KeywordExtract:
def generate_daily_quests(self): def generate_daily_quests(self):
daily_quest = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'DailyQuest.json')) daily_quest = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'DailyQuest.json'))
self.load_quests(daily_quest.keys()) self.load_quests([str(deep_get(data, 'DailyID')) for data in daily_quest])
self.write_daily_quest_keywords() self.write_daily_quest_keywords()
def load_character_name_keywords(self, lang='en'): def load_character_name_keywords(self, lang='en'):
file_name = 'ItemConfigAvatarPlayerIcon.json' file_name = 'ItemConfigAvatarPlayerIcon.json'
path = os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', file_name) path = os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', file_name)
character_data = read_file(path) character_data = read_file(path)
characters_hash = [character_data[key]["ItemName"]["Hash"] for key in character_data] characters_hash = [data["ItemName"]["Hash"] for data in character_data]
text_map = self.text_map[lang] text_map = self.text_map[lang]
keywords_id = sorted( keywords_id = sorted(
@ -216,36 +225,45 @@ class KeywordExtract:
def generate_shadow_with_characters(self): def generate_shadow_with_characters(self):
# Damage type -> damage hash # Damage type -> damage hash
damage_info = dict() damage_info = dict()
for type_name, data in read_file(os.path.join( for data in read_file(os.path.join(
TextMap.DATA_FOLDER, 'ExcelOutput', TextMap.DATA_FOLDER, 'ExcelOutput',
'DamageType.json' 'DamageType.json'
)).items(): )):
type_name = deep_get(data, 'ID', 0)
damage_info[type_name] = deep_get(data, 'DamageTypeName.Hash') damage_info[type_name] = deep_get(data, 'DamageTypeName.Hash')
# Character id -> character hash & damage type # Character id -> character hash & damage type
character_info = dict() character_info = dict()
for data in read_file(os.path.join( for data in read_file(os.path.join(
TextMap.DATA_FOLDER, 'ExcelOutput', TextMap.DATA_FOLDER, 'ExcelOutput',
'AvatarConfig.json' 'AvatarConfig.json'
)).values(): )):
name_hash = deep_get(data, 'AvatarName.Hash') name_hash = deep_get(data, 'AvatarName.Hash')
damage_type = deep_get(data, 'DamageType') damage_type = deep_get(data, 'DamageType')
character_info[data['AvatarID']] = ( character_info[data['AvatarID']] = (
name_hash, damage_info[damage_type]) name_hash, damage_info[damage_type])
# Item id -> character id # Item id -> character id
promotion_info = defaultdict(list) promotion_info = defaultdict(list)
for data in read_file(os.path.join(
def merge_same(data: list[dict], keyword) -> list:
mp = defaultdict(dict)
for d in data:
length = len(mp[d[keyword]])
mp[d[keyword]][str(length)] = d
return mp.values()
for data in merge_same(read_file(os.path.join(
TextMap.DATA_FOLDER, 'ExcelOutput', TextMap.DATA_FOLDER, 'ExcelOutput',
'AvatarPromotionConfig.json' 'AvatarPromotionConfig.json'
)).values(): )), keyword='AvatarID'):
character_id = deep_get(data, '0.AvatarID') character_id = deep_get(data, '0.AvatarID')
item_id = deep_get(data, '2.PromotionCostList')[-1]['ItemID'] item_id = deep_get(data, '2.PromotionCostList')[-1]['ItemID']
promotion_info[item_id].append(character_info[character_id]) promotion_info[item_id].append(character_info[character_id])
# Shadow hash -> item id # Shadow hash -> item id
shadow_info = dict() shadow_info = dict()
for data in read_file(os.path.join( for data in merge_same(read_file(os.path.join(
TextMap.DATA_FOLDER, 'ExcelOutput', TextMap.DATA_FOLDER, 'ExcelOutput',
'MappingInfo.json' 'MappingInfo.json'
)).values(): )), keyword='ID'):
farm_type = deep_get(data, '0.FarmType') farm_type = deep_get(data, '0.FarmType')
if farm_type != 'ELEMENT': if farm_type != 'ELEMENT':
continue continue
@ -273,10 +291,12 @@ class KeywordExtract:
gen.ObjectAttr(key='id', value=index + 1) gen.ObjectAttr(key='id', value=index + 1)
gen.ObjectAttr(key='name', value=name) gen.ObjectAttr(key='name', value=name)
for lang in UI_LANGUAGES: for lang in UI_LANGUAGES:
character_names = ' / '.join([ character_names = [
replace_templates(self.find_keyword(c[0], lang)[1]) replace_templates(self.find_keyword(c[0], lang)[1])
for c in characters for c in characters
]) ]
character_names = list(dict.fromkeys(character_names))
character_names = ' / '.join(character_names)
damage_type = self.find_keyword(characters[0][1], lang)[1] damage_type = self.find_keyword(characters[0][1], lang)[1]
if lang in {'en', 'es'}: if lang in {'en', 'es'}:
value = f'{prefix_dict[lang]}{damage_type} ({character_names})' value = f'{prefix_dict[lang]}{damage_type} ({character_names})'
@ -351,7 +371,7 @@ class KeywordExtract:
def generate_battle_pass_quests(self): def generate_battle_pass_quests(self):
battle_pass_quests = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'BattlePassConfig.json')) battle_pass_quests = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'BattlePassConfig.json'))
latest_quests = list(battle_pass_quests.values())[-1] latest_quests = list(battle_pass_quests)[-1]
week_quest_list = deep_get(latest_quests, "WeekQuestList") week_quest_list = deep_get(latest_quests, "WeekQuestList")
week_order1 = deep_get(latest_quests, "WeekOrder1") week_order1 = deep_get(latest_quests, "WeekOrder1")
week_chain_quest_list = deep_get(latest_quests, "WeekChainQuestList") week_chain_quest_list = deep_get(latest_quests, "WeekChainQuestList")
@ -362,30 +382,38 @@ class KeywordExtract:
def generate_rogue_buff(self): def generate_rogue_buff(self):
# paths # paths
aeons = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'RogueAeonDisplay.json')) aeons = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'RogueAeonDisplay.json'))
aeons_hash = [deep_get(aeon, 'RogueAeonPathName2.Hash') for aeon in aeons.values()] aeons_hash = [deep_get(aeon, 'RogueAeonPathName2.Hash') for aeon in aeons]
self.keywords_id = aeons_hash self.keywords_id = aeons_hash
self.write_keywords(keyword_class='RoguePath', output_file='./tasks/rogue/keywords/path.py') self.write_keywords(keyword_class='RoguePath', output_file='./tasks/rogue/keywords/path.py')
# blessings # blessings
blessings_info = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'RogueBuff.json')) blessings_info = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'RogueBuff.json'))
blessings_name_map = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'RogueMazeBuff.json')) blessings_name_map = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'RogueMazeBuff.json'))
blessings_id = [deep_get(blessing, '1.MazeBuffID') for blessing in blessings_info.values() blessings_name_map = {
if not deep_get(blessing, '1.AeonID')][1:] deep_get(data, 'ID'): data
resonances_id = [deep_get(blessing, '1.MazeBuffID') for blessing in blessings_info.values() for data in blessings_name_map
if deep_get(blessing, '1.AeonID')] }
blessings_id = [deep_get(blessing, 'MazeBuffID') for blessing in blessings_info
if not deep_get(blessing, 'AeonID')][1:]
resonances_id = [deep_get(blessing, 'MazeBuffID') for blessing in blessings_info
if deep_get(blessing, 'AeonID')]
blessings_info = {
str(deep_get(data, 'MazeBuffID')): data
for data in blessings_info if deep_get(data, 'MazeBuffLevel') == 1
}
# ignore endless buffs # ignore endless buffs
endless_buffs = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'RogueEndlessMegaBuffDesc.json')) endless_buffs = read_file(os.path.join(TextMap.DATA_FOLDER, 'ExcelOutput', 'RogueEndlessMegaBuffDesc.json'))
endless_buff_ids = [int(id_) for id_ in endless_buffs] endless_buff_ids = [int(deep_get(data, 'MazeBuffID')) for data in endless_buffs]
blessings_id = [id_ for id_ in blessings_id if id_ not in endless_buff_ids] blessings_id = [id_ for id_ in blessings_id if id_ not in endless_buff_ids]
def get_blessing_infos(id_list, with_enhancement: bool): def get_blessing_infos(id_list, with_enhancement: bool):
blessings_hash = [deep_get(blessings_name_map, f"{blessing_id}.1.BuffName.Hash") blessings_hash = [deep_get(blessings_name_map, f"{blessing_id}.BuffName.Hash")
for blessing_id in id_list] for blessing_id in id_list]
blessings_path_id = {blessing_hash: int(deep_get(blessings_info, f'{blessing_id}.1.RogueBuffType')) - 119 blessings_path_id = {blessing_hash: int(deep_get(blessings_info, f'{blessing_id}.RogueBuffType')) - 119
# 119 is the magic number make type match with path in keyword above # 119 is the magic number make type match with path in keyword above
for blessing_hash, blessing_id in zip(blessings_hash, id_list)} for blessing_hash, blessing_id in zip(blessings_hash, id_list)}
blessings_category = {blessing_hash: deep_get(blessings_info, f'{blessing_id}.1.RogueBuffCategory') blessings_category = {blessing_hash: deep_get(blessings_info, f'{blessing_id}.RogueBuffCategory')
for blessing_hash, blessing_id in zip(blessings_hash, id_list)} for blessing_hash, blessing_id in zip(blessings_hash, id_list)}
category_map = { category_map = {
"Common": 1, "Common": 1,
@ -418,8 +446,8 @@ class KeywordExtract:
'RogueTalkNameConfig.json' 'RogueTalkNameConfig.json'
) )
event_title_ids = { event_title_ids = {
id_: deep_get(data, 'Name.Hash') str(deep_get(data, 'TalkNameID')): deep_get(data, 'Name.Hash')
for id_, data in read_file(event_title_file).items() for data in read_file(event_title_file)
} }
event_title_texts = defaultdict(list) event_title_texts = defaultdict(list)
for title_id, title_hash in event_title_ids.items(): for title_id, title_hash in event_title_ids.items():
@ -432,8 +460,8 @@ class KeywordExtract:
'RogueDialogueOptionDisplay.json' 'RogueDialogueOptionDisplay.json'
) )
option_ids = { option_ids = {
id_: deep_get(data, 'OptionTitle.Hash') str(deep_get(data, 'OptionDisplayID')): deep_get(data, 'OptionTitle.Hash')
for id_, data in read_file(option_file).items() for data in read_file(option_file)
} }
# Key: event name hash, value: list of option id/hash # Key: event name hash, value: list of option id/hash
options_grouped = dict() options_grouped = dict()
@ -503,7 +531,9 @@ class KeywordExtract:
if option_dup_count[option_var] > 1: if option_dup_count[option_var] > 1:
option_var = f'{option_var}_{option_md5[:md5_prefix_len]}' option_var = f'{option_var}_{option_md5[:md5_prefix_len]}'
return option_var return option_var
return wrapper return wrapper
option_gen = None option_gen = None
option_hash_to_keyword_id = dict() # option hash -> option keyword id option_hash_to_keyword_id = dict() # option hash -> option keyword id
for i, (option_md5, option_hash) in enumerate(option_md5s.items(), start=1): for i, (option_md5, option_hash) in enumerate(option_md5s.items(), start=1):
@ -543,9 +573,9 @@ class KeywordExtract:
logger.critical( logger.critical(
f'Importing preset strategies fails, probably due to changes in {output_file}') f'Importing preset strategies fails, probably due to changes in {output_file}')
def iter_without_duplication(self, file: dict, keys): def iter_without_duplication(self, file: list, keys):
visited = set() visited = set()
for data in file.values(): for data in file:
hash_ = deep_get(data, keys=keys) hash_ = deep_get(data, keys=keys)
_, name = self.find_keyword(hash_, lang='cn') _, name = self.find_keyword(hash_, lang='cn')
if name in visited: if name in visited:

View File

@ -30,25 +30,26 @@ def get_assignment_entry_data():
""" """
expedition_namehash_to_id = { expedition_namehash_to_id = {
deep_get(expedition, 'Name.Hash'): deep_get(expedition, 'ExpeditionID') deep_get(expedition, 'Name.Hash'): deep_get(expedition, 'ExpeditionID')
for expedition in GenerateKeyword.read_file('./ExcelOutput/ExpeditionData.json').values() for expedition in GenerateKeyword.read_file('./ExcelOutput/ExpeditionData.json')
} }
rev = {v: k for k, v in expedition_namehash_to_id.items()} rev = {v: k for k, v in expedition_namehash_to_id.items()}
rev = resort(rev) rev = resort(rev)
expedition_namehash_to_id = {v: k for k, v in rev.items()} expedition_namehash_to_id = {v: k for k, v in rev.items()}
expedition_id_to_reward_id = { expedition_id_to_reward_id = {
deep_get(expedition, '4.2.ExpeditionID'): deep_get(expedition, '4.2.RewardID') deep_get(expedition, 'ExpeditionID'): deep_get(expedition, 'RewardID')
for expedition in GenerateKeyword.read_file('./ExcelOutput/ExpeditionReward.json').values() for expedition in GenerateKeyword.read_file('./ExcelOutput/ExpeditionReward.json')
if deep_get(expedition, 'Duration') == 4 and deep_get(expedition, 'AvatarNum') == 2
} }
reward_id_to_item_ids = { reward_id_to_item_ids = {
deep_get(reward, 'RewardID'): [ deep_get(reward, 'RewardID'): [
v for k, v in reward.items() v for k, v in reward.items()
if k.startswith('ItemID') if k.startswith('ItemID')
] ]
for reward in GenerateKeyword.read_file('./ExcelOutput/RewardData.json').values() for reward in GenerateKeyword.read_file('./ExcelOutput/RewardData.json')
} }
item_id_to_namehash = { item_id_to_namehash = {
deep_get(item, 'ID'): deep_get(item, 'ItemName.Hash') deep_get(item, 'ID'): deep_get(item, 'ItemName.Hash')
for item in GenerateKeyword.read_file('./ExcelOutput/ItemConfig.json').values() for item in GenerateKeyword.read_file('./ExcelOutput/ItemConfig.json')
} }
item_name_remap = { item_name_remap = {
'旅情见闻': '角色经验材料', '旅情见闻': '角色经验材料',
@ -81,7 +82,7 @@ class GenerateAssignmentGroup(GenerateKeyword):
output_file = './tasks/assignment/keywords/group.py' output_file = './tasks/assignment/keywords/group.py'
def iter_keywords(self) -> Iterable[dict]: def iter_keywords(self) -> Iterable[dict]:
for group in self.read_file('./ExcelOutput/ExpeditionGroup.json').values(): for group in self.read_file('./ExcelOutput/ExpeditionGroup.json'):
yield dict(text_id=deep_get(group, 'Name.Hash')) yield dict(text_id=deep_get(group, 'Name.Hash'))
@ -133,7 +134,7 @@ class GenerateAssignmentEventEntry(GenerateKeyword):
output_file = './tasks/assignment/keywords/event_entry.py' output_file = './tasks/assignment/keywords/event_entry.py'
def iter_keywords(self) -> Iterable[dict]: def iter_keywords(self) -> Iterable[dict]:
for expedition in self.read_file('./ExcelOutput/ActivityExpedition.json').values(): for expedition in self.read_file('./ExcelOutput/ActivityExpedition.json'):
yield dict(text_id=deep_get(expedition, 'Name.Hash')) yield dict(text_id=deep_get(expedition, 'Name.Hash'))

View File

@ -92,13 +92,13 @@ class GenerateKeyword:
text_map['cn'] = TextMap('chs') text_map['cn'] = TextMap('chs')
@staticmethod @staticmethod
def read_file(file: str) -> dict: def read_file(file: str) -> list:
""" """
Args: Args:
file: ./ExcelOutput/GameplayGuideData.json file: ./ExcelOutput/GameplayGuideData.json
Returns: Returns:
dict: list
""" """
file = os.path.join(TextMap.DATA_FOLDER, file) file = os.path.join(TextMap.DATA_FOLDER, file)
return read_file(file) return read_file(file)

View File

@ -41,7 +41,7 @@ class GenerateDungeonList(GenerateKeyword):
def iter_dungeon(self): def iter_dungeon(self):
temp_save = "" temp_save = ""
for data in self.data.values(): for data in self.data:
dungeon_id = data.get('ID', 0) dungeon_id = data.get('ID', 0)
text_id = deep_get(data, keys='Name.Hash') text_id = deep_get(data, keys='Name.Hash')
plane_id = deep_get(data, 'MapEntranceID', 0) plane_id = deep_get(data, 'MapEntranceID', 0)

View File

@ -10,7 +10,7 @@ class GenerateItemBase(GenerateKeyword):
blacklist = [] blacklist = []
def iter_items(self) -> t.Iterable[dict]: def iter_items(self) -> t.Iterable[dict]:
for data in SHARE_DATA.ItemConfig.values(): for data in SHARE_DATA.ItemConfig:
item_id = data.get('ID', 0) item_id = data.get('ID', 0)
text_id = deep_get(data, keys='ItemName.Hash') text_id = deep_get(data, keys='ItemName.Hash')
subtype = data.get('ItemSubType', 0) subtype = data.get('ItemSubType', 0)
@ -50,12 +50,11 @@ class GenerateItemBase(GenerateKeyword):
data data
""" """
dic = {} dic = {}
for level_data in SHARE_DATA.MappingInfo.values(): for dungeon_data in SHARE_DATA.MappingInfo:
# Use the highest level # Use the highest level
# And must contain: # And must contain:
# "Type": "FARM_ENTRANCE", # "Type": "FARM_ENTRANCE",
# "FarmType": "COCOON", # "FarmType": "COCOON",
for dungeon_data in level_data.values():
if dungeon_data.get('Type') != 'FARM_ENTRANCE': if dungeon_data.get('Type') != 'FARM_ENTRANCE':
continue continue
# parse # parse

View File

@ -13,8 +13,8 @@ class GenerateMapPlane(GenerateKeyword):
return self.read_file('./ExcelOutput/AreaMapConfig.json') return self.read_file('./ExcelOutput/AreaMapConfig.json')
def iter_planes(self) -> t.Iterable[dict]: def iter_planes(self) -> t.Iterable[dict]:
for plane_id, data in self.data.items(): for data in self.data:
plane_id = int(plane_id) plane_id = int(deep_get(data, 'ID', 0))
world_id = int(str(plane_id)[-5]) world_id = int(str(plane_id)[-5])
sort_id = int(deep_get(data, 'MenuSortID', 0)) sort_id = int(deep_get(data, 'MenuSortID', 0))
text_id = deep_get(data, 'Name.Hash') text_id = deep_get(data, 'Name.Hash')

View File

@ -672,13 +672,15 @@
"Himeko", "Himeko",
"Hook", "Hook",
"Huohuo", "Huohuo",
"Jade",
"JingYuan", "JingYuan",
"Jingliu", "Jingliu",
"Kafka", "Kafka",
"Luka", "Luka",
"Luocha", "Luocha",
"Lynx", "Lynx",
"March7th", "March7thPreservation",
"March7thTheHunt",
"Misha", "Misha",
"Natasha", "Natasha",
"Pela", "Pela",
@ -699,7 +701,8 @@
"Welt", "Welt",
"Xueyi", "Xueyi",
"Yanqing", "Yanqing",
"Yukong" "Yukong",
"Yunli"
] ]
} }
}, },
@ -1238,13 +1241,15 @@
"Himeko", "Himeko",
"Hook", "Hook",
"Huohuo", "Huohuo",
"Jade",
"JingYuan", "JingYuan",
"Jingliu", "Jingliu",
"Kafka", "Kafka",
"Luka", "Luka",
"Luocha", "Luocha",
"Lynx", "Lynx",
"March7th", "March7thPreservation",
"March7thTheHunt",
"Misha", "Misha",
"Natasha", "Natasha",
"Pela", "Pela",
@ -1265,7 +1270,8 @@
"Welt", "Welt",
"Xueyi", "Xueyi",
"Yanqing", "Yanqing",
"Yukong" "Yukong",
"Yunli"
] ]
} }
} }
@ -1522,13 +1528,15 @@
"Himeko", "Himeko",
"Hook", "Hook",
"Huohuo", "Huohuo",
"Jade",
"JingYuan", "JingYuan",
"Jingliu", "Jingliu",
"Kafka", "Kafka",
"Luka", "Luka",
"Luocha", "Luocha",
"Lynx", "Lynx",
"March7th", "March7thPreservation",
"March7thTheHunt",
"Misha", "Misha",
"Natasha", "Natasha",
"Pela", "Pela",
@ -1549,7 +1557,8 @@
"Welt", "Welt",
"Xueyi", "Xueyi",
"Yanqing", "Yanqing",
"Yukong" "Yukong",
"Yunli"
] ]
} }
}, },

View File

@ -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, JingYuan, Jingliu, Kafka, Luka, Luocha, Lynx, March7th, Misha, Natasha, Pela, Qingque, Robin, RuanMei, Sampo, Seele, Serval, SilverWolf, Sparkle, Sushang, Tingyun, TopazNumby, TrailblazerDestruction, TrailblazerHarmony, TrailblazerPreservation, Welt, Xueyi, Yanqing, Yukong 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, 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
# Group `DungeonStorage` # Group `DungeonStorage`
DungeonStorage_TrailblazePower = {} DungeonStorage_TrailblazePower = {}

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 = ["Jade"] unsupported_characters = ["Jiaoqiu"]
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

@ -263,10 +263,10 @@
"Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Trace: Nihility (Alchemy Commission)", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Trace: Nihility (Alchemy Commission)",
"Stagnant_Shadow_Spike": "Ascension: Physical (Natasha / Clara / Luka / Sushang)", "Stagnant_Shadow_Spike": "Ascension: Physical (Natasha / Clara / Luka / Sushang)",
"Stagnant_Shadow_Perdition": "Ascension: Physical (Hanya / Argenti)", "Stagnant_Shadow_Perdition": "Ascension: Physical (Hanya / Argenti)",
"Stagnant_Shadow_Duty": "Ascension: Physical (Boothill / Robin)", "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)", "Stagnant_Shadow_Ire": "Ascension: Fire (Firefly / Gallagher / Jiaoqiu)",
"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)",
@ -403,13 +403,15 @@
"Himeko": "Himeko", "Himeko": "Himeko",
"Hook": "Hook", "Hook": "Hook",
"Huohuo": "Huohuo", "Huohuo": "Huohuo",
"Jade": "Jade",
"JingYuan": "Jing Yuan", "JingYuan": "Jing Yuan",
"Jingliu": "Jingliu", "Jingliu": "Jingliu",
"Kafka": "Kafka", "Kafka": "Kafka",
"Luka": "Luka", "Luka": "Luka",
"Luocha": "Luocha", "Luocha": "Luocha",
"Lynx": "Lynx", "Lynx": "Lynx",
"March7th": "March 7th", "March7thPreservation": "March 7th: Preservation",
"March7thTheHunt": "March 7th: The Hunt",
"Misha": "Misha", "Misha": "Misha",
"Natasha": "Natasha", "Natasha": "Natasha",
"Pela": "Pela", "Pela": "Pela",
@ -430,7 +432,8 @@
"Welt": "Welt", "Welt": "Welt",
"Xueyi": "Xueyi", "Xueyi": "Xueyi",
"Yanqing": "Yanqing", "Yanqing": "Yanqing",
"Yukong": "Yukong" "Yukong": "Yukong",
"Yunli": "Yunli"
} }
}, },
"DungeonStorage": { "DungeonStorage": {
@ -555,11 +558,11 @@
"help": "" "help": ""
}, },
"Item_IPC_Work_Permit": { "Item_IPC_Work_Permit": {
"name": "Ascension: Physical (Boothill / Robin)", "name": "Ascension: Physical (Boothill / Robin / Yunli)",
"help": "" "help": ""
}, },
"Item_Raging_Heart": { "Item_Raging_Heart": {
"name": "Ascension: Fire (Firefly / Gallagher)", "name": "Ascension: Fire (Firefly / Gallagher / Jiaoqiu)",
"help": "" "help": ""
}, },
"Item_Dream_Fridge": { "Item_Dream_Fridge": {

View File

@ -263,10 +263,10 @@
"Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Rastros: Nihilidad (Comisión de Alquimia)", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "Rastros: Nihilidad (Comisión de Alquimia)",
"Stagnant_Shadow_Spike": "Ascension: Físico (Natasha / Clara / Luka / Sushang)", "Stagnant_Shadow_Spike": "Ascension: Físico (Natasha / Clara / Luka / Sushang)",
"Stagnant_Shadow_Perdition": "Ascension: Físico (Hanya / Argenti)", "Stagnant_Shadow_Perdition": "Ascension: Físico (Hanya / Argenti)",
"Stagnant_Shadow_Duty": "Ascension: Físico (Boothill / Robin)", "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)", "Stagnant_Shadow_Ire": "Ascension: Fuego (Luciérnaga / Gallagher / Jiaoqiu)",
"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)",
@ -288,7 +288,7 @@
"Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Artefactos: HP y SPD (Senda de los elixires)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Artefactos: HP y SPD (Senda de los elixires)",
"Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)", "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)",
"Cavern_of_Corrosion_Path_of_Dreamdive": "Artefactos: Debuff y Efecto de Ruptura (Senda de los sueños)", "Cavern_of_Corrosion_Path_of_Dreamdive": "Artefactos: Debuff y Efecto de Ruptura (Senda de los sueños)",
"Cavern_of_Corrosion_Path_of_Cavalier": "Artefactos: Ultrarruptura y Adicional de Definitiva (Caverna de la corrosión: Senda del caballero)" "Cavern_of_Corrosion_Path_of_Cavalier": "Artefactos: Ultrarruptura y Adicional de Definitiva (Caverna de la corrosión: Senda del caballero) (Senda del caballero)"
}, },
"NameAtDoubleCalyx": { "NameAtDoubleCalyx": {
"name": "En los eventos de x2 de Cáliz", "name": "En los eventos de x2 de Cáliz",
@ -329,7 +329,7 @@
"Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Artefactos: HP y SPD (Senda de los elixires)", "Cavern_of_Corrosion_Path_of_Elixir_Seekers": "Artefactos: HP y SPD (Senda de los elixires)",
"Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)", "Cavern_of_Corrosion_Path_of_Darkness": "Artefactos: Persecución y Dot (Senda de la oscuridad)",
"Cavern_of_Corrosion_Path_of_Dreamdive": "Artefactos: Debuff y Efecto de Ruptura (Senda de los sueños)", "Cavern_of_Corrosion_Path_of_Dreamdive": "Artefactos: Debuff y Efecto de Ruptura (Senda de los sueños)",
"Cavern_of_Corrosion_Path_of_Cavalier": "Artefactos: Ultrarruptura y Adicional de Definitiva (Caverna de la corrosión: Senda del caballero)" "Cavern_of_Corrosion_Path_of_Cavalier": "Artefactos: Ultrarruptura y Adicional de Definitiva (Caverna de la corrosión: Senda del caballero) (Senda del caballero)"
}, },
"Team": { "Team": {
"name": "Equipo de mazmorra", "name": "Equipo de mazmorra",
@ -403,13 +403,15 @@
"Himeko": "Himeko", "Himeko": "Himeko",
"Hook": "Hook", "Hook": "Hook",
"Huohuo": "Huohuo", "Huohuo": "Huohuo",
"Jade": "Jade",
"JingYuan": "Jing Yuan", "JingYuan": "Jing Yuan",
"Jingliu": "Jingliu", "Jingliu": "Jingliu",
"Kafka": "Kafka", "Kafka": "Kafka",
"Luka": "Luka", "Luka": "Luka",
"Luocha": "Luocha", "Luocha": "Luocha",
"Lynx": "Lynx", "Lynx": "Lynx",
"March7th": "Siete de Marzo", "March7thPreservation": "Siete de Marzo: Conservación",
"March7thTheHunt": "Siete de Marzo: Cacería",
"Misha": "Misha", "Misha": "Misha",
"Natasha": "Natasha", "Natasha": "Natasha",
"Pela": "Pela", "Pela": "Pela",
@ -430,7 +432,8 @@
"Welt": "Welt", "Welt": "Welt",
"Xueyi": "Xueyi", "Xueyi": "Xueyi",
"Yanqing": "Yanqing", "Yanqing": "Yanqing",
"Yukong": "Yukong" "Yukong": "Yukong",
"Yunli": "Yunli"
} }
}, },
"DungeonStorage": { "DungeonStorage": {
@ -555,11 +558,11 @@
"help": "" "help": ""
}, },
"Item_IPC_Work_Permit": { "Item_IPC_Work_Permit": {
"name": "Ascension: Físico (Boothill / Robin)", "name": "Ascension: Físico (Boothill / Robin / Yunli)",
"help": "" "help": ""
}, },
"Item_Raging_Heart": { "Item_Raging_Heart": {
"name": "Ascension: Fuego (Luciérnaga / Gallagher)", "name": "Ascension: Fuego (Luciérnaga / Gallagher / Jiaoqiu)",
"help": "" "help": ""
}, },
"Item_Dream_Fridge": { "Item_Dream_Fridge": {
@ -647,7 +650,7 @@
"help": "" "help": ""
}, },
"Item_Lost_Echo_of_the_Shared_Wish": { "Item_Lost_Echo_of_the_Shared_Wish": {
"name": "Ecos de la guerra: Tributo del sueño ceniciento (Colonipenal)", "name": "Tributo del sueño ceniciento (Colonipenal)",
"help": "" "help": ""
}, },
"Item_Squirming_Core": { "Item_Squirming_Core": {
@ -695,7 +698,7 @@
"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": "Ecos de la guerra: Tributo del sueño ceniciento (Colonipenal)" "Echo_of_War_Salutations_of_Ashen_Dreams": "Tributo del sueño ceniciento (Colonipenal)"
}, },
"Team": { "Team": {
"name": "Equipo de mazmorra", "name": "Equipo de mazmorra",

View File

@ -263,10 +263,10 @@
"Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "軌跡素材:虚無(丹鼎司)", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "軌跡素材:虚無(丹鼎司)",
"Stagnant_Shadow_Spike": "キャラクター昇格素材:物理(ナターシャ / クラーラ / ルカ / 素裳)", "Stagnant_Shadow_Spike": "キャラクター昇格素材:物理(ナターシャ / クラーラ / ルカ / 素裳)",
"Stagnant_Shadow_Perdition": "キャラクター昇格素材:物理(寒鴉 / アルジェンティ)", "Stagnant_Shadow_Perdition": "キャラクター昇格素材:物理(寒鴉 / アルジェンティ)",
"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": "キャラクター昇格素材:氷(ミーシャ)",
@ -403,13 +403,15 @@
"Himeko": "姫子", "Himeko": "姫子",
"Hook": "フック", "Hook": "フック",
"Huohuo": "フォフォ", "Huohuo": "フォフォ",
"Jade": "ジェイド",
"JingYuan": "景元", "JingYuan": "景元",
"Jingliu": "鏡流", "Jingliu": "鏡流",
"Kafka": "カフカ", "Kafka": "カフカ",
"Luka": "ルカ", "Luka": "ルカ",
"Luocha": "羅刹", "Luocha": "羅刹",
"Lynx": "リンクス", "Lynx": "リンクス",
"March7th": "三月なのか", "March7thPreservation": "三月なのか・存護",
"March7thTheHunt": "三月なのか・巡狩",
"Misha": "ミーシャ", "Misha": "ミーシャ",
"Natasha": "ナターシャ", "Natasha": "ナターシャ",
"Pela": "ペラ", "Pela": "ペラ",
@ -430,7 +432,8 @@
"Welt": "ヴェルト", "Welt": "ヴェルト",
"Xueyi": "雪衣", "Xueyi": "雪衣",
"Yanqing": "彦卿", "Yanqing": "彦卿",
"Yukong": "御空" "Yukong": "御空",
"Yunli": "雲璃"
} }
}, },
"DungeonStorage": { "DungeonStorage": {
@ -555,11 +558,11 @@
"help": "" "help": ""
}, },
"Item_IPC_Work_Permit": { "Item_IPC_Work_Permit": {
"name": "キャラクター昇格素材:物理(ブートヒル / ロビン", "name": "キャラクター昇格素材:物理(ブートヒル / ロビン / 雲璃",
"help": "" "help": ""
}, },
"Item_Raging_Heart": { "Item_Raging_Heart": {
"name": "キャラクター昇格素材:炎(ホタル / ギャラガー", "name": "キャラクター昇格素材:炎(ホタル / ギャラガー / 椒丘",
"help": "" "help": ""
}, },
"Item_Dream_Fridge": { "Item_Dream_Fridge": {

View File

@ -263,10 +263,10 @@
"Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行迹材料:虚无(丹鼎司)", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行迹材料:虚无(丹鼎司)",
"Stagnant_Shadow_Spike": "角色晋阶材料:物理(娜塔莎 / 克拉拉 / 卢卡 / 素裳)", "Stagnant_Shadow_Spike": "角色晋阶材料:物理(娜塔莎 / 克拉拉 / 卢卡 / 素裳)",
"Stagnant_Shadow_Perdition": "角色晋阶材料:物理(寒鸦 / 银枝)", "Stagnant_Shadow_Perdition": "角色晋阶材料:物理(寒鸦 / 银枝)",
"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": "角色晋阶材料:冰(米沙)",
@ -403,13 +403,15 @@
"Himeko": "姬子", "Himeko": "姬子",
"Hook": "虎克", "Hook": "虎克",
"Huohuo": "藿藿", "Huohuo": "藿藿",
"Jade": "翡翠",
"JingYuan": "景元", "JingYuan": "景元",
"Jingliu": "镜流", "Jingliu": "镜流",
"Kafka": "卡芙卡", "Kafka": "卡芙卡",
"Luka": "卢卡", "Luka": "卢卡",
"Luocha": "罗刹", "Luocha": "罗刹",
"Lynx": "玲可", "Lynx": "玲可",
"March7th": "三月七", "March7thPreservation": "三月七•存护",
"March7thTheHunt": "三月七•巡猎",
"Misha": "米沙", "Misha": "米沙",
"Natasha": "娜塔莎", "Natasha": "娜塔莎",
"Pela": "佩拉", "Pela": "佩拉",
@ -430,7 +432,8 @@
"Welt": "瓦尔特", "Welt": "瓦尔特",
"Xueyi": "雪衣", "Xueyi": "雪衣",
"Yanqing": "彦卿", "Yanqing": "彦卿",
"Yukong": "驭空" "Yukong": "驭空",
"Yunli": "云璃"
} }
}, },
"DungeonStorage": { "DungeonStorage": {
@ -555,11 +558,11 @@
"help": "" "help": ""
}, },
"Item_IPC_Work_Permit": { "Item_IPC_Work_Permit": {
"name": "角色晋阶材料:物理(波提欧 / 知更鸟", "name": "角色晋阶材料:物理(波提欧 / 知更鸟 / 云璃",
"help": "" "help": ""
}, },
"Item_Raging_Heart": { "Item_Raging_Heart": {
"name": "角色晋阶材料:火(流萤 / 加拉赫", "name": "角色晋阶材料:火(流萤 / 加拉赫 / 椒丘",
"help": "" "help": ""
}, },
"Item_Dream_Fridge": { "Item_Dream_Fridge": {

View File

@ -263,10 +263,10 @@
"Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行跡材料:虛無(丹鼎司)", "Calyx_Crimson_Nihility_Luofu_AlchemyCommission": "行跡材料:虛無(丹鼎司)",
"Stagnant_Shadow_Spike": "角色晉階材料:物理(娜塔莎 / 克拉拉 / 盧卡 / 素裳)", "Stagnant_Shadow_Spike": "角色晉階材料:物理(娜塔莎 / 克拉拉 / 盧卡 / 素裳)",
"Stagnant_Shadow_Perdition": "角色晉階材料:物理(寒鴉 / 銀枝)", "Stagnant_Shadow_Perdition": "角色晉階材料:物理(寒鴉 / 銀枝)",
"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": "角色晉階材料:冰(米沙)",
@ -403,13 +403,15 @@
"Himeko": "姬子", "Himeko": "姬子",
"Hook": "虎克", "Hook": "虎克",
"Huohuo": "藿藿", "Huohuo": "藿藿",
"Jade": "翡翠",
"JingYuan": "景元", "JingYuan": "景元",
"Jingliu": "鏡流", "Jingliu": "鏡流",
"Kafka": "卡芙卡", "Kafka": "卡芙卡",
"Luka": "盧卡", "Luka": "盧卡",
"Luocha": "羅剎", "Luocha": "羅剎",
"Lynx": "玲可", "Lynx": "玲可",
"March7th": "三月七", "March7thPreservation": "三月七•存護",
"March7thTheHunt": "三月七•巡獵",
"Misha": "米沙", "Misha": "米沙",
"Natasha": "娜塔莎", "Natasha": "娜塔莎",
"Pela": "佩拉", "Pela": "佩拉",
@ -430,7 +432,8 @@
"Welt": "瓦爾特", "Welt": "瓦爾特",
"Xueyi": "雪衣", "Xueyi": "雪衣",
"Yanqing": "彥卿", "Yanqing": "彥卿",
"Yukong": "馭空" "Yukong": "馭空",
"Yunli": "雲璃"
} }
}, },
"DungeonStorage": { "DungeonStorage": {
@ -555,11 +558,11 @@
"help": "" "help": ""
}, },
"Item_IPC_Work_Permit": { "Item_IPC_Work_Permit": {
"name": "角色晉階材料:物理(波提歐 / 知更鳥", "name": "角色晉階材料:物理(波提歐 / 知更鳥 / 雲璃",
"help": "" "help": ""
}, },
"Item_Raging_Heart": { "Item_Raging_Heart": {
"name": "角色晉階材料:火(流螢 / 加拉赫", "name": "角色晉階材料:火(流螢 / 加拉赫 / 椒丘",
"help": "" "help": ""
}, },
"Item_Dream_Fridge": { "Item_Dream_Fridge": {

View File

@ -23,7 +23,7 @@ DICT_SORTED_RANGES = {
Boothill, Boothill,
Yukong, Yukong,
TopazNumby, TopazNumby,
March7th, March7thPreservation,
Bronya, Bronya,
Asta, Asta,
Pela, Pela,

View File

@ -228,8 +228,17 @@ Jade = CharacterList(
jp='ジェイド', jp='ジェイド',
es='Jade', es='Jade',
) )
JingYuan = CharacterList( Jiaoqiu = CharacterList(
id=26, id=26,
name='Jiaoqiu',
cn='椒丘',
cht='椒丘',
en='Jiaoqiu',
jp='椒丘',
es='Jiaoqiu',
)
JingYuan = CharacterList(
id=27,
name='JingYuan', name='JingYuan',
cn='景元', cn='景元',
cht='景元', cht='景元',
@ -238,7 +247,7 @@ JingYuan = CharacterList(
es='Jing Yuan', es='Jing Yuan',
) )
Jingliu = CharacterList( Jingliu = CharacterList(
id=27, id=28,
name='Jingliu', name='Jingliu',
cn='镜流', cn='镜流',
cht='鏡流', cht='鏡流',
@ -247,7 +256,7 @@ Jingliu = CharacterList(
es='Jingliu', es='Jingliu',
) )
Kafka = CharacterList( Kafka = CharacterList(
id=28, id=29,
name='Kafka', name='Kafka',
cn='卡芙卡', cn='卡芙卡',
cht='卡芙卡', cht='卡芙卡',
@ -256,7 +265,7 @@ Kafka = CharacterList(
es='Kafka', es='Kafka',
) )
Luka = CharacterList( Luka = CharacterList(
id=29, id=30,
name='Luka', name='Luka',
cn='卢卡', cn='卢卡',
cht='盧卡', cht='盧卡',
@ -265,7 +274,7 @@ Luka = CharacterList(
es='Luka', es='Luka',
) )
Luocha = CharacterList( Luocha = CharacterList(
id=30, id=31,
name='Luocha', name='Luocha',
cn='罗刹', cn='罗刹',
cht='羅剎', cht='羅剎',
@ -274,7 +283,7 @@ Luocha = CharacterList(
es='Luocha', es='Luocha',
) )
Lynx = CharacterList( Lynx = CharacterList(
id=31, id=32,
name='Lynx', name='Lynx',
cn='玲可', cn='玲可',
cht='玲可', cht='玲可',
@ -282,17 +291,26 @@ Lynx = CharacterList(
jp='リンクス', jp='リンクス',
es='Lynx', es='Lynx',
) )
March7th = CharacterList( March7thPreservation = CharacterList(
id=32, id=33,
name='March7th', name='March7thPreservation',
cn='三月七', cn='三月七•存护',
cht='三月七', cht='三月七•存護',
en='March 7th', en='March 7th: Preservation',
jp='三月なのか', jp='三月なのか・存護',
es='Siete de Marzo', es='Siete de Marzo: Conservación',
)
March7thTheHunt = CharacterList(
id=34,
name='March7thTheHunt',
cn='三月七•巡猎',
cht='三月七•巡獵',
en='March 7th: The Hunt',
jp='三月なのか・巡狩',
es='Siete de Marzo: Cacería',
) )
Misha = CharacterList( Misha = CharacterList(
id=33, id=35,
name='Misha', name='Misha',
cn='米沙', cn='米沙',
cht='米沙', cht='米沙',
@ -301,7 +319,7 @@ Misha = CharacterList(
es='Misha', es='Misha',
) )
Natasha = CharacterList( Natasha = CharacterList(
id=34, id=36,
name='Natasha', name='Natasha',
cn='娜塔莎', cn='娜塔莎',
cht='娜塔莎', cht='娜塔莎',
@ -310,7 +328,7 @@ Natasha = CharacterList(
es='Natasha', es='Natasha',
) )
Pela = CharacterList( Pela = CharacterList(
id=35, id=37,
name='Pela', name='Pela',
cn='佩拉', cn='佩拉',
cht='佩拉', cht='佩拉',
@ -319,7 +337,7 @@ Pela = CharacterList(
es='Pela', es='Pela',
) )
Qingque = CharacterList( Qingque = CharacterList(
id=36, id=38,
name='Qingque', name='Qingque',
cn='青雀', cn='青雀',
cht='青雀', cht='青雀',
@ -328,7 +346,7 @@ Qingque = CharacterList(
es='Qingque', es='Qingque',
) )
Robin = CharacterList( Robin = CharacterList(
id=37, id=39,
name='Robin', name='Robin',
cn='知更鸟', cn='知更鸟',
cht='知更鳥', cht='知更鳥',
@ -337,7 +355,7 @@ Robin = CharacterList(
es='Robin', es='Robin',
) )
RuanMei = CharacterList( RuanMei = CharacterList(
id=38, id=40,
name='RuanMei', name='RuanMei',
cn='阮•梅', cn='阮•梅',
cht='阮•梅', cht='阮•梅',
@ -346,7 +364,7 @@ RuanMei = CharacterList(
es='Ruan Mei', es='Ruan Mei',
) )
Sampo = CharacterList( Sampo = CharacterList(
id=39, id=41,
name='Sampo', name='Sampo',
cn='桑博', cn='桑博',
cht='桑博', cht='桑博',
@ -355,7 +373,7 @@ Sampo = CharacterList(
es='Sampo', es='Sampo',
) )
Seele = CharacterList( Seele = CharacterList(
id=40, id=42,
name='Seele', name='Seele',
cn='希儿', cn='希儿',
cht='希兒', cht='希兒',
@ -364,7 +382,7 @@ Seele = CharacterList(
es='Seele', es='Seele',
) )
Serval = CharacterList( Serval = CharacterList(
id=41, id=43,
name='Serval', name='Serval',
cn='希露瓦', cn='希露瓦',
cht='希露瓦', cht='希露瓦',
@ -373,7 +391,7 @@ Serval = CharacterList(
es='Serval', es='Serval',
) )
SilverWolf = CharacterList( SilverWolf = CharacterList(
id=42, id=44,
name='SilverWolf', name='SilverWolf',
cn='银狼', cn='银狼',
cht='銀狼', cht='銀狼',
@ -382,7 +400,7 @@ SilverWolf = CharacterList(
es='Silver Wolf', es='Silver Wolf',
) )
Sparkle = CharacterList( Sparkle = CharacterList(
id=43, id=45,
name='Sparkle', name='Sparkle',
cn='花火', cn='花火',
cht='花火', cht='花火',
@ -391,7 +409,7 @@ Sparkle = CharacterList(
es='Sparkle', es='Sparkle',
) )
Sushang = CharacterList( Sushang = CharacterList(
id=44, id=46,
name='Sushang', name='Sushang',
cn='素裳', cn='素裳',
cht='素裳', cht='素裳',
@ -400,7 +418,7 @@ Sushang = CharacterList(
es='Sushang', es='Sushang',
) )
Tingyun = CharacterList( Tingyun = CharacterList(
id=45, id=47,
name='Tingyun', name='Tingyun',
cn='停云', cn='停云',
cht='停雲', cht='停雲',
@ -409,7 +427,7 @@ Tingyun = CharacterList(
es='Tingyun', es='Tingyun',
) )
TopazNumby = CharacterList( TopazNumby = CharacterList(
id=46, id=48,
name='TopazNumby', name='TopazNumby',
cn='托帕&账账', cn='托帕&账账',
cht='托帕&帳帳', cht='托帕&帳帳',
@ -418,7 +436,7 @@ TopazNumby = CharacterList(
es='Topaz y Conti', es='Topaz y Conti',
) )
TrailblazerDestruction = CharacterList( TrailblazerDestruction = CharacterList(
id=47, id=49,
name='TrailblazerDestruction', name='TrailblazerDestruction',
cn='Trailblazer•毁灭', cn='Trailblazer•毁灭',
cht='Trailblazer•毀滅', cht='Trailblazer•毀滅',
@ -427,7 +445,7 @@ TrailblazerDestruction = CharacterList(
es='Trailblazer: Destrucción', es='Trailblazer: Destrucción',
) )
TrailblazerHarmony = CharacterList( TrailblazerHarmony = CharacterList(
id=48, id=50,
name='TrailblazerHarmony', name='TrailblazerHarmony',
cn='Trailblazer•同谐', cn='Trailblazer•同谐',
cht='Trailblazer•同諧', cht='Trailblazer•同諧',
@ -436,7 +454,7 @@ TrailblazerHarmony = CharacterList(
es='Trailblazer: Armonía', es='Trailblazer: Armonía',
) )
TrailblazerPreservation = CharacterList( TrailblazerPreservation = CharacterList(
id=49, id=51,
name='TrailblazerPreservation', name='TrailblazerPreservation',
cn='Trailblazer•存护', cn='Trailblazer•存护',
cht='Trailblazer•存護', cht='Trailblazer•存護',
@ -445,7 +463,7 @@ TrailblazerPreservation = CharacterList(
es='Trailblazer: Conservación', es='Trailblazer: Conservación',
) )
Welt = CharacterList( Welt = CharacterList(
id=50, id=52,
name='Welt', name='Welt',
cn='瓦尔特', cn='瓦尔特',
cht='瓦爾特', cht='瓦爾特',
@ -454,7 +472,7 @@ Welt = CharacterList(
es='Welt', es='Welt',
) )
Xueyi = CharacterList( Xueyi = CharacterList(
id=51, id=53,
name='Xueyi', name='Xueyi',
cn='雪衣', cn='雪衣',
cht='雪衣', cht='雪衣',
@ -463,7 +481,7 @@ Xueyi = CharacterList(
es='Xueyi', es='Xueyi',
) )
Yanqing = CharacterList( Yanqing = CharacterList(
id=52, id=54,
name='Yanqing', name='Yanqing',
cn='彦卿', cn='彦卿',
cht='彥卿', cht='彥卿',
@ -472,7 +490,7 @@ Yanqing = CharacterList(
es='Yanqing', es='Yanqing',
) )
Yukong = CharacterList( Yukong = CharacterList(
id=53, id=55,
name='Yukong', name='Yukong',
cn='驭空', cn='驭空',
cht='馭空', cht='馭空',
@ -480,3 +498,12 @@ Yukong = CharacterList(
jp='御空', jp='御空',
es='Yukong', es='Yukong',
) )
Yunli = CharacterList(
id=56,
name='Yunli',
cn='云璃',
cht='雲璃',
en='Yunli',
jp='雲璃',
es='Yunli',
)

View File

@ -13,7 +13,6 @@ CHARACTER_HEIGHT = {
'Tingyun': 'Maid', 'Tingyun': 'Maid',
'Sushang': 'Maid', 'Sushang': 'Maid',
'Seele': 'Maid', 'Seele': 'Maid',
'March7th': 'Maid',
'Jingliu': 'Maid', 'Jingliu': 'Maid',
'Bronya': 'Maid', 'Bronya': 'Maid',
'Asta': 'Maid', 'Asta': 'Maid',

View File

@ -18,7 +18,7 @@ COMBAT_SUPPORT_LIST = ButtonWrapper(
share=Button( share=Button(
file='./assets/share/combat/support/COMBAT_SUPPORT_LIST.png', file='./assets/share/combat/support/COMBAT_SUPPORT_LIST.png',
area=(39, 645, 65, 669), area=(39, 645, 65, 669),
search=(19, 625, 85, 689), search=(32, 643, 72, 683),
color=(204, 206, 206), color=(204, 206, 206),
button=(39, 645, 65, 669), button=(39, 645, 65, 669),
), ),
@ -27,10 +27,10 @@ COMBAT_SUPPORT_LIST_GRID = ButtonWrapper(
name='COMBAT_SUPPORT_LIST_GRID', name='COMBAT_SUPPORT_LIST_GRID',
share=Button( share=Button(
file='./assets/share/combat/support/COMBAT_SUPPORT_LIST_GRID.png', file='./assets/share/combat/support/COMBAT_SUPPORT_LIST_GRID.png',
area=(36, 148, 128, 629), area=(26, 109, 131, 634),
search=(16, 128, 148, 649), search=(6, 89, 151, 654),
color=(135, 124, 133), color=(101, 87, 99),
button=(36, 148, 128, 629), button=(26, 109, 131, 634),
), ),
) )
COMBAT_SUPPORT_LIST_SCROLL = ButtonWrapper( COMBAT_SUPPORT_LIST_SCROLL = ButtonWrapper(

View File

@ -17,10 +17,10 @@ DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE = ButtonWrapper(
name='DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE', name='DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE',
share=Button( share=Button(
file='./assets/share/dungeon/ui_rogue/DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE.png', file='./assets/share/dungeon/ui_rogue/DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE.png',
area=(437, 316, 1169, 378), area=(592, 174, 636, 331),
search=(417, 296, 1189, 398), search=(572, 154, 656, 351),
color=(197, 105, 95), color=(140, 82, 83),
button=(437, 316, 1169, 378), button=(592, 174, 636, 331),
), ),
) )
LAST_TELEPORT = ButtonWrapper( LAST_TELEPORT = ButtonWrapper(
@ -47,10 +47,10 @@ SURVIVAL_INDEX_OE_LOADED = ButtonWrapper(
name='SURVIVAL_INDEX_OE_LOADED', name='SURVIVAL_INDEX_OE_LOADED',
share=Button( share=Button(
file='./assets/share/dungeon/ui_rogue/SURVIVAL_INDEX_OE_LOADED.png', file='./assets/share/dungeon/ui_rogue/SURVIVAL_INDEX_OE_LOADED.png',
area=(473, 207, 498, 232), area=(455, 208, 485, 338),
search=(468, 193, 503, 283), search=(460, 238, 480, 268),
color=(185, 135, 74), color=(130, 116, 91),
button=(473, 207, 498, 232), button=(455, 208, 485, 338),
), ),
) )
SURVIVAL_INDEX_SU_LOADED = ButtonWrapper( SURVIVAL_INDEX_SU_LOADED = ButtonWrapper(

View File

@ -164,7 +164,7 @@ Calyx_Crimson_The_Hunt_Penacony_SoulGladScorchsandAuditionVenue = DungeonList(
cht='巡獵之蕾•擬造花萼(赤)', cht='巡獵之蕾•擬造花萼(赤)',
en='Calyx (Crimson): Bud of The Hunt', en='Calyx (Crimson): Bud of The Hunt',
jp='疑似花萼(赤)・巡狩の蕾', jp='疑似花萼(赤)・巡狩の蕾',
es='Cáliz (carmesí): Flor de la Cacería', es='Flor de la Cacería',
dungeon_id=1022, dungeon_id=1022,
plane_id=2033101, plane_id=2033101,
) )
@ -208,7 +208,7 @@ Calyx_Crimson_Erudition_Penacony_PenaconyGrandTheater = DungeonList(
cht='智識之蕾•擬造花萼(赤)', cht='智識之蕾•擬造花萼(赤)',
en='Calyx (Crimson): Bud of Erudition', en='Calyx (Crimson): Bud of Erudition',
jp='疑似花萼(赤)・知恵の蕾', jp='疑似花萼(赤)・知恵の蕾',
es='Cáliz (carmesí): Flor de la Erudición', es='Flor de la Erudición',
dungeon_id=1023, dungeon_id=1023,
plane_id=2033201, plane_id=2033201,
) )
@ -450,7 +450,7 @@ Stagnant_Shadow_Duty = DungeonList(
cht='職司之形•凝滯虛影', cht='職司之形•凝滯虛影',
en='Stagnant Shadow: Shape of Duty', en='Stagnant Shadow: Shape of Duty',
jp='凝結虚影・職掌の形', jp='凝結虚影・職掌の形',
es='Sombra paralizada: Forma del deber', es='Forma del deber',
dungeon_id=1118, dungeon_id=1118,
plane_id=2032101, plane_id=2032101,
) )
@ -560,7 +560,7 @@ Cavern_of_Corrosion_Path_of_Cavalier = DungeonList(
cht='勇騎之徑•侵蝕隧洞', cht='勇騎之徑•侵蝕隧洞',
en='Cavern of Corrosion: Path of Cavalier', en='Cavern of Corrosion: Path of Cavalier',
jp='侵蝕トンネル・勇騎の路', jp='侵蝕トンネル・勇騎の路',
es='Caverna de la corrosión: Senda del caballero', es='Senda del caballero',
dungeon_id=1210, dungeon_id=1210,
plane_id=2033201, plane_id=2033201,
) )
@ -615,7 +615,7 @@ Echo_of_War_Salutations_of_Ashen_Dreams = DungeonList(
cht='塵夢的讚禮•歷戰餘響', cht='塵夢的讚禮•歷戰餘響',
en='Echo of War: Salutations of Ashen Dreams', en='Echo of War: Salutations of Ashen Dreams',
jp='歴戦余韻・現世の夢の礼賛', jp='歴戦余韻・現世の夢の礼賛',
es='Ecos de la guerra: Tributo del sueño ceniciento', es='Tributo del sueño ceniciento',
dungeon_id=1305, dungeon_id=1305,
plane_id=2033201, plane_id=2033201,
) )
@ -714,7 +714,7 @@ Divergent_Universe_Eternal_Comedy = DungeonList(
cht='永恆笑劇•差分宇宙', cht='永恆笑劇•差分宇宙',
en='Divergent Universe: Eternal Comedy', en='Divergent Universe: Eternal Comedy',
jp='階差宇宙・永遠の喜劇', jp='階差宇宙・永遠の喜劇',
es='Universo Diferenciado: Comedia eterna', es='Comedia eterna',
dungeon_id=300, dungeon_id=300,
plane_id=0, plane_id=0,
) )
@ -725,7 +725,7 @@ Divergent_Universe_To_Sweet_Dreams = DungeonList(
cht='伴你入眠•差分宇宙', cht='伴你入眠•差分宇宙',
en='Divergent Universe: To Sweet Dreams', en='Divergent Universe: To Sweet Dreams',
jp='階差宇宙・寄り添い眠る', jp='階差宇宙・寄り添い眠る',
es='Hasta los dulces sueños: Universo Diferenciado', es='Hasta los dulces sueños',
dungeon_id=290, dungeon_id=290,
plane_id=0, plane_id=0,
) )
@ -736,7 +736,7 @@ Divergent_Universe_Pouring_Blades = DungeonList(
cht='天劍如雨•差分宇宙', cht='天劍如雨•差分宇宙',
en='Divergent Universe: Pouring Blades', en='Divergent Universe: Pouring Blades',
jp='階差宇宙・剣の雨', jp='階差宇宙・剣の雨',
es='Lluvia de espadas: Universo Diferenciado', es='Lluvia de espadas',
dungeon_id=280, dungeon_id=280,
plane_id=0, plane_id=0,
) )
@ -747,7 +747,7 @@ Divergent_Universe_Fruit_of_Evil = DungeonList(
cht='孽果盤生•差分宇宙', cht='孽果盤生•差分宇宙',
en='Divergent Universe: Fruit of Evil', en='Divergent Universe: Fruit of Evil',
jp='階差宇宙・渦巻く罪', jp='階差宇宙・渦巻く罪',
es='Fruta del desastre: Universo Diferenciado', es='Fruta del desastre',
dungeon_id=270, dungeon_id=270,
plane_id=0, plane_id=0,
) )
@ -758,7 +758,7 @@ Divergent_Universe_Permafrost = DungeonList(
cht='百年凍土•差分宇宙', cht='百年凍土•差分宇宙',
en='Divergent Universe: Permafrost', en='Divergent Universe: Permafrost',
jp='階差宇宙・永久凍土', jp='階差宇宙・永久凍土',
es='Permafrost: Universo Diferenciado', es='Permafrost',
dungeon_id=260, dungeon_id=260,
plane_id=0, plane_id=0,
) )
@ -769,7 +769,7 @@ Divergent_Universe_Gentle_Words = DungeonList(
cht='溫柔話語•差分宇宙', cht='溫柔話語•差分宇宙',
en='Divergent Universe: Gentle Words', en='Divergent Universe: Gentle Words',
jp='階差宇宙・優しい言葉', jp='階差宇宙・優しい言葉',
es='Palabras amables: Universo Diferenciado', es='Palabras amables',
dungeon_id=250, dungeon_id=250,
plane_id=0, plane_id=0,
) )
@ -780,7 +780,7 @@ Divergent_Universe_Smelted_Heart = DungeonList(
cht='浴火鋼心•差分宇宙', cht='浴火鋼心•差分宇宙',
en='Divergent Universe: Smelted Heart', en='Divergent Universe: Smelted Heart',
jp='階差宇宙・鋼の意志', jp='階差宇宙・鋼の意志',
es='Corazón de fundición: Universo Diferenciado', es='Corazón de fundición',
dungeon_id=240, dungeon_id=240,
plane_id=0, plane_id=0,
) )
@ -791,7 +791,7 @@ Divergent_Universe_Untoppled_Walls = DungeonList(
cht='堅城不倒•差分宇宙', cht='堅城不倒•差分宇宙',
en='Divergent Universe: Untoppled Walls', en='Divergent Universe: Untoppled Walls',
jp='階差宇宙・不動の砦', jp='階差宇宙・不動の砦',
es='Muros inquebrantables: Universo Diferenciado', es='Muros inquebrantables',
dungeon_id=230, dungeon_id=230,
plane_id=0, plane_id=0,
) )

View File

@ -150,18 +150,18 @@ 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)', en='Ascension: Fire (Firefly / Gallagher / Jiaoqiu)',
jp='キャラクター昇格素材:炎(ホタル / ギャラガー', jp='キャラクター昇格素材:炎(ホタル / ギャラガー / 椒丘',
es='Ascension: Fuego (Luciérnaga / Gallagher)', es='Ascension: Fuego (Luciérnaga / Gallagher / Jiaoqiu)',
) )
Stagnant_Shadow_Duty = DungeonDetailed( Stagnant_Shadow_Duty = DungeonDetailed(
id=18, id=18,
name='Stagnant_Shadow_Duty', name='Stagnant_Shadow_Duty',
cn='角色晋阶材料:物理(波提欧 / 知更鸟', cn='角色晋阶材料:物理(波提欧 / 知更鸟 / 云璃',
cht='角色晉階材料:物理(波提歐 / 知更鳥', cht='角色晉階材料:物理(波提歐 / 知更鳥 / 雲璃',
en='Ascension: Physical (Boothill / Robin)', en='Ascension: Physical (Boothill / Robin / Yunli)',
jp='キャラクター昇格素材:物理(ブートヒル / ロビン', jp='キャラクター昇格素材:物理(ブートヒル / ロビン / 雲璃',
es='Ascension: Físico (Boothill / Robin)', es='Ascension: Físico (Boothill / Robin / Yunli)',
) )

View File

@ -72,7 +72,7 @@ class XPath:
悬浮窗及侧边栏元素 悬浮窗及侧边栏元素
""" """
# 悬浮窗 # 悬浮窗
FLOAT_WINDOW = '//*[@package="com.miHoYo.cloudgames.hkrpg" and @class="android.widget.ImageView"]' FLOAT_WINDOW = '//*[@package="com.miHoYo.cloudgames.hkrpg" and @class="android.widget.LinearLayout"]'
# 退出按钮,返回登录页面 # 退出按钮,返回登录页面
FLOAT_EXIT = '//*[@resource-id="com.miHoYo.cloudgames.hkrpg:id/iv_exit"]' FLOAT_EXIT = '//*[@resource-id="com.miHoYo.cloudgames.hkrpg:id/iv_exit"]'
# 弹出侧边栏的 节点信息 # 弹出侧边栏的 节点信息
@ -159,6 +159,16 @@ class LoginAndroidCloud(ModuleBase):
season_pass = int(res.group(1)) season_pass = int(res.group(1))
else: else:
season_pass = 0 season_pass = 0
# 42 天
# 5 小时
if '' in text:
pass
elif '小时' in text:
season_pass = round(season_pass / 24, 2)
elif '分钟' in text:
season_pass = round(season_pass / 24 / 60, 3)
else:
logger.error(f'Unexpected season pass text: {text}')
text = self.xpath(XPath.REMAIN_PAID).text text = self.xpath(XPath.REMAIN_PAID).text
logger.info(f'Remain paid: {text}') logger.info(f'Remain paid: {text}')

View File

@ -102,12 +102,12 @@ Rogue_DomainTransaction = MapPlane(
world_id=-2, world_id=-2,
plane_id=7, plane_id=7,
) )
Penacony_RadiantFeldspar = MapPlane( Penacony_TheRadiantFeldspar = MapPlane(
id=10, id=10,
name='Penacony_RadiantFeldspar', name='Penacony_TheRadiantFeldspar',
cn='晖长石号', cn='晖长石号',
cht='暉長石號', cht='暉長石號',
en='Radiant Feldspar', en='The Radiant Feldspar',
jp='暉長石号', jp='暉長石号',
es='Feldespato Radiante', es='Feldespato Radiante',
world_id=3, world_id=3,
@ -454,8 +454,19 @@ Luofu_ScalegorgeWaterscape = MapPlane(
world_id=2, world_id=2,
plane_id=2023201, plane_id=2023201,
) )
Penacony_TheReverieReality = MapPlane( Luofu_TheShacklingPrison = MapPlane(
id=42, id=42,
name='Luofu_TheShacklingPrison',
cn='幽囚狱',
cht='幽囚獄',
en='The Shackling Prison',
jp='幽囚獄',
es='Prisión de los encadenados',
world_id=2,
plane_id=2024101,
)
Penacony_TheReverieReality = MapPlane(
id=43,
name='Penacony_TheReverieReality', name='Penacony_TheReverieReality',
cn='「白日梦」酒店-现实', cn='「白日梦」酒店-现实',
cht='「白日夢」飯店-現實', cht='「白日夢」飯店-現實',
@ -466,7 +477,7 @@ Penacony_TheReverieReality = MapPlane(
plane_id=1030501, plane_id=1030501,
) )
Penacony_GoldenHour = MapPlane( Penacony_GoldenHour = MapPlane(
id=43, id=44,
name='Penacony_GoldenHour', name='Penacony_GoldenHour',
cn='黄金的时刻', cn='黄金的时刻',
cht='黃金的時刻', cht='黃金的時刻',
@ -477,7 +488,7 @@ Penacony_GoldenHour = MapPlane(
plane_id=1030101, plane_id=1030101,
) )
Penacony_DreamEdge = MapPlane( Penacony_DreamEdge = MapPlane(
id=44, id=45,
name='Penacony_DreamEdge', name='Penacony_DreamEdge',
cn='筑梦边境', cn='筑梦边境',
cht='築夢邊境', cht='築夢邊境',
@ -488,7 +499,7 @@ Penacony_DreamEdge = MapPlane(
plane_id=2031301, plane_id=2031301,
) )
Penacony_AChildDream = MapPlane( Penacony_AChildDream = MapPlane(
id=45, id=46,
name='Penacony_AChildDream', name='Penacony_AChildDream',
cn='稚子的梦', cn='稚子的梦',
cht='稚子的夢', cht='稚子的夢',
@ -499,7 +510,7 @@ Penacony_AChildDream = MapPlane(
plane_id=2031201, plane_id=2031201,
) )
Penacony_TheReverieDreamscape = MapPlane( Penacony_TheReverieDreamscape = MapPlane(
id=46, id=47,
name='Penacony_TheReverieDreamscape', name='Penacony_TheReverieDreamscape',
cn='「白日梦」酒店-梦境', cn='「白日梦」酒店-梦境',
cht='「白日夢」飯店-夢境', cht='「白日夢」飯店-夢境',
@ -510,7 +521,7 @@ Penacony_TheReverieDreamscape = MapPlane(
plane_id=2031101, plane_id=2031101,
) )
Penacony_DewlightPavilion = MapPlane( Penacony_DewlightPavilion = MapPlane(
id=47, id=48,
name='Penacony_DewlightPavilion', name='Penacony_DewlightPavilion',
cn='朝露公馆', cn='朝露公馆',
cht='朝露公館', cht='朝露公館',
@ -521,7 +532,7 @@ Penacony_DewlightPavilion = MapPlane(
plane_id=2032201, plane_id=2032201,
) )
Penacony_ClockStudiosThemePark = MapPlane( Penacony_ClockStudiosThemePark = MapPlane(
id=48, id=49,
name='Penacony_ClockStudiosThemePark', name='Penacony_ClockStudiosThemePark',
cn='克劳克影视乐园', cn='克劳克影视乐园',
cht='克勞克影視樂園', cht='克勞克影視樂園',
@ -532,7 +543,7 @@ Penacony_ClockStudiosThemePark = MapPlane(
plane_id=2032101, plane_id=2032101,
) )
Penacony_DreamfluxReef = MapPlane( Penacony_DreamfluxReef = MapPlane(
id=49, id=50,
name='Penacony_DreamfluxReef', name='Penacony_DreamfluxReef',
cn='流梦礁', cn='流梦礁',
cht='流夢礁', cht='流夢礁',
@ -543,7 +554,7 @@ Penacony_DreamfluxReef = MapPlane(
plane_id=1030401, plane_id=1030401,
) )
Penacony_SoulGladScorchsandAuditionVenue = MapPlane( Penacony_SoulGladScorchsandAuditionVenue = MapPlane(
id=50, id=51,
name='Penacony_SoulGladScorchsandAuditionVenue', name='Penacony_SoulGladScorchsandAuditionVenue',
cn='苏乐达热砂海选会场', cn='苏乐达热砂海选会场',
cht='蘇樂達熱砂海選會場', cht='蘇樂達熱砂海選會場',
@ -554,7 +565,7 @@ Penacony_SoulGladScorchsandAuditionVenue = MapPlane(
plane_id=2033101, plane_id=2033101,
) )
Penacony_PenaconyGrandTheater = MapPlane( Penacony_PenaconyGrandTheater = MapPlane(
id=51, id=52,
name='Penacony_PenaconyGrandTheater', name='Penacony_PenaconyGrandTheater',
cn='匹诺康尼大剧院', cn='匹诺康尼大剧院',
cht='匹諾康尼大劇院', cht='匹諾康尼大劇院',

View File

@ -20,7 +20,7 @@ class Ornament(OrnamentCombat):
# Check save file before entering # Check save file before entering
if self.image_color_count( if self.image_color_count(
DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE, DIVERGENT_UNIVERSE_SAVE_UNAVAILABLE,
color=(195, 89, 79), threshold=221, count=1000, color=(140, 19, 26), threshold=221, count=1000,
): ):
logger.error( logger.error(
'Divergent Universe save unavailable, ' 'Divergent Universe save unavailable, '

View File

@ -210,3 +210,39 @@ Fountain_of_Youth = RogueBonus(
jp='不老の泉', jp='不老の泉',
es='Fuente de la juventud', es='Fuente de la juventud',
) )
Reimbursement_Form = RogueBonus(
id=24,
name='Reimbursement_Form',
cn='报销单',
cht='報銷單',
en='Reimbursement Form',
jp='清算書',
es='Formulario de reembolso',
)
Sea_of_Forgetfulness = RogueBonus(
id=25,
name='Sea_of_Forgetfulness',
cn='遗忘海',
cht='遺忘海',
en='Sea of Forgetfulness',
jp='忘却の海',
es='Mar del olvido',
)
Phenomenal_Field = RogueBonus(
id=26,
name='Phenomenal_Field',
cn='现象场',
cht='現象場',
en='Phenomenal Field',
jp='現象の場',
es='Campo fenomenal',
)
Lying_Cap = RogueBonus(
id=27,
name='Lying_Cap',
cn='说谎帽',
cht='說謊帽',
en='Lying Cap',
jp='ペテンハット',
es='Sombrero mentiroso',
)

View File

@ -835,7 +835,7 @@ Pick_Sal = RogueEventOption(
id=93, id=93,
name='Pick_Sal', name='Pick_Sal',
cn='选择萨里。', cn='选择萨里。',
cht='選擇薩', cht='選擇薩',
en='Pick Sal.', en='Pick Sal.',
jp='サリを選ぶ', jp='サリを選ぶ',
es='Elige a Sal.', es='Elige a Sal.',
@ -862,7 +862,7 @@ Let_Sal_out = RogueEventOption(
id=96, id=96,
name='Let_Sal_out', name='Let_Sal_out',
cn='让萨里出来吧。', cn='让萨里出来吧。',
cht='讓薩出來吧。', cht='讓薩出來吧。',
en='Let Sal out.', en='Let Sal out.',
jp='サリに出てきてもらう', jp='サリに出てきてもらう',
es='Deja salir a Sal.', es='Deja salir a Sal.',
@ -2319,8 +2319,8 @@ You_can_also_smash_the_cup = RogueEventOption(
I_m_voting_for_Oswaldo_Schneider = RogueEventOption( I_m_voting_for_Oswaldo_Schneider = RogueEventOption(
id=258, id=258,
name='I_m_voting_for_Oswaldo_Schneider', name='I_m_voting_for_Oswaldo_Schneider',
cn='我要为「奥瓦尔多·施耐德」的竞选投票!', cn='我要为「奥瓦尔多·施耐德」的竞选投票!',
cht='我要為「奧瓦爾多•施耐德」的競選投票!', cht='我要為「奧瓦爾多•施耐德」的競選投票!',
en='I\'m voting for "Oswaldo Schneider"!', en='I\'m voting for "Oswaldo Schneider"!',
jp='「オスワルド・シュナイダー」に投票する!', jp='「オスワルド・シュナイダー」に投票する!',
es='¡Voto por Oswaldo Schneider!', es='¡Voto por Oswaldo Schneider!',

View File

@ -217,7 +217,7 @@ Saleo_I = RogueEventTitle(
id=22, id=22,
name='Saleo_I', name='Saleo_I',
cn='萨里奥(其一)', cn='萨里奥(其一)',
cht='奧(其一)', cht='奧(其一)',
en='Saleo (I)', en='Saleo (I)',
jp='サリオその1', jp='サリオその1',
es='Saleo (I)', es='Saleo (I)',
@ -227,7 +227,7 @@ Sal_II = RogueEventTitle(
id=23, id=23,
name='Sal_II', name='Sal_II',
cn='萨里(其二)', cn='萨里(其二)',
cht='(其二)', cht='(其二)',
en='Sal (II)', en='Sal (II)',
jp='サリその2', jp='サリその2',
es='Sal (II)', es='Sal (II)',
@ -237,7 +237,7 @@ Leo_III = RogueEventTitle(
id=24, id=24,
name='Leo_III', name='Leo_III',
cn='里奥(其三)', cn='里奥(其三)',
cht='奧(其三)', cht='奧(其三)',
en='Leo (III)', en='Leo (III)',
jp='リオその3', jp='リオその3',
es='Leo (III)', es='Leo (III)',
@ -1119,7 +1119,7 @@ Insights_from_the_Universal_Dancer = RogueEventTitle(
cn='寰宇舞者的启示', cn='寰宇舞者的启示',
cht='寰宇舞者的啟示', cht='寰宇舞者的啟示',
en='Insights from the Universal Dancer', en='Insights from the Universal Dancer',
jp='世界の踊り手の啓示', jp='宇宙の踊り手の啓示',
es='Reflexiones de la bailarina universal', es='Reflexiones de la bailarina universal',
option_ids=[323, 324], option_ids=[323, 324],
) )