ango
5.16 commit
1cc60af
import json
import gradio as gr
from general.consumables import FOODS, POTIONS, WEAPON_ENCHANTS, SNACKS, WINES, SPREADS
from general.gains.formation import FORMATIONS
from gr.components.top import TopComponent
from gr.components.equipments import EquipmentsComponent
from gr.components.talents import TalentsComponent
from gr.components.recipes import RecipesComponent
from gr.components.combat import CombatComponent
from assets.constant import MAX_RECIPES, MAX_EMBED_ATTR, MAX_EMBED_LEVEL
from schools import SUPPORT_SCHOOL
from utils.parser import Parser
from utils.io import serialize, unserialize
def top_script(
top_component: TopComponent, bottom_component: gr.Group,
equipments_component: EquipmentsComponent,
talents_component: TalentsComponent, recipes_component: RecipesComponent,
combat_component: CombatComponent
):
parser = Parser()
def save_json():
result = dict(
records=serialize(parser.records),
file_name=parser.file_name,
start_frame=parser.start_frame,
end_frame=parser.end_frame,
id2name=parser.id2name,
name2id=parser.name2id,
players={player_id: school.id for player_id, school in parser.players.items()},
targets=parser.targets,
select_talents=parser.select_talents,
select_equipments=parser.select_equipments,
)
result = json.dumps(result, ensure_ascii=False)
return result
def upload_log(file_path):
if not file_path:
return [None] * 4
parser(file_path)
players = [parser.id2name[player_id] for player_id in parser.players]
player_select_update = gr.update(choices=players, value=players[0], visible=True)
json_copy_update = gr.update(value=save_json(), visible=True)
return player_select_update, json_copy_update, gr.update(visible=True)
top_component.upload_log.upload(
upload_log, top_component.upload_log,
[top_component.player_select, top_component.copy_json, bottom_component], show_progress="full"
)
# def load_json(file_path):
# if not file_path:
# return [None] * 4
# result = json.load(open(file_path, encoding="utf-8"))
#
# result['records'] = unserialize(result['records'])
# for player_id, school_id in result['players'].items():
# result['players'][player_id] = SUPPORT_SCHOOL[school_id]
# for k, v in result.items():
# setattr(parser, k, v)
#
# json_link = f"/file={save_json()}"
#
# players = [parser.id2name[player_id] for player_id in parser.players]
# player_select_update = gr.update(choices=players, value=players[0], visible=True)
# return player_select_update, gr.update(visible=True), gr.update(visible=True), gr.update(value=json_link)
#
# top_component.upload_json.upload(
# load_json, top_component.upload_json,
# [top_component.player_select, top_component.save_json, bottom_component, top_component.save_json]
# )
def player_select(player_name):
if not player_name:
return {}
player_id = parser.name2id[player_name]
parser.current_player = player_id
school = parser.players[player_id]
top_update = {
top_component.target_select: gr.update(
choices=[""] + [parser.id2name[target_id] for target_id in parser.current_targets], visible=True
),
combat_component.combat_duration: gr.update(value=parser.duration, maximum=parser.duration)
}
# """ Update config """
# config_choices = list(CONFIG.get(school.school, {}))
# config_widget.config_select.set_items(config_choices, default_index=-1)
# """ Update dashboard """
# dashboard_widget.duration.set_value(parser.duration)
""" Update talent options """
for i, talent_component in enumerate(talents_component.values()):
choices = [""] + [school.talent_decoder[talent] for talent in school.talents[i]]
value = school.talent_decoder[parser.select_talents[player_id][i]]
top_update[talent_component] = gr.update(choices=choices, value=value)
""" Update recipe options """
for recipe_component in recipes_component.values():
top_update[recipe_component] = gr.update(choices=[], visible=False)
for i, (skill, recipes) in enumerate(school.recipes.items()):
recipe_component = recipes_component[i]
values = recipes[:min(MAX_RECIPES, len(recipes))]
top_update[recipe_component] = gr.update(choices=recipes, value=values, label=skill, visible=True)
""" Update equipment options """
for label, equipment_component in equipments_component.items():
top_update[equipment_component.equipment] = equipment_update = gr.update()
top_update[equipment_component.enchant] = enchant_update = gr.update()
top_update[equipment_component.strength_level] = strength_level = gr.update()
embed_level_updates = [gr.update(value=MAX_EMBED_LEVEL)] * MAX_EMBED_ATTR
for i, embed_level in enumerate(equipment_component.embed_levels):
top_update[embed_level] = embed_level_updates[i]
equipment_update["choices"] = equipment_choices = [""]
for name, detail in equipment_component.equipment_json.items():
if detail['kind'] not in (school.kind, school.major):
continue
if detail['school'] not in ("精简", "通用", school.school):
continue
equipment_choices.append(name)
if select_equipment := parser.select_equipments[player_id].get(label, {}):
if equipment_name := equipment_component.equipment_mapping.get(select_equipment['equipment']):
equipment_update["value"] = equipment_name
if enchant := equipment_component.enchant_mapping.get(select_equipment['enchant']):
enchant_update["value"] = enchant
strength_level["value"] = select_equipment['strength_level']
for i, embed_level in enumerate(select_equipment['embed_levels']):
embed_level_updates[i] = gr.update(value=embed_level)
return top_update
#
# """ Update consumable options """
# consumables_widget.major_food.set_items([""] + FOODS[school.major], keep_index=True)
# consumables_widget.minor_food.set_items([""] + FOODS[school.kind] + FOODS[""], keep_index=True)
# consumables_widget.major_potion.set_items([""] + POTIONS[school.major], keep_index=True)
# consumables_widget.minor_potion.set_items([""] + POTIONS[school.kind] + POTIONS[""], keep_index=True)
# consumables_widget.weapon_enchant.set_items([""] + WEAPON_ENCHANTS[school.kind], keep_index=True)
# consumables_widget.home_snack.set_items([""] + SNACKS[school.kind] + SNACKS[""], keep_index=True)
# consumables_widget.home_wine.set_items([""] + WINES[school.major] + WINES[""], keep_index=True)
# consumables_widget.spread.set_items([""] + SPREADS[school.major] + SPREADS[school.kind], keep_index=True)
#
# """ Update bonus options """
# bonus_widget.formation.formation.set_items([""] + FORMATIONS[school.kind] + FORMATIONS[""], keep_index=True)
# config_widget.show()
# bottom_widget.show()
top_component.player_select.change(
player_select, top_component.player_select,
sum([[e.equipment, e.enchant, e.strength_level, *e.embed_levels] for e in equipments_component.values()], []) +
talents_component.talents + recipes_component.recipes +
[combat_component.combat_duration] + [top_component.target_select],
)
def target_select(target_name):
target_id = parser.name2id.get(target_name)
parser.current_target = target_id
top_component.target_select.change(
target_select, top_component.target_select
)
return parser