def generate_balanced_weights(fname='default_weights.json'): """ Generate a file with even weights for each setting. """ settings_to_randomize = list(get_settings_from_tab('main_tab'))[1:] + \ list(get_settings_from_tab('detailed_tab')) + \ list(get_settings_from_tab('other_tab')) + \ list(get_settings_from_tab('starting_tab')) exclude_from_weights = [ 'bridge_tokens', 'lacs_tokens', 'triforce_goal_per_world', 'disabled_locations', 'allowed_tricks', 'starting_equipment', 'starting_items', 'starting_songs' ] weight_dict = {} for name in settings_to_randomize: if name not in exclude_from_weights: opts = list(get_setting_info(name).choices.keys()) optsdict = {o: 100. / len(opts) for o in opts} weight_dict[name] = optsdict if fname is not None: with open(fname, 'w') as fp: json.dump(weight_dict, fp, indent=4) return weight_dict
def GetSettingJson(setting, web_version, as_array=False): try: setting_info = get_setting_info(setting) except KeyError: if as_array: return {'name': setting} else: return {} if setting_info.gui_text is None: return None settingJson = { 'options': [], 'default': setting_info.default, 'text': setting_info.gui_text, 'tooltip': RemoveTrailingLines('<br>'.join( line.strip() for line in setting_info.gui_tooltip.split('\n'))), 'type': setting_info.gui_type, 'shared': setting_info.shared, } if as_array: settingJson['name'] = setting_info.name else: settingJson['current_value'] = setting_info.default setting_disable = {} if setting_info.disable != None: setting_disable = copy.deepcopy(setting_info.disable) for key, value in setting_info.gui_params.items(): if key.startswith('web:'): if web_version: key = key[4:] else: continue if key.startswith('electron:'): if not web_version: key = key[9:] else: continue if key in setting_keys: settingJson[key] = value if key == 'disable': for option, types in value.items(): for s in types.get('settings', []): if get_setting_info(s).shared: raise ValueError( f'Cannot disable setting {s}. Disabling "shared" settings in the gui_params is forbidden. Use the non gui_param version of disable instead.' ) for section in types.get('sections', []): for s in get_settings_from_section(section): if get_setting_info(s).shared: raise ValueError( f'Cannot disable setting {s} in {section}. Disabling "shared" settings in the gui_params is forbidden. Use the non gui_param version of disable instead.' ) for tab in types.get('tabs', []): for s in get_settings_from_tab(tab): if get_setting_info(s).shared: raise ValueError( f'Cannot disable setting {s} in {tab}. Disabling "shared" settings in the gui_params is forbidden. Use the non gui_param version of disable instead.' ) deep_update(setting_disable, value) if settingJson['type'] in types_with_options: if as_array: settingJson['options'] = [] else: settingJson['options'] = {} tags_list = [] for option_name in setting_info.choice_list: if option_name in settingJson.get('option_remove', []): continue if as_array: optionJson = { 'name': option_name, 'text': setting_info.choices[option_name], } else: optionJson = { 'text': setting_info.choices[option_name], } if option_name in setting_disable: add_disable_option_to_json(setting_disable[option_name], optionJson) option_tooltip = setting_info.gui_params.get('choice_tooltip', {}).get( option_name, None) if option_tooltip != None: optionJson['tooltip'] = RemoveTrailingLines('<br>'.join( line.strip() for line in option_tooltip.split('\n'))) option_filter = setting_info.gui_params.get('filterdata', {}).get( option_name, None) if option_filter != None: optionJson['tags'] = option_filter for tag in option_filter: if tag not in tags_list: tags_list.append(tag) if as_array: settingJson['options'].append(optionJson) else: settingJson['options'][option_name] = optionJson # For disables with '!', add disable settings to all options other than the one marked. for option_name in setting_disable: if isinstance(option_name, str) and option_name[0] == '!': if as_array: for option in settingJson['options']: if option['name'] != option_name[1:]: add_disable_option_to_json( setting_disable[option_name], option) else: for name, option in settingJson['options'].items(): if name != option_name[1:]: add_disable_option_to_json( setting_disable[option_name], option) if tags_list: tags_list.sort() settingJson['tags'] = ['(all)'] + tags_list settingJson['filter_by_tag'] = True return settingJson