示例#1
0
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
示例#2
0
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