From d3f505669a1fc7f5d7db876554fc45c69ba4e461 Mon Sep 17 00:00:00 2001 From: Michael Burgardt Date: Sun, 28 Nov 2021 00:56:05 +0100 Subject: [PATCH] Add automatic Crowdin synchronization (#284) --- .github/workflows/crowdin_prep.yml | 33 + .github/workflows/crowdin_translate.yml | 46 + intl/.gitignore | 4 + intl/core_option_regex.py | 95 + intl/core_option_translation.py | 620 +++ intl/crowdin.yaml | 13 + intl/crowdin_prep.py | 30 + intl/crowdin_source_upload.py | 93 + intl/crowdin_translate.py | 39 + intl/crowdin_translation_download.py | 93 + intl/download_workflow.py | 16 + intl/initial_sync.py | 125 + intl/upload_workflow.py | 15 + intl/v1_to_v2_converter.py | 459 ++ .../libretro-common/include/libretro.h | 799 ++- yabause/src/libretro/libretro.c | 5 +- yabause/src/libretro/libretro_core_options.h | 541 +- .../src/libretro/libretro_core_options_intl.h | 4485 +++++++++++++++++ 18 files changed, 7226 insertions(+), 285 deletions(-) create mode 100644 .github/workflows/crowdin_prep.yml create mode 100644 .github/workflows/crowdin_translate.yml create mode 100644 intl/.gitignore create mode 100644 intl/core_option_regex.py create mode 100644 intl/core_option_translation.py create mode 100644 intl/crowdin.yaml create mode 100644 intl/crowdin_prep.py create mode 100644 intl/crowdin_source_upload.py create mode 100644 intl/crowdin_translate.py create mode 100644 intl/crowdin_translation_download.py create mode 100644 intl/download_workflow.py create mode 100644 intl/initial_sync.py create mode 100644 intl/upload_workflow.py create mode 100644 intl/v1_to_v2_converter.py create mode 100644 yabause/src/libretro/libretro_core_options_intl.h diff --git a/.github/workflows/crowdin_prep.yml b/.github/workflows/crowdin_prep.yml new file mode 100644 index 000000000..3a1309793 --- /dev/null +++ b/.github/workflows/crowdin_prep.yml @@ -0,0 +1,33 @@ +# Prepare source texts & upload them to Crowdin + +name: Crowdin Source Texts Upload + +# on change to the English texts +on: + push: + branches: + - master + paths: + - 'yabause/src/libretro/libretro_core_options.h' + +jobs: + upload_source_file: + runs-on: ubuntu-latest + steps: + - name: Setup Java JDK + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Setup Python + uses: actions/setup-python@v2 + + - name: Checkout + uses: actions/checkout@v2 + + - name: Upload Source + shell: bash + env: + CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }} + run: | + python3 intl/upload_workflow.py $CROWDIN_API_KEY "yabause" "yabause/src/libretro/libretro_core_options.h" diff --git a/.github/workflows/crowdin_translate.yml b/.github/workflows/crowdin_translate.yml new file mode 100644 index 000000000..5996e57b7 --- /dev/null +++ b/.github/workflows/crowdin_translate.yml @@ -0,0 +1,46 @@ +# Download translations form Crowdin & Recreate libretro_core_options_intl.h + +name: Crowdin Translation Integration + +on: + schedule: + # please choose a random time & weekday to avoid all repos synching at the same time + - cron: '0 20 * * 5' # Fridays at 8:00 PM, UTC + +jobs: + create_intl_file: + runs-on: ubuntu-latest + steps: + - name: Setup Java JDK + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Setup Python + uses: actions/setup-python@v2 + + - name: Checkout + uses: actions/checkout@v2 + with: + persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal access token. + fetch-depth: 0 # otherwise, there would be errors pushing refs to the destination repository. + + - name: Create intl file + shell: bash + env: + CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }} + run: | + python3 intl/download_workflow.py $CROWDIN_API_KEY "yabause" "yabause/src/libretro/libretro_core_options_intl.h" + + - name: Commit files + run: | + git config --local user.email "github-actions@github.com" + git config --local user.name "github-actions[bot]" + git add intl/*_workflow.py "yabause/src/libretro/libretro_core_options_intl.h" + git commit -m "Fetch translations & Recreate libretro_core_options_intl.h" + + - name: GitHub Push + uses: ad-m/github-push-action@v0.6.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: ${{ github.ref }} diff --git a/intl/.gitignore b/intl/.gitignore new file mode 100644 index 000000000..458f3d31a --- /dev/null +++ b/intl/.gitignore @@ -0,0 +1,4 @@ +__pycache__ +crowdin-cli.jar +*.h +*.json diff --git a/intl/core_option_regex.py b/intl/core_option_regex.py new file mode 100644 index 000000000..34a3f20a2 --- /dev/null +++ b/intl/core_option_regex.py @@ -0,0 +1,95 @@ +import re + +# 0: full struct; 1: up to & including first []; 2: content between first {} +p_struct = re.compile(r'(struct\s*[a-zA-Z0-9_\s]+\[])\s*' + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+)\s*)*' + r'=\s*' # = + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+)\s*)*' + r'{((?:.|[\r\n])*?)\{\s*NULL,\s*NULL,\s*NULL\s*(?:.|[\r\n])*?},?(?:.|[\r\n])*?};') # captures full struct, it's beginning and it's content +# 0: type name[]; 1: type; 2: name +p_type_name = re.compile(r'(retro_core_option_[a-zA-Z0-9_]+)\s*' + r'(option_cats([a-z_]{0,8})|option_defs([a-z_]{0,8}))\s*\[]') +# 0: full option; 1: key; 2: description; 3: additional info; 4: key/value pairs +p_option = re.compile(r'{\s*' # opening braces + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'(\".*?\"|' # key start; group 1 + r'[a-zA-Z0-9_]+\s*\((?:.|[\r\n])*?\)|' + r'[a-zA-Z0-9_]+\s*\[(?:.|[\r\n])*?]|' + r'[a-zA-Z0-9_]+\s*\".*?\")\s*' # key end + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r',\s*' # comma + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'(\".*?\")\s*' # description; group 2 + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r',\s*' # comma + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'((?:' # group 3 + r'(?:NULL|\"(?:.|[\r\n])*?\")\s*' # description in category, info, info in category, category + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r',?\s*' # comma + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r')+)' + r'(?:' # defs only start + r'{\s*' # opening braces + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'((?:' # key/value pairs start; group 4 + r'{\s*' # opening braces + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'(?:NULL|\".*?\")\s*' # option key + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r',\s*' # comma + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'(?:NULL|\".*?\")\s*' # option value + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'}\s*' # closing braces + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r',?\s*' # comma + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r')*)' # key/value pairs end + r'}\s*' # closing braces + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r',?\s*' # comma + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'(?:' # defaults start + r'(?:NULL|\".*?\")\s*' # default value + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r',?\s*' # comma + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r')*' # defaults end + r')?' # defs only end + r'},') # closing braces +# analyse option group 3 +p_info = re.compile(r'(NULL|\"(?:.|[\r\n])*?\")\s*' # description in category, info, info in category, category + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r',') +p_info_cat = re.compile(r'(NULL|\"(?:.|[\r\n])*?\")') +# analyse option group 4 +p_key_value = re.compile(r'{\s*' # opening braces + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'(NULL|\".*?\")\s*' # option key; 1 + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r',\s*' # comma + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'(NULL|\".*?\")\s*' # option value; 2 + r'(?:(?:\/\*(?:.|[\r\n])*?\*\/|\/\/.*[\r\n]+|#.*[\r\n]+)\s*)*' + r'}') + +p_masked = re.compile(r'([A-Z_][A-Z0-9_]+)\s*(\"(?:"\s*"|\\\s*|.)*\")') + +p_intl = re.compile(r'(struct retro_core_option_definition \*option_defs_intl\[RETRO_LANGUAGE_LAST]) = {' + r'((?:.|[\r\n])*?)};') +p_set = re.compile(r'static INLINE void libretro_set_core_options\(retro_environment_t environ_cb\)' + r'(?:.|[\r\n])*?};?\s*#ifdef __cplusplus\s*}\s*#endif') + +p_yaml = re.compile(r'"project_id": "[0-9]+".*\s*' + r'"api_token": "([a-zA-Z0-9]+)".*\s*' + r'"base_path": "\./intl".*\s*' + r'"base_url": "https://api\.crowdin\.com".*\s*' + r'"preserve_hierarchy": true.*\s*' + r'"files": \[\s*' + r'\{\s*' + r'"source": "/_us/\*\.json",.*\s*' + r'"translation": "/_%two_letters_code%/%original_file_name%",.*\s*' + r'"skip_untranslated_strings": true.*\s*' + r'},\s*' + r']') diff --git a/intl/core_option_translation.py b/intl/core_option_translation.py new file mode 100644 index 000000000..54a4cf9fb --- /dev/null +++ b/intl/core_option_translation.py @@ -0,0 +1,620 @@ +#!/usr/bin/env python3 + +"""Core options text extractor + +The purpose of this script is to set up & provide functions for automatic generation of 'libretro_core_options_intl.h' +from 'libretro_core_options.h' using translations from Crowdin. + +Both v1 and v2 structs are supported. It is, however, recommended to convert v1 files to v2 using the included +'v1_to_v2_converter.py'. + +Usage: +python3 path/to/core_option_translation.py "path/to/where/libretro_core_options.h & libretro_core_options_intl.h/are" "core_name" + +This script will: +1.) create key words for & extract the texts from libretro_core_options.h & save them into intl/_us/core_options.h +2.) do the same for any present translations in libretro_core_options_intl.h, saving those in their respective folder +""" +import core_option_regex as cor +import re +import os +import sys +import json +import urllib.request as req +import shutil + +# LANG_CODE_TO_R_LANG = {'_ar': 'RETRO_LANGUAGE_ARABIC', +# '_ast': 'RETRO_LANGUAGE_ASTURIAN', +# '_chs': 'RETRO_LANGUAGE_CHINESE_SIMPLIFIED', +# '_cht': 'RETRO_LANGUAGE_CHINESE_TRADITIONAL', +# '_cs': 'RETRO_LANGUAGE_CZECH', +# '_cy': 'RETRO_LANGUAGE_WELSH', +# '_da': 'RETRO_LANGUAGE_DANISH', +# '_de': 'RETRO_LANGUAGE_GERMAN', +# '_el': 'RETRO_LANGUAGE_GREEK', +# '_eo': 'RETRO_LANGUAGE_ESPERANTO', +# '_es': 'RETRO_LANGUAGE_SPANISH', +# '_fa': 'RETRO_LANGUAGE_PERSIAN', +# '_fi': 'RETRO_LANGUAGE_FINNISH', +# '_fr': 'RETRO_LANGUAGE_FRENCH', +# '_gl': 'RETRO_LANGUAGE_GALICIAN', +# '_he': 'RETRO_LANGUAGE_HEBREW', +# '_hu': 'RETRO_LANGUAGE_HUNGARIAN', +# '_id': 'RETRO_LANGUAGE_INDONESIAN', +# '_it': 'RETRO_LANGUAGE_ITALIAN', +# '_ja': 'RETRO_LANGUAGE_JAPANESE', +# '_ko': 'RETRO_LANGUAGE_KOREAN', +# '_nl': 'RETRO_LANGUAGE_DUTCH', +# '_oc': 'RETRO_LANGUAGE_OCCITAN', +# '_pl': 'RETRO_LANGUAGE_POLISH', +# '_pt_br': 'RETRO_LANGUAGE_PORTUGUESE_BRAZIL', +# '_pt_pt': 'RETRO_LANGUAGE_PORTUGUESE_PORTUGAL', +# '_ru': 'RETRO_LANGUAGE_RUSSIAN', +# '_sk': 'RETRO_LANGUAGE_SLOVAK', +# '_sv': 'RETRO_LANGUAGE_SWEDISH', +# '_tr': 'RETRO_LANGUAGE_TURKISH', +# '_uk': 'RETRO_LANGUAGE_UKRAINIAN', +# '_us': 'RETRO_LANGUAGE_ENGLISH', +# '_vn': 'RETRO_LANGUAGE_VIETNAMESE'} + +# these are handled by RetroArch directly - no need to include them in core translations +ON_OFFS = {'"enabled"', '"disabled"', '"true"', '"false"', '"on"', '"off"'} + + +def remove_special_chars(text: str, char_set=0, allow_non_ascii=False) -> str: + """Removes special characters from a text. + + :param text: String to be cleaned. + :param char_set: 0 -> remove all ASCII special chars except for '_' & 'space' (default) + 1 -> remove invalid chars from file names + :param allow_non_ascii: False -> all non-ascii characters will be removed (default) + True -> non-ascii characters will be passed through + :return: Clean text. + """ + command_chars = [chr(unicode) for unicode in tuple(range(0, 32)) + (127,)] + special_chars = ([chr(unicode) for unicode in tuple(range(33, 48)) + tuple(range(58, 65)) + tuple(range(91, 95)) + + (96,) + tuple(range(123, 127))], + ('\\', '/', ':', '*', '?', '"', '<', '>', '|', '#', '%', + '&', '{', '}', '$', '!', '¸', "'", '@', '+', '=')) + res = text if allow_non_ascii \ + else text.encode('ascii', errors='ignore').decode('unicode-escape') + + for cm in command_chars: + res = res.replace(cm, '_') + for sp in special_chars[char_set]: + res = res.replace(sp, '_') + while res.startswith('_'): + res = res[1:] + while res.endswith('_'): + res = res[:-1] + return res + + +def clean_file_name(file_name: str) -> str: + """Removes characters which might make file_name inappropriate for files on some OS. + + :param file_name: File name to be cleaned. + :return: The clean file name. + """ + file_name = remove_special_chars(file_name, 1) + file_name = re.sub(r'__+', '_', file_name.replace(' ', '_')) + return file_name + + +def get_struct_type_name(decl: str) -> tuple: + """ Returns relevant parts of the struct declaration: + type, name of the struct and the language appendix, if present. + :param decl: The struct declaration matched by cor.p_type_name. + :return: Tuple, e.g.: ('retro_core_option_definition', 'option_defs_us', '_us') + """ + struct_match = cor.p_type_name.search(decl) + if struct_match: + if struct_match.group(3): + struct_type_name = struct_match.group(1, 2, 3) + return struct_type_name + elif struct_match.group(4): + struct_type_name = struct_match.group(1, 2, 4) + return struct_type_name + else: + struct_type_name = struct_match.group(1, 2) + return struct_type_name + else: + raise ValueError(f'No or incomplete struct declaration: {decl}!\n' + 'Please make sure all structs are complete, including the type and name declaration.') + + +def is_viable_non_dupe(text: str, comparison) -> bool: + """text must be longer than 2 ('""'), not 'NULL' and not in comparison. + + :param text: String to be tested. + :param comparison: Dictionary or set to search for text in. + :return: bool + """ + return 2 < len(text) and text != 'NULL' and text not in comparison + + +def is_viable_value(text: str) -> bool: + """text must be longer than 2 ('""'), not 'NULL' and text.lower() not in + {'"enabled"', '"disabled"', '"true"', '"false"', '"on"', '"off"'}. + + :param text: String to be tested. + :return: bool + """ + return 2 < len(text) and text != 'NULL' and text.lower() not in ON_OFFS + + +def create_non_dupe(base_name: str, opt_num: int, comparison) -> str: + """Makes sure base_name is not in comparison, and if it is it's renamed. + + :param base_name: Name to check/make unique. + :param opt_num: Number of the option base_name belongs to, used in making it unique. + :param comparison: Dictionary or set to search for base_name in. + :return: Unique name. + """ + h = base_name + if h in comparison: + n = 0 + h = h + '_O' + str(opt_num) + h_end = len(h) + while h in comparison: + h = h[:h_end] + '_' + str(n) + n += 1 + return h + + +def get_texts(text: str) -> dict: + """Extracts the strings, which are to be translated/are the translations, + from text and creates macro names for them. + + :param text: The string to be parsed. + :return: Dictionary of the form { '_': { 'macro': 'string', ... }, ... }. + """ + # all structs: group(0) full struct, group(1) beginning, group(2) content + structs = cor.p_struct.finditer(text) + hash_n_string = {} + just_string = {} + for struct in structs: + struct_declaration = struct.group(1) + struct_type_name = get_struct_type_name(struct_declaration) + if 3 > len(struct_type_name): + lang = '_us' + else: + lang = struct_type_name[2] + if lang not in just_string: + hash_n_string[lang] = {} + just_string[lang] = set() + + is_v2 = False + pre_name = '' + p = cor.p_info + if 'retro_core_option_v2_definition' == struct_type_name[0]: + is_v2 = True + elif 'retro_core_option_v2_category' == struct_type_name[0]: + pre_name = 'CATEGORY_' + p = cor.p_info_cat + + struct_content = struct.group(2) + # 0: full option; 1: key; 2: description; 3: additional info; 4: key/value pairs + struct_options = cor.p_option.finditer(struct_content) + for opt, option in enumerate(struct_options): + # group 1: key + if option.group(1): + opt_name = pre_name + option.group(1) + # no special chars allowed in key + opt_name = remove_special_chars(opt_name).upper().replace(' ', '_') + else: + raise ValueError(f'No option name (key) found in struct {struct_type_name[1]} option {opt}!') + + # group 2: description0 + if option.group(2): + desc0 = option.group(2) + if is_viable_non_dupe(desc0, just_string[lang]): + just_string[lang].add(desc0) + m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_LABEL'), opt, hash_n_string[lang]) + hash_n_string[lang][m_h] = desc0 + else: + raise ValueError(f'No label found in struct {struct_type_name[1]} option {option.group(1)}!') + + # group 3: desc1, info0, info1, category + if option.group(3): + infos = option.group(3) + option_info = p.finditer(infos) + if is_v2: + desc1 = next(option_info).group(1) + if is_viable_non_dupe(desc1, just_string[lang]): + just_string[lang].add(desc1) + m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_LABEL_CAT'), opt, hash_n_string[lang]) + hash_n_string[lang][m_h] = desc1 + last = None + m_h = None + for j, info in enumerate(option_info): + last = info.group(1) + if is_viable_non_dupe(last, just_string[lang]): + just_string[lang].add(last) + m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_INFO_{j}'), opt, + hash_n_string[lang]) + hash_n_string[lang][m_h] = last + if last in just_string[lang]: # category key should not be translated + hash_n_string[lang].pop(m_h) + just_string[lang].remove(last) + else: + for j, info in enumerate(option_info): + gr1 = info.group(1) + if is_viable_non_dupe(gr1, just_string[lang]): + just_string[lang].add(gr1) + m_h = create_non_dupe(re.sub(r'__+', '_', f'{opt_name}_INFO_{j}'), opt, + hash_n_string[lang]) + hash_n_string[lang][m_h] = gr1 + else: + raise ValueError(f'Too few arguments in struct {struct_type_name[1]} option {option.group(1)}!') + + # group 4: + if option.group(4): + for j, kv_set in enumerate(cor.p_key_value.finditer(option.group(4))): + set_key, set_value = kv_set.group(1, 2) + if not is_viable_value(set_value): + if not is_viable_value(set_key): + continue + set_value = set_key + # re.fullmatch(r'(?:[+-][0-9]+)+', value[1:-1]) + if set_value not in just_string[lang] and not re.sub(r'[+-]', '', set_value[1:-1]).isdigit(): + clean_key = set_key[1:-1] + clean_key = remove_special_chars(clean_key).upper().replace(' ', '_') + m_h = create_non_dupe(re.sub(r'__+', '_', f"OPTION_VAL_{clean_key}"), opt, hash_n_string[lang]) + hash_n_string[lang][m_h] = set_value + just_string[lang].add(set_value) + return hash_n_string + + +def create_msg_hash(intl_dir_path: str, core_name: str, keyword_string_dict: dict) -> dict: + """Creates '.h' files in 'intl/_/' containing the macro name & string combinations. + + :param intl_dir_path: Path to the intl directory. + :param core_name: Name of the core, used for the files' paths. + :param keyword_string_dict: Dictionary of the form { '_': { 'macro': 'string', ... }, ... }. + :return: Dictionary of the form { '_': 'path/to/file (./intl/_/.h)', ... }. + """ + files = {} + for localisation in keyword_string_dict: + path = os.path.join(intl_dir_path, core_name) # intl// + files[localisation] = os.path.join(path, localisation + '.h') # intl//_.h + if not os.path.exists(path): + os.makedirs(path) + with open(files[localisation], 'w', encoding='utf-8') as crowdin_file: + out_text = '' + for keyword in keyword_string_dict[localisation]: + out_text = f'{out_text}{keyword} {keyword_string_dict[localisation][keyword]}\n' + crowdin_file.write(out_text) + return files + + +def h2json(file_paths: dict) -> dict: + """Converts .h files pointed to by file_paths into .jsons. + + :param file_paths: Dictionary of the form { '_': 'path/to/file (./intl/_/.h)', ... }. + :return: Dictionary of the form { '_': 'path/to/file (./intl/_/.json)', ... }. + """ + jsons = {} + for file_lang in file_paths: + if not os.path.isfile(file_paths[file_lang]): + continue + + jsons[file_lang] = file_paths[file_lang][:-2] + '.json' + + p = cor.p_masked + + with open(file_paths[file_lang], 'r+', encoding='utf-8') as h_file: + text = h_file.read() + result = p.finditer(text) + messages = {} + for msg in result: + key, val = msg.group(1, 2) + if key not in messages: + if key and val: + # unescape & remove "\n" + messages[key] = re.sub(r'"\s*(?:(?:/\*(?:.|[\r\n])*?\*/|//.*[\r\n]+)\s*)*"', + '\\\n', val[1:-1].replace('\\\"', '"')) + else: + print(f"DUPLICATE KEY in {file_paths[file_lang]}: {key}") + with open(jsons[file_lang], 'w', encoding='utf-8') as json_file: + json.dump(messages, json_file, indent=2) + + return jsons + + +def json2h(intl_dir_path: str, file_list) -> None: + """Converts .json file in json_file_path into an .h ready to be included in C code. + + :param intl_dir_path: Path to the intl/ directory. + :param file_list: Iterator of os.DirEntry objects. Contains localisation files to convert. + :return: None + """ + + p = cor.p_masked + + def update(s_messages, s_template, s_source_messages, file_name): + translation = '' + template_messages = p.finditer(s_template) + for tp_msg in template_messages: + old_key = tp_msg.group(1) + if old_key in s_messages and s_messages[old_key] != s_source_messages[old_key]: + tl_msg_val = s_messages[old_key] + tl_msg_val = tl_msg_val.replace('"', '\\\"').replace('\n', '') # escape + translation = ''.join((translation, '#define ', old_key, file_name.upper(), f' "{tl_msg_val}"\n')) + + else: # Remove English duplicates and non-translatable strings + translation = ''.join((translation, '#define ', old_key, file_name.upper(), ' NULL\n')) + return translation + + us_h = os.path.join(intl_dir_path, '_us.h') + us_json = os.path.join(intl_dir_path, '_us.json') + + with open(us_h, 'r', encoding='utf-8') as template_file: + template = template_file.read() + with open(us_json, 'r+', encoding='utf-8') as source_json_file: + source_messages = json.load(source_json_file) + + for file in file_list: + if file.name.lower().startswith('_us') \ + or file.name.lower().endswith('.h') \ + or file.is_dir(): + continue + + with open(file.path, 'r+', encoding='utf-8') as json_file: + messages = json.load(json_file) + new_translation = update(messages, template, source_messages, os.path.splitext(file.name)[0]) + with open(os.path.splitext(file.path)[0] + '.h', 'w', encoding='utf-8') as h_file: + h_file.seek(0) + h_file.write(new_translation) + h_file.truncate() + return + + +def get_crowdin_client(dir_path: str) -> str: + """Makes sure the Crowdin CLI client is present. If it isn't, it is fetched & extracted. + + :return: The path to 'crowdin-cli.jar'. + """ + jar_name = 'crowdin-cli.jar' + jar_path = os.path.join(dir_path, jar_name) + + if not os.path.isfile(jar_path): + print('Downloading crowdin-cli.jar') + crowdin_cli_file = os.path.join(dir_path, 'crowdin-cli.zip') + crowdin_cli_url = 'https://downloads.crowdin.com/cli/v3/crowdin-cli.zip' + req.urlretrieve(crowdin_cli_url, crowdin_cli_file) + import zipfile + with zipfile.ZipFile(crowdin_cli_file, 'r') as zip_ref: + jar_dir = zip_ref.namelist()[0] + for file in zip_ref.namelist(): + if file.endswith(jar_name): + jar_file = file + break + zip_ref.extract(jar_file) + os.rename(jar_file, jar_path) + os.remove(crowdin_cli_file) + shutil.rmtree(jar_dir) + return jar_path + + +def create_intl_file(localisation_file_path: str, intl_dir_path: str, text: str, file_path: str) -> None: + """Creates 'libretro_core_options_intl.h' from Crowdin translations. + + :param localisation_file_path: Path to 'libretro_core_options_intl.h' + :param intl_dir_path: Path to the intl/ directory. + :param text: Content of the 'libretro_core_options.h' being translated. + :param file_path: Path to the '_us.h' file, containing the original English texts. + :return: None + """ + msg_dict = {} + lang_up = '' + + def replace_pair(pair_match): + """Replaces a key-value-pair of an option with the macros corresponding to the language. + + :param pair_match: The re match object representing the key-value-pair block. + :return: Replacement string. + """ + offset = pair_match.start(0) + if pair_match.group(1): # key + if pair_match.group(2) in msg_dict: # value + val = msg_dict[pair_match.group(2)] + lang_up + elif pair_match.group(1) in msg_dict: # use key if value not viable (e.g. NULL) + val = msg_dict[pair_match.group(1)] + lang_up + else: + return pair_match.group(0) + else: + return pair_match.group(0) + res = pair_match.group(0)[:pair_match.start(2) - offset] + val \ + + pair_match.group(0)[pair_match.end(2) - offset:] + return res + + def replace_info(info_match): + """Replaces the 'additional strings' of an option with the macros corresponding to the language. + + :param info_match: The re match object representing the 'additional strings' block. + :return: Replacement string. + """ + offset = info_match.start(0) + if info_match.group(1) in msg_dict: + res = info_match.group(0)[:info_match.start(1) - offset] + \ + msg_dict[info_match.group(1)] + lang_up + \ + info_match.group(0)[info_match.end(1) - offset:] + return res + else: + return info_match.group(0) + + def replace_option(option_match): + """Replaces strings within an option + '{ "opt_key", "label", "additional strings", ..., { {"key", "value"}, ... }, ... }' + within a struct with the macros corresponding to the language: + '{ "opt_key", MACRO_LABEL, MACRO_STRINGS, ..., { {"key", MACRO_VALUE}, ... }, ... }' + + :param option_match: The re match object representing the option. + :return: Replacement string. + """ + # label + offset = option_match.start(0) + if option_match.group(2): + res = option_match.group(0)[:option_match.start(2) - offset] + msg_dict[option_match.group(2)] + lang_up + else: + return option_match.group(0) + # additional block + if option_match.group(3): + res = res + option_match.group(0)[option_match.end(2) - offset:option_match.start(3) - offset] + new_info = p.sub(replace_info, option_match.group(3)) + res = res + new_info + else: + return res + option_match.group(0)[option_match.end(2) - offset:] + # key-value-pairs + if option_match.group(4): + res = res + option_match.group(0)[option_match.end(3) - offset:option_match.start(4) - offset] + new_pairs = cor.p_key_value.sub(replace_pair, option_match.group(4)) + res = res + new_pairs + option_match.group(0)[option_match.end(4) - offset:] + else: + res = res + option_match.group(0)[option_match.end(3) - offset:] + + return res + + # ------------------------------------------------------------------------------------ + + with open(file_path, 'r+', encoding='utf-8') as template: # intl//_us.h + masked_msgs = cor.p_masked.finditer(template.read()) + + for msg in masked_msgs: + msg_dict[msg.group(2)] = msg.group(1) + + # top of the file - in case there is no file to copy it from + out_txt = "#ifndef LIBRETRO_CORE_OPTIONS_INTL_H__\n" \ + "#define LIBRETRO_CORE_OPTIONS_INTL_H__\n\n" \ + "#if defined(_MSC_VER) && (_MSC_VER >= 1500 && _MSC_VER < 1900)\n" \ + "/* https://support.microsoft.com/en-us/kb/980263 */\n" \ + '#pragma execution_character_set("utf-8")\n' \ + "#pragma warning(disable:4566)\n" \ + "#endif\n\n" \ + "#include \n\n" \ + '#ifdef __cplusplus\n' \ + 'extern "C" {\n' \ + '#endif\n' + + if os.path.isfile(localisation_file_path): + # copy top of the file for re-use + with open(localisation_file_path, 'r', encoding='utf-8') as intl: # libretro_core_options_intl.h + in_text = intl.read() + intl_start = re.search(re.escape('/*\n' + ' ********************************\n' + ' * Core Option Definitions\n' + ' ********************************\n' + '*/\n'), in_text) + if intl_start: + out_txt = in_text[:intl_start.end(0)] + else: + intl_start = re.search(re.escape('#ifdef __cplusplus\n' + 'extern "C" {\n' + '#endif\n'), in_text) + if intl_start: + out_txt = in_text[:intl_start.end(0)] + + # only write to file, if there is anything worthwhile to write! + overwrite = False + + # iterate through localisation files + files = {} + for file in os.scandir(intl_dir_path): + files[file.name] = {'is_file': file.is_file(), 'path': file.path} + for file in sorted(files): # intl//_* + if files[file]['is_file'] \ + and file.startswith('_') \ + and file.endswith('.h') \ + and not file.startswith('_us'): + translation_path = files[file]['path'] # _.h + # all structs: group(0) full struct, group(1) beginning, group(2) content + struct_groups = cor.p_struct.finditer(text) + lang_low = os.path.splitext(file)[0].lower() + lang_up = lang_low.upper() + out_txt = out_txt + f'/* RETRO_LANGUAGE{lang_up} */\n\n' # /* RETRO_LANGUAGE_NM */ + + # copy adjusted translations (makros) + with open(translation_path, 'r+', encoding='utf-8') as f_in: # .h + out_txt = out_txt + f_in.read() + '\n' + # replace English texts with makros + for construct in struct_groups: + declaration = construct.group(1) + struct_type_name = get_struct_type_name(declaration) + if 3 > len(struct_type_name): # no language specifier + new_decl = re.sub(re.escape(struct_type_name[1]), struct_type_name[1] + lang_low, declaration) + else: + new_decl = re.sub(re.escape(struct_type_name[2]), lang_low, declaration) + if '_us' != struct_type_name[2]: + continue + + p = cor.p_info + if 'retro_core_option_v2_category' == struct_type_name[0]: + p = cor.p_info_cat + offset_construct = construct.start(0) + start = construct.end(1) - offset_construct + end = construct.start(2) - offset_construct + out_txt = out_txt + new_decl + construct.group(0)[start:end] + + content = construct.group(2) + new_content = cor.p_option.sub(replace_option, content) + + start = construct.end(2) - offset_construct + out_txt = out_txt + new_content + construct.group(0)[start:] + '\n' + + # for v2 + if 'retro_core_option_v2_definition' == struct_type_name[0]: + out_txt = out_txt + f'struct retro_core_options_v2 options{lang_low}' \ + ' = {\n' \ + f' option_cats{lang_low},\n' \ + f' option_defs{lang_low}\n' \ + '};\n\n' + # if it got this far, we've got something to write + overwrite = True + + # only write to file, if there is anything worthwhile to write! + if overwrite: + with open(localisation_file_path, 'w', encoding='utf-8') as intl: + intl.write(out_txt + '\n#ifdef __cplusplus\n' + '}\n#endif\n' + '\n#endif') + return + + +# -------------------- MAIN -------------------- # + +if __name__ == '__main__': + try: + if os.path.isfile(sys.argv[1]): + _temp = os.path.dirname(sys.argv[1]) + else: + _temp = sys.argv[1] + while _temp.endswith('/') or _temp.endswith('\\'): + _temp = _temp[:-1] + TARGET_DIR_PATH = _temp + except IndexError: + TARGET_DIR_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + print("No path provided, assuming parent directory:\n" + TARGET_DIR_PATH) + + CORE_NAME = clean_file_name(sys.argv[2]) + + DIR_PATH = os.path.dirname(os.path.realpath(__file__)) + H_FILE_PATH = os.path.join(TARGET_DIR_PATH, 'libretro_core_options.h') + INTL_FILE_PATH = os.path.join(TARGET_DIR_PATH, 'libretro_core_options_intl.h') + + print('Getting texts from libretro_core_options.h') + with open(H_FILE_PATH, 'r+', encoding='utf-8') as _h_file: + _main_text = _h_file.read() + _hash_n_str = get_texts(_main_text) + _files = create_msg_hash(DIR_PATH, CORE_NAME, _hash_n_str) + _source_jsons = h2json(_files) + + print('Getting texts from libretro_core_options_intl.h') + if os.path.isfile(INTL_FILE_PATH): + with open(INTL_FILE_PATH, 'r+', encoding='utf-8') as _intl_file: + _intl_text = _intl_file.read() + _hash_n_str_intl = get_texts(_intl_text) + _intl_files = create_msg_hash(DIR_PATH, CORE_NAME, _hash_n_str_intl) + _intl_jsons = h2json(_intl_files) + + print('\nAll done!') diff --git a/intl/crowdin.yaml b/intl/crowdin.yaml new file mode 100644 index 000000000..c81de7757 --- /dev/null +++ b/intl/crowdin.yaml @@ -0,0 +1,13 @@ +"project_id": "380544" +"api_token": "_secret_" +"base_url": "https://api.crowdin.com" +"preserve_hierarchy": true + +"files": + [ + { + "source": "/intl/_core_name_/_us.json", + "dest": "/_core_name_/_core_name_.json", + "translation": "/intl/_core_name_/_%two_letters_code%.json", + }, + ] diff --git a/intl/crowdin_prep.py b/intl/crowdin_prep.py new file mode 100644 index 000000000..bfc9aa907 --- /dev/null +++ b/intl/crowdin_prep.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +import core_option_translation as t + +if __name__ == '__main__': + try: + if t.os.path.isfile(t.sys.argv[1]): + _temp = t.os.path.dirname(t.sys.argv[1]) + else: + _temp = t.sys.argv[1] + while _temp.endswith('/') or _temp.endswith('\\'): + _temp = _temp[:-1] + TARGET_DIR_PATH = _temp + except IndexError: + TARGET_DIR_PATH = t.os.path.dirname(t.os.path.dirname(t.os.path.realpath(__file__))) + print("No path provided, assuming parent directory:\n" + TARGET_DIR_PATH) + + CORE_NAME = t.clean_file_name(t.sys.argv[2]) + DIR_PATH = t.os.path.dirname(t.os.path.realpath(__file__)) + H_FILE_PATH = t.os.path.join(TARGET_DIR_PATH, 'libretro_core_options.h') + + print('Getting texts from libretro_core_options.h') + with open(H_FILE_PATH, 'r+', encoding='utf-8') as _h_file: + _main_text = _h_file.read() + _hash_n_str = t.get_texts(_main_text) + _files = t.create_msg_hash(DIR_PATH, CORE_NAME, _hash_n_str) + + _source_jsons = t.h2json(_files) + + print('\nAll done!') diff --git a/intl/crowdin_source_upload.py b/intl/crowdin_source_upload.py new file mode 100644 index 000000000..52fb770f0 --- /dev/null +++ b/intl/crowdin_source_upload.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +import re +import os +import shutil +import subprocess +import sys +import urllib.request +import zipfile +import core_option_translation as t + +# -------------------- MAIN -------------------- # + +if __name__ == '__main__': + # Check Crowdin API Token and core name + try: + API_KEY = sys.argv[1] + CORE_NAME = t.clean_file_name(sys.argv[2]) + except IndexError as e: + print('Please provide Crowdin API Token and core name!') + raise e + + DIR_PATH = t.os.path.dirname(t.os.path.realpath(__file__)) + YAML_PATH = t.os.path.join(DIR_PATH, 'crowdin.yaml') + + # Apply Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": "_secret_"', + f'"api_token": "{API_KEY}"', + crowdin_config, 1) + crowdin_config = re.sub(r'/_core_name_', + f'/{CORE_NAME}' + , crowdin_config) + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + try: + # Download Crowdin CLI + jar_name = 'crowdin-cli.jar' + jar_path = t.os.path.join(DIR_PATH, jar_name) + crowdin_cli_file = 'crowdin-cli.zip' + crowdin_cli_url = 'https://downloads.crowdin.com/cli/v3/' + crowdin_cli_file + crowdin_cli_path = t.os.path.join(DIR_PATH, crowdin_cli_file) + + if not os.path.isfile(t.os.path.join(DIR_PATH, jar_name)): + print('download crowdin-cli.jar') + urllib.request.urlretrieve(crowdin_cli_url, crowdin_cli_path) + with zipfile.ZipFile(crowdin_cli_path, 'r') as zip_ref: + jar_dir = t.os.path.join(DIR_PATH, zip_ref.namelist()[0]) + for file in zip_ref.namelist(): + if file.endswith(jar_name): + jar_file = file + break + zip_ref.extract(jar_file, path=DIR_PATH) + os.rename(t.os.path.join(DIR_PATH, jar_file), jar_path) + os.remove(crowdin_cli_path) + shutil.rmtree(jar_dir) + + print('upload source *.json') + subprocess.run(['java', '-jar', jar_path, 'upload', 'sources', '--config', YAML_PATH]) + + # Reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', + '"api_token": "_secret_"', + crowdin_config, 1) + + # TODO this is NOT safe! + crowdin_config = re.sub(re.escape(f'/{CORE_NAME}'), + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + except Exception as e: + # Try really hard to reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', + '"api_token": "_secret_"', + crowdin_config, 1) + + # TODO this is NOT safe! + crowdin_config = re.sub(re.escape(f'/{CORE_NAME}'), + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + raise e diff --git a/intl/crowdin_translate.py b/intl/crowdin_translate.py new file mode 100644 index 000000000..8a6660233 --- /dev/null +++ b/intl/crowdin_translate.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +import core_option_translation as t + +if __name__ == '__main__': + try: + if t.os.path.isfile(t.sys.argv[1]): + _temp = t.os.path.dirname(t.sys.argv[1]) + else: + _temp = t.sys.argv[1] + while _temp.endswith('/') or _temp.endswith('\\'): + _temp = _temp[:-1] + TARGET_DIR_PATH = _temp + except IndexError: + TARGET_DIR_PATH = t.os.path.dirname(t.os.path.dirname(t.os.path.realpath(__file__))) + print("No path provided, assuming parent directory:\n" + TARGET_DIR_PATH) + + CORE_NAME = t.clean_file_name(t.sys.argv[2]) + DIR_PATH = t.os.path.dirname(t.os.path.realpath(__file__)) + LOCALISATIONS_PATH = t.os.path.join(DIR_PATH, CORE_NAME) + US_FILE_PATH = t.os.path.join(LOCALISATIONS_PATH, '_us.h') + H_FILE_PATH = t.os.path.join(TARGET_DIR_PATH, 'libretro_core_options.h') + INTL_FILE_PATH = t.os.path.join(TARGET_DIR_PATH, 'libretro_core_options_intl.h') + + print('Getting texts from libretro_core_options.h') + with open(H_FILE_PATH, 'r+', encoding='utf-8') as _h_file: + _main_text = _h_file.read() + _hash_n_str = t.get_texts(_main_text) + _files = t.create_msg_hash(DIR_PATH, CORE_NAME, _hash_n_str) + _source_jsons = t.h2json(_files) + + print('Converting translations *.json to *.h:') + localisation_files = t.os.scandir(LOCALISATIONS_PATH) + t.json2h(LOCALISATIONS_PATH, localisation_files) + + print('Constructing libretro_core_options_intl.h') + t.create_intl_file(INTL_FILE_PATH, LOCALISATIONS_PATH, _main_text, _files["_us"]) + + print('\nAll done!') diff --git a/intl/crowdin_translation_download.py b/intl/crowdin_translation_download.py new file mode 100644 index 000000000..d3e7027ff --- /dev/null +++ b/intl/crowdin_translation_download.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +import re +import os +import shutil +import subprocess +import sys +import urllib.request +import zipfile +import core_option_translation as t + +# -------------------- MAIN -------------------- # + +if __name__ == '__main__': + # Check Crowdin API Token and core name + try: + API_KEY = sys.argv[1] + CORE_NAME = t.clean_file_name(sys.argv[2]) + except IndexError as e: + print('Please provide Crowdin API Token and core name!') + raise e + + DIR_PATH = t.os.path.dirname(t.os.path.realpath(__file__)) + YAML_PATH = t.os.path.join(DIR_PATH, 'crowdin.yaml') + + # Apply Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": "_secret_"', + f'"api_token": "{API_KEY}"', + crowdin_config, 1) + crowdin_config = re.sub(r'/_core_name_', + f'/{CORE_NAME}' + , crowdin_config) + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + try: + # Download Crowdin CLI + jar_name = 'crowdin-cli.jar' + jar_path = t.os.path.join(DIR_PATH, jar_name) + crowdin_cli_file = 'crowdin-cli.zip' + crowdin_cli_url = 'https://downloads.crowdin.com/cli/v3/' + crowdin_cli_file + crowdin_cli_path = t.os.path.join(DIR_PATH, crowdin_cli_file) + + if not os.path.isfile(t.os.path.join(DIR_PATH, jar_name)): + print('download crowdin-cli.jar') + urllib.request.urlretrieve(crowdin_cli_url, crowdin_cli_path) + with zipfile.ZipFile(crowdin_cli_path, 'r') as zip_ref: + jar_dir = t.os.path.join(DIR_PATH, zip_ref.namelist()[0]) + for file in zip_ref.namelist(): + if file.endswith(jar_name): + jar_file = file + break + zip_ref.extract(jar_file, path=DIR_PATH) + os.rename(t.os.path.join(DIR_PATH, jar_file), jar_path) + os.remove(crowdin_cli_path) + shutil.rmtree(jar_dir) + + print('download translation *.json') + subprocess.run(['java', '-jar', jar_path, 'download', '--config', YAML_PATH]) + + # Reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', + '"api_token": "_secret_"', + crowdin_config, 1) + + # TODO this is NOT safe! + crowdin_config = re.sub(re.escape(f'/{CORE_NAME}'), + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + except Exception as e: + # Try really hard to reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', + '"api_token": "_secret_"', + crowdin_config, 1) + + # TODO this is NOT safe! + crowdin_config = re.sub(re.escape(f'/{CORE_NAME}'), + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + raise e diff --git a/intl/download_workflow.py b/intl/download_workflow.py new file mode 100644 index 000000000..5ce74dda9 --- /dev/null +++ b/intl/download_workflow.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +import sys +import subprocess + +try: + api_key = sys.argv[1] + core_name = sys.argv[2] + dir_path = sys.argv[3] +except IndexError as e: + print('Please provide path to libretro_core_options.h, Crowdin API Token and core name!') + raise e + +subprocess.run(['python3', 'intl/crowdin_prep.py', dir_path, core_name]) +subprocess.run(['python3', 'intl/crowdin_translation_download.py', api_key, core_name]) +subprocess.run(['python3', 'intl/crowdin_translate.py', dir_path, core_name]) diff --git a/intl/initial_sync.py b/intl/initial_sync.py new file mode 100644 index 000000000..6837c7d00 --- /dev/null +++ b/intl/initial_sync.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3 + +import re +import os +import shutil +import subprocess +import sys +import time +import urllib.request +import zipfile +import core_option_translation as t + +# -------------------- MAIN -------------------- # + +if __name__ == '__main__': + # Check Crowdin API Token and core name + try: + API_KEY = sys.argv[1] + CORE_NAME = t.clean_file_name(sys.argv[2]) + except IndexError as e: + print('Please provide Crowdin API Token and core name!') + raise e + + DIR_PATH = t.os.path.dirname(t.os.path.realpath(__file__)) + YAML_PATH = t.os.path.join(DIR_PATH, 'crowdin.yaml') + + # Apply Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": "_secret_"', + f'"api_token": "{API_KEY}"', + crowdin_config, 1) + crowdin_config = re.sub(r'/_core_name_', + f'/{CORE_NAME}' + , crowdin_config) + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + try: + # Download Crowdin CLI + jar_name = 'crowdin-cli.jar' + jar_path = t.os.path.join(DIR_PATH, jar_name) + crowdin_cli_file = 'crowdin-cli.zip' + crowdin_cli_url = 'https://downloads.crowdin.com/cli/v3/' + crowdin_cli_file + crowdin_cli_path = t.os.path.join(DIR_PATH, crowdin_cli_file) + + if not os.path.isfile(t.os.path.join(DIR_PATH, jar_name)): + print('download crowdin-cli.jar') + urllib.request.urlretrieve(crowdin_cli_url, crowdin_cli_path) + with zipfile.ZipFile(crowdin_cli_path, 'r') as zip_ref: + jar_dir = t.os.path.join(DIR_PATH, zip_ref.namelist()[0]) + for file in zip_ref.namelist(): + if file.endswith(jar_name): + jar_file = file + break + zip_ref.extract(jar_file, path=DIR_PATH) + os.rename(t.os.path.join(DIR_PATH, jar_file), jar_path) + os.remove(crowdin_cli_path) + shutil.rmtree(jar_dir) + + print('upload source & translations *.json') + subprocess.run(['java', '-jar', jar_path, 'upload', 'sources', '--config', YAML_PATH]) + subprocess.run(['java', '-jar', jar_path, 'upload', 'translations', '--config', YAML_PATH]) + + print('wait for crowdin server to process data') + time.sleep(10) + + print('download translation *.json') + subprocess.run(['java', '-jar', jar_path, 'download', '--config', YAML_PATH]) + + # Reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', '"api_token": "_secret_"', crowdin_config, 1) + + # TODO this is NOT safe! + crowdin_config = re.sub(re.escape(f'/{CORE_NAME}'), + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + + with open('intl/upload_workflow.py', 'r') as workflow: + workflow_config = workflow.read() + workflow_config = workflow_config.replace( + "subprocess.run(['python3', 'intl/core_option_translation.py', dir_path, core_name])", + "subprocess.run(['python3', 'intl/crowdin_prep.py', dir_path, core_name])" + ) + workflow_config = workflow_config.replace( + "subprocess.run(['python3', 'intl/initial_sync.py', api_key, core_name])", + "subprocess.run(['python3', 'intl/crowdin_source_upload.py', api_key, core_name])" + ) + with open('intl/upload_workflow.py', 'w') as workflow: + workflow.write(workflow_config) + + with open('intl/download_workflow.py', 'r') as workflow: + workflow_config = workflow.read() + workflow_config = workflow_config.replace( + "subprocess.run(['python3', 'intl/core_option_translation.py', dir_path, core_name])", + "subprocess.run(['python3', 'intl/crowdin_prep.py', dir_path, core_name])" + ) + workflow_config = workflow_config.replace( + "subprocess.run(['python3', 'intl/initial_sync.py', api_key, core_name])", + "subprocess.run(['python3', 'intl/crowdin_translation_download.py', api_key, core_name])" + ) + with open('intl/download_workflow.py', 'w') as workflow: + workflow.write(workflow_config) + + except Exception as e: + # Try really hard to reset Crowdin API Key + with open(YAML_PATH, 'r') as crowdin_config_file: + crowdin_config = crowdin_config_file.read() + crowdin_config = re.sub(r'"api_token": ".*?"', + '"api_token": "_secret_"', + crowdin_config, 1) + + # TODO this is NOT safe! + crowdin_config = re.sub(re.escape(f'/{CORE_NAME}'), + '/_core_name_', + crowdin_config) + + with open(YAML_PATH, 'w') as crowdin_config_file: + crowdin_config_file.write(crowdin_config) + raise e diff --git a/intl/upload_workflow.py b/intl/upload_workflow.py new file mode 100644 index 000000000..6bfff9276 --- /dev/null +++ b/intl/upload_workflow.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 + +import sys +import subprocess + +try: + api_key = sys.argv[1] + core_name = sys.argv[2] + dir_path = sys.argv[3] +except IndexError as e: + print('Please provide path to libretro_core_options.h, Crowdin API Token and core name!') + raise e + +subprocess.run(['python3', 'intl/crowdin_prep.py', dir_path, core_name]) +subprocess.run(['python3', 'intl/crowdin_source_upload.py', api_key, core_name]) diff --git a/intl/v1_to_v2_converter.py b/intl/v1_to_v2_converter.py new file mode 100644 index 000000000..caf3be5b9 --- /dev/null +++ b/intl/v1_to_v2_converter.py @@ -0,0 +1,459 @@ +#!/usr/bin/env python3 + +"""Core options v1 to v2 converter + +Just run this script as follows, to convert 'libretro_core_options.h' & 'Libretro_coreoptions_intl.h' to v2: +python3 "/path/to/v1_to_v2_converter.py" "/path/to/where/libretro_core_options.h & Libretro_coreoptions_intl.h/are" + +The original files will be preserved as *.v1 +""" +import core_option_regex as cor +import os +import sys + + +def create_v2_code_file(struct_text, file_name): + def replace_option(option_match): + _offset = option_match.start(0) + + if option_match.group(3): + res = option_match.group(0)[:option_match.end(2) - _offset] + ',\n NULL' + \ + option_match.group(0)[option_match.end(2) - _offset:option_match.end(3) - _offset] + \ + 'NULL,\n NULL,\n ' + option_match.group(0)[option_match.end(3) - _offset:] + else: + return option_match.group(0) + + return res + + comment_v1 = '/*\n' \ + ' ********************************\n' \ + ' * VERSION: 1.3\n' \ + ' ********************************\n' \ + ' *\n' \ + ' * - 1.3: Move translations to libretro_core_options_intl.h\n' \ + ' * - libretro_core_options_intl.h includes BOM and utf-8\n' \ + ' * fix for MSVC 2010-2013\n' \ + ' * - Added HAVE_NO_LANGEXTRA flag to disable translations\n' \ + ' * on platforms/compilers without BOM support\n' \ + ' * - 1.2: Use core options v1 interface when\n' \ + ' * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1\n' \ + ' * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1)\n' \ + ' * - 1.1: Support generation of core options v0 retro_core_option_value\n' \ + ' * arrays containing options with a single value\n' \ + ' * - 1.0: First commit\n' \ + '*/\n' + + comment_v2 = '/*\n' \ + ' ********************************\n' \ + ' * VERSION: 2.0\n' \ + ' ********************************\n' \ + ' *\n' \ + ' * - 2.0: Add support for core options v2 interface\n' \ + ' * - 1.3: Move translations to libretro_core_options_intl.h\n' \ + ' * - libretro_core_options_intl.h includes BOM and utf-8\n' \ + ' * fix for MSVC 2010-2013\n' \ + ' * - Added HAVE_NO_LANGEXTRA flag to disable translations\n' \ + ' * on platforms/compilers without BOM support\n' \ + ' * - 1.2: Use core options v1 interface when\n' \ + ' * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1\n' \ + ' * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1)\n' \ + ' * - 1.1: Support generation of core options v0 retro_core_option_value\n' \ + ' * arrays containing options with a single value\n' \ + ' * - 1.0: First commit\n' \ + '*/\n' + + p_intl = cor.p_intl + p_set = cor.p_set + new_set = 'static INLINE void libretro_set_core_options(retro_environment_t environ_cb,\n' \ + ' bool *categories_supported)\n' \ + '{\n' \ + ' unsigned version = 0;\n' \ + '#ifndef HAVE_NO_LANGEXTRA\n' \ + ' unsigned language = 0;\n' \ + '#endif\n' \ + '\n' \ + ' if (!environ_cb || !categories_supported)\n' \ + ' return;\n' \ + '\n' \ + ' *categories_supported = false;\n' \ + '\n' \ + ' if (!environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version))\n' \ + ' version = 0;\n' \ + '\n' \ + ' if (version >= 2)\n' \ + ' {\n' \ + '#ifndef HAVE_NO_LANGEXTRA\n' \ + ' struct retro_core_options_v2_intl core_options_intl;\n' \ + '\n' \ + ' core_options_intl.us = &options_us;\n' \ + ' core_options_intl.local = NULL;\n' \ + '\n' \ + ' if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) &&\n' \ + ' (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH))\n' \ + ' core_options_intl.local = options_intl[language];\n' \ + '\n' \ + ' *categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL,\n' \ + ' &core_options_intl);\n' \ + '#else\n' \ + ' *categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2,\n' \ + ' &options_us);\n' \ + '#endif\n' \ + ' }\n' \ + ' else\n' \ + ' {\n' \ + ' size_t i, j;\n' \ + ' size_t option_index = 0;\n' \ + ' size_t num_options = 0;\n' \ + ' struct retro_core_option_definition\n' \ + ' *option_v1_defs_us = NULL;\n' \ + '#ifndef HAVE_NO_LANGEXTRA\n' \ + ' size_t num_options_intl = 0;\n' \ + ' struct retro_core_option_v2_definition\n' \ + ' *option_defs_intl = NULL;\n' \ + ' struct retro_core_option_definition\n' \ + ' *option_v1_defs_intl = NULL;\n' \ + ' struct retro_core_options_intl\n' \ + ' core_options_v1_intl;\n' \ + '#endif\n' \ + ' struct retro_variable *variables = NULL;\n' \ + ' char **values_buf = NULL;\n' \ + '\n' \ + ' /* Determine total number of options */\n' \ + ' while (true)\n' \ + ' {\n' \ + ' if (option_defs_us[num_options].key)\n' \ + ' num_options++;\n' \ + ' else\n' \ + ' break;\n' \ + ' }\n' \ + '\n' \ + ' if (version >= 1)\n' \ + ' {\n' \ + ' /* Allocate US array */\n' \ + ' option_v1_defs_us = (struct retro_core_option_definition *)\n' \ + ' calloc(num_options + 1, sizeof(struct retro_core_option_definition));\n' \ + '\n' \ + ' /* Copy parameters from option_defs_us array */\n' \ + ' for (i = 0; i < num_options; i++)\n' \ + ' {\n' \ + ' struct retro_core_option_v2_definition *option_def_us = &option_defs_us[i];\n' \ + ' struct retro_core_option_value *option_values = option_def_us->values;\n' \ + ' struct retro_core_option_definition *option_v1_def_us = &option_v1_defs_us[i];\n' \ + ' struct retro_core_option_value *option_v1_values = option_v1_def_us->values;\n' \ + '\n' \ + ' option_v1_def_us->key = option_def_us->key;\n' \ + ' option_v1_def_us->desc = option_def_us->desc;\n' \ + ' option_v1_def_us->info = option_def_us->info;\n' \ + ' option_v1_def_us->default_value = option_def_us->default_value;\n' \ + '\n' \ + ' /* Values must be copied individually... */\n' \ + ' while (option_values->value)\n' \ + ' {\n' \ + ' option_v1_values->value = option_values->value;\n' \ + ' option_v1_values->label = option_values->label;\n' \ + '\n' \ + ' option_values++;\n' \ + ' option_v1_values++;\n' \ + ' }\n' \ + ' }\n' \ + '\n' \ + '#ifndef HAVE_NO_LANGEXTRA\n' \ + ' if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) &&\n' \ + ' (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH) &&\n' \ + ' options_intl[language])\n' \ + ' option_defs_intl = options_intl[language]->definitions;\n' \ + '\n' \ + ' if (option_defs_intl)\n' \ + ' {\n' \ + ' /* Determine number of intl options */\n' \ + ' while (true)\n' \ + ' {\n' \ + ' if (option_defs_intl[num_options_intl].key)\n' \ + ' num_options_intl++;\n' \ + ' else\n' \ + ' break;\n' \ + ' }\n' \ + '\n' \ + ' /* Allocate intl array */\n' \ + ' option_v1_defs_intl = (struct retro_core_option_definition *)\n' \ + ' calloc(num_options_intl + 1, sizeof(struct retro_core_option_definition));\n' \ + '\n' \ + ' /* Copy parameters from option_defs_intl array */\n' \ + ' for (i = 0; i < num_options_intl; i++)\n' \ + ' {\n' \ + ' struct retro_core_option_v2_definition *option_def_intl = &option_defs_intl[i];\n' \ + ' struct retro_core_option_value *option_values = option_def_intl->values;\n' \ + ' struct retro_core_option_definition *option_v1_def_intl = &option_v1_defs_intl[i];\n' \ + ' struct retro_core_option_value *option_v1_values = option_v1_def_intl->values;\n' \ + '\n' \ + ' option_v1_def_intl->key = option_def_intl->key;\n' \ + ' option_v1_def_intl->desc = option_def_intl->desc;\n' \ + ' option_v1_def_intl->info = option_def_intl->info;\n' \ + ' option_v1_def_intl->default_value = option_def_intl->default_value;\n' \ + '\n' \ + ' /* Values must be copied individually... */\n' \ + ' while (option_values->value)\n' \ + ' {\n' \ + ' option_v1_values->value = option_values->value;\n' \ + ' option_v1_values->label = option_values->label;\n' \ + '\n' \ + ' option_values++;\n' \ + ' option_v1_values++;\n' \ + ' }\n' \ + ' }\n' \ + ' }\n' \ + '\n' \ + ' core_options_v1_intl.us = option_v1_defs_us;\n' \ + ' core_options_v1_intl.local = option_v1_defs_intl;\n' \ + '\n' \ + ' environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_v1_intl);\n' \ + '#else\n' \ + ' environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, option_v1_defs_us);\n' \ + '#endif\n' \ + ' }\n' \ + ' else\n' \ + ' {\n' \ + ' /* Allocate arrays */\n' \ + ' variables = (struct retro_variable *)calloc(num_options + 1,\n' \ + ' sizeof(struct retro_variable));\n' \ + ' values_buf = (char **)calloc(num_options, sizeof(char *));\n' \ + '\n' \ + ' if (!variables || !values_buf)\n' \ + ' goto error;\n' \ + '\n' \ + ' /* Copy parameters from option_defs_us array */\n' \ + ' for (i = 0; i < num_options; i++)\n' \ + ' {\n' \ + ' const char *key = option_defs_us[i].key;\n' \ + ' const char *desc = option_defs_us[i].desc;\n' \ + ' const char *default_value = option_defs_us[i].default_value;\n' \ + ' struct retro_core_option_value *values = option_defs_us[i].values;\n' \ + ' size_t buf_len = 3;\n' \ + ' size_t default_index = 0;\n' \ + '\n' \ + ' values_buf[i] = NULL;\n' \ + '\n' \ + ' if (desc)\n' \ + ' {\n' \ + ' size_t num_values = 0;\n' \ + '\n' \ + ' /* Determine number of values */\n' \ + ' while (true)\n' \ + ' {\n' \ + ' if (values[num_values].value)\n' \ + ' {\n' \ + ' /* Check if this is the default value */\n' \ + ' if (default_value)\n' \ + ' if (strcmp(values[num_values].value, default_value) == 0)\n' \ + ' default_index = num_values;\n' \ + '\n' \ + ' buf_len += strlen(values[num_values].value);\n' \ + ' num_values++;\n' \ + ' }\n' \ + ' else\n' \ + ' break;\n' \ + ' }\n' \ + '\n' \ + ' /* Build values string */\n' \ + ' if (num_values > 0)\n' \ + ' {\n' \ + ' buf_len += num_values - 1;\n' \ + ' buf_len += strlen(desc);\n' \ + '\n' \ + ' values_buf[i] = (char *)calloc(buf_len, sizeof(char));\n' \ + ' if (!values_buf[i])\n' \ + ' goto error;\n' \ + '\n' \ + ' strcpy(values_buf[i], desc);\n' \ + ' strcat(values_buf[i], "; ");\n' \ + '\n' \ + ' /* Default value goes first */\n' \ + ' strcat(values_buf[i], values[default_index].value);\n' \ + '\n' \ + ' /* Add remaining values */\n' \ + ' for (j = 0; j < num_values; j++)\n' \ + ' {\n' \ + ' if (j != default_index)\n' \ + ' {\n' \ + ' strcat(values_buf[i], "|");\n' \ + ' strcat(values_buf[i], values[j].value);\n' \ + ' }\n' \ + ' }\n' \ + ' }\n' \ + ' }\n' \ + '\n' \ + ' variables[option_index].key = key;\n' \ + ' variables[option_index].value = values_buf[i];\n' \ + ' option_index++;\n' \ + ' }\n' \ + '\n' \ + ' /* Set variables */\n' \ + ' environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);\n' \ + ' }\n' \ + '\n' \ + 'error:\n' \ + ' /* Clean up */\n' \ + '\n' \ + ' if (option_v1_defs_us)\n' \ + ' {\n' \ + ' free(option_v1_defs_us);\n' \ + ' option_v1_defs_us = NULL;\n' \ + ' }\n' \ + '\n' \ + '#ifndef HAVE_NO_LANGEXTRA\n' \ + ' if (option_v1_defs_intl)\n' \ + ' {\n' \ + ' free(option_v1_defs_intl);\n' \ + ' option_v1_defs_intl = NULL;\n' \ + ' }\n' \ + '#endif\n' \ + '\n' \ + ' if (values_buf)\n' \ + ' {\n' \ + ' for (i = 0; i < num_options; i++)\n' \ + ' {\n' \ + ' if (values_buf[i])\n' \ + ' {\n' \ + ' free(values_buf[i]);\n' \ + ' values_buf[i] = NULL;\n' \ + ' }\n' \ + ' }\n' \ + '\n' \ + ' free(values_buf);\n' \ + ' values_buf = NULL;\n' \ + ' }\n' \ + '\n' \ + ' if (variables)\n' \ + ' {\n' \ + ' free(variables);\n' \ + ' variables = NULL;\n' \ + ' }\n' \ + ' }\n' \ + '}\n' \ + '\n' \ + '#ifdef __cplusplus\n' \ + '}\n' \ + '#endif' + + struct_groups = cor.p_struct.finditer(struct_text) + out_text = struct_text + + for construct in struct_groups: + repl_text = '' + declaration = construct.group(1) + struct_match = cor.p_type_name.search(declaration) + if struct_match: + if struct_match.group(3): + struct_type_name_lang = struct_match.group(1, 2, 3) + declaration_end = declaration[struct_match.end(1):] + elif struct_match.group(4): + struct_type_name_lang = struct_match.group(1, 2, 4) + declaration_end = declaration[struct_match.end(1):] + else: + struct_type_name_lang = sum((struct_match.group(1, 2), ('_us',)), ()) + declaration_end = f'{declaration[struct_match.end(1):struct_match.end(2)]}_us' \ + f'{declaration[struct_match.end(2):]}' + else: + return -1 + + if 'retro_core_option_definition' == struct_type_name_lang[0]: + import shutil + shutil.copy(file_name, file_name + '.v1') + new_declaration = f'\nstruct retro_core_option_v2_category option_cats{struct_type_name_lang[2]}[] = ' \ + '{\n { NULL, NULL, NULL },\n' \ + '};\n\n' \ + + declaration[:struct_match.start(1)] + \ + 'retro_core_option_v2_definition' \ + + declaration_end + offset = construct.start(0) + repl_text = repl_text + cor.re.sub(cor.re.escape(declaration), new_declaration, + construct.group(0)[:construct.start(2) - offset]) + content = construct.group(2) + new_content = cor.p_option.sub(replace_option, content) + + repl_text = repl_text + new_content + cor.re.sub(r'{\s*NULL,\s*NULL,\s*NULL,\s*{\{0}},\s*NULL\s*},\s*};', + '{ NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL },\n};' + '\n\nstruct retro_core_options_v2 options' + + struct_type_name_lang[2] + ' = {\n' + f' option_cats{struct_type_name_lang[2]},\n' + f' option_defs{struct_type_name_lang[2]}\n' + '};', + construct.group(0)[construct.end(2) - offset:]) + out_text = cor.re.sub(cor.re.escape(construct.group(0)), repl_text, out_text) + else: + return -2 + with open(file_name, 'w', encoding='utf-8') as code_file: + out_text = cor.re.sub(cor.re.escape(comment_v1), comment_v2, out_text) + intl = p_intl.search(out_text) + if intl: + new_intl = out_text[:intl.start(1)] \ + + 'struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST]' \ + + out_text[intl.end(1):intl.start(2)] \ + + '\n &options_us, /* RETRO_LANGUAGE_ENGLISH */\n' \ + ' &options_ja, /* RETRO_LANGUAGE_JAPANESE */\n' \ + ' &options_fr, /* RETRO_LANGUAGE_FRENCH */\n' \ + ' &options_es, /* RETRO_LANGUAGE_SPANISH */\n' \ + ' &options_de, /* RETRO_LANGUAGE_GERMAN */\n' \ + ' &options_it, /* RETRO_LANGUAGE_ITALIAN */\n' \ + ' &options_nl, /* RETRO_LANGUAGE_DUTCH */\n' \ + ' &options_pt_br, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */\n' \ + ' &options_pt_pt, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */\n' \ + ' &options_ru, /* RETRO_LANGUAGE_RUSSIAN */\n' \ + ' &options_ko, /* RETRO_LANGUAGE_KOREAN */\n' \ + ' &options_cht, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */\n' \ + ' &options_chs, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */\n' \ + ' &options_eo, /* RETRO_LANGUAGE_ESPERANTO */\n' \ + ' &options_pl, /* RETRO_LANGUAGE_POLISH */\n' \ + ' &options_vn, /* RETRO_LANGUAGE_VIETNAMESE */\n' \ + ' &options_ar, /* RETRO_LANGUAGE_ARABIC */\n' \ + ' &options_el, /* RETRO_LANGUAGE_GREEK */\n' \ + ' &options_tr, /* RETRO_LANGUAGE_TURKISH */\n' \ + ' &options_sv, /* RETRO_LANGUAGE_SLOVAK */\n' \ + ' &options_fa, /* RETRO_LANGUAGE_PERSIAN */\n' \ + ' &options_he, /* RETRO_LANGUAGE_HEBREW */\n' \ + ' &options_ast, /* RETRO_LANGUAGE_ASTURIAN */\n' \ + ' &options_fi, /* RETRO_LANGUAGE_FINNISH */\n' \ + + out_text[intl.end(2):] + out_text = p_set.sub(new_set, new_intl) + else: + out_text = p_set.sub(new_set, out_text) + code_file.write(out_text) + + return 1 + + +# -------------------- MAIN -------------------- # + +if __name__ == '__main__': + try: + if os.path.isfile(sys.argv[1]): + _temp = os.path.dirname(sys.argv[1]) + else: + _temp = sys.argv[1] + while _temp.endswith('/') or _temp.endswith('\\'): + _temp = _temp[:-1] + DIR_PATH = _temp + except IndexError: + DIR_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + print("No path provided, assuming parent directory:\n" + DIR_PATH) + + H_FILE_PATH = os.path.join(DIR_PATH, 'libretro_core_options.h') + INTL_FILE_PATH = os.path.join(DIR_PATH, 'libretro_core_options_intl.h') + + for file in (H_FILE_PATH, INTL_FILE_PATH): + if os.path.isfile(file): + with open(file, 'r+', encoding='utf-8') as h_file: + text = h_file.read() + try: + test = create_v2_code_file(text, file) + except Exception as e: + print(e) + test = -1 + if -1 > test: + print('Your file looks like it already is v2? (' + file + ')') + continue + if 0 > test: + print('An error occured! Please make sure to use the complete v1 struct! (' + file + ')') + continue + else: + print(file + ' not found.') diff --git a/yabause/src/libretro/libretro-common/include/libretro.h b/yabause/src/libretro/libretro-common/include/libretro.h index 8a5da8648..2f1748370 100644 --- a/yabause/src/libretro/libretro-common/include/libretro.h +++ b/yabause/src/libretro/libretro-common/include/libretro.h @@ -1131,6 +1131,13 @@ enum retro_mod * retro_core_option_definition structs to RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL. * This allows the core to additionally set option sublabel information * and/or provide localisation support. + * + * If version is >= 2, core options may instead be set by passing + * a retro_core_options_v2 struct to RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2, + * or an array of retro_core_options_v2 structs to + * RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL. This allows the core + * to additionally set optional core option category information + * for frontends with core option category support. */ #define RETRO_ENVIRONMENT_SET_CORE_OPTIONS 53 @@ -1172,7 +1179,7 @@ enum retro_mod * default value is NULL, the first entry in the * retro_core_option_definition::values array is treated as the default. * - * The number of possible options should be very limited, + * The number of possible option values should be very limited, * and must be less than RETRO_NUM_CORE_OPTION_VALUES_MAX. * i.e. it should be feasible to cycle through options * without a keyboard. @@ -1205,6 +1212,7 @@ enum retro_mod * This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION * returns an API version of >= 1. * This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES. + * This should be called instead of RETRO_ENVIRONMENT_SET_CORE_OPTIONS. * This should be called the first time as early as * possible (ideally in retro_set_environment). * Afterwards it may be called again for the core to communicate @@ -1378,6 +1386,373 @@ enum retro_mod * call will target the newly initialized driver. */ +#define RETRO_ENVIRONMENT_SET_FASTFORWARDING_OVERRIDE 64 + /* const struct retro_fastforwarding_override * -- + * Used by a libretro core to override the current + * fastforwarding mode of the frontend. + * If NULL is passed to this function, the frontend + * will return true if fastforwarding override + * functionality is supported (no change in + * fastforwarding state will occur in this case). + */ + +#define RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE 65 + /* const struct retro_system_content_info_override * -- + * Allows an implementation to override 'global' content + * info parameters reported by retro_get_system_info(). + * Overrides also affect subsystem content info parameters + * set via RETRO_ENVIRONMENT_SET_SUBSYSTEM_INFO. + * This function must be called inside retro_set_environment(). + * If callback returns false, content info overrides + * are unsupported by the frontend, and will be ignored. + * If callback returns true, extended game info may be + * retrieved by calling RETRO_ENVIRONMENT_GET_GAME_INFO_EXT + * in retro_load_game() or retro_load_game_special(). + * + * 'data' points to an array of retro_system_content_info_override + * structs terminated by a { NULL, false, false } element. + * If 'data' is NULL, no changes will be made to the frontend; + * a core may therefore pass NULL in order to test whether + * the RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE and + * RETRO_ENVIRONMENT_GET_GAME_INFO_EXT callbacks are supported + * by the frontend. + * + * For struct member descriptions, see the definition of + * struct retro_system_content_info_override. + * + * Example: + * + * - struct retro_system_info: + * { + * "My Core", // library_name + * "v1.0", // library_version + * "m3u|md|cue|iso|chd|sms|gg|sg", // valid_extensions + * true, // need_fullpath + * false // block_extract + * } + * + * - Array of struct retro_system_content_info_override: + * { + * { + * "md|sms|gg", // extensions + * false, // need_fullpath + * true // persistent_data + * }, + * { + * "sg", // extensions + * false, // need_fullpath + * false // persistent_data + * }, + * { NULL, false, false } + * } + * + * Result: + * - Files of type m3u, cue, iso, chd will not be + * loaded by the frontend. Frontend will pass a + * valid path to the core, and core will handle + * loading internally + * - Files of type md, sms, gg will be loaded by + * the frontend. A valid memory buffer will be + * passed to the core. This memory buffer will + * remain valid until retro_deinit() returns + * - Files of type sg will be loaded by the frontend. + * A valid memory buffer will be passed to the core. + * This memory buffer will remain valid until + * retro_load_game() (or retro_load_game_special()) + * returns + * + * NOTE: If an extension is listed multiple times in + * an array of retro_system_content_info_override + * structs, only the first instance will be registered + */ + +#define RETRO_ENVIRONMENT_GET_GAME_INFO_EXT 66 + /* const struct retro_game_info_ext ** -- + * Allows an implementation to fetch extended game + * information, providing additional content path + * and memory buffer status details. + * This function may only be called inside + * retro_load_game() or retro_load_game_special(). + * If callback returns false, extended game information + * is unsupported by the frontend. In this case, only + * regular retro_game_info will be available. + * RETRO_ENVIRONMENT_GET_GAME_INFO_EXT is guaranteed + * to return true if RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE + * returns true. + * + * 'data' points to an array of retro_game_info_ext structs. + * + * For struct member descriptions, see the definition of + * struct retro_game_info_ext. + * + * - If function is called inside retro_load_game(), + * the retro_game_info_ext array is guaranteed to + * have a size of 1 - i.e. the returned pointer may + * be used to access directly the members of the + * first retro_game_info_ext struct, for example: + * + * struct retro_game_info_ext *game_info_ext; + * if (environ_cb(RETRO_ENVIRONMENT_GET_GAME_INFO_EXT, &game_info_ext)) + * printf("Content Directory: %s\n", game_info_ext->dir); + * + * - If the function is called inside retro_load_game_special(), + * the retro_game_info_ext array is guaranteed to have a + * size equal to the num_info argument passed to + * retro_load_game_special() + */ + +#define RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2 67 + /* const struct retro_core_options_v2 * -- + * Allows an implementation to signal the environment + * which variables it might want to check for later using + * GET_VARIABLE. + * This allows the frontend to present these variables to + * a user dynamically. + * This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION + * returns an API version of >= 2. + * This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES. + * This should be called instead of RETRO_ENVIRONMENT_SET_CORE_OPTIONS. + * This should be called the first time as early as + * possible (ideally in retro_set_environment). + * Afterwards it may be called again for the core to communicate + * updated options to the frontend, but the number of core + * options must not change from the number in the initial call. + * If RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION returns an API + * version of >= 2, this callback is guaranteed to succeed + * (i.e. callback return value does not indicate success) + * If callback returns true, frontend has core option category + * support. + * If callback returns false, frontend does not have core option + * category support. + * + * 'data' points to a retro_core_options_v2 struct, containing + * of two pointers: + * - retro_core_options_v2::categories is an array of + * retro_core_option_v2_category structs terminated by a + * { NULL, NULL, NULL } element. If retro_core_options_v2::categories + * is NULL, all core options will have no category and will be shown + * at the top level of the frontend core option interface. If frontend + * does not have core option category support, categories array will + * be ignored. + * - retro_core_options_v2::definitions is an array of + * retro_core_option_v2_definition structs terminated by a + * { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL } + * element. + * + * >> retro_core_option_v2_category notes: + * + * - retro_core_option_v2_category::key should contain string + * that uniquely identifies the core option category. Valid + * key characters are [a-z, A-Z, 0-9, _, -] + * Namespace collisions with other implementations' category + * keys are permitted. + * - retro_core_option_v2_category::desc should contain a human + * readable description of the category key. + * - retro_core_option_v2_category::info should contain any + * additional human readable information text that a typical + * user may need to understand the nature of the core option + * category. + * + * Example entry: + * { + * "advanced_settings", + * "Advanced", + * "Options affecting low-level emulation performance and accuracy." + * } + * + * >> retro_core_option_v2_definition notes: + * + * - retro_core_option_v2_definition::key should be namespaced to not + * collide with other implementations' keys. e.g. A core called + * 'foo' should use keys named as 'foo_option'. Valid key characters + * are [a-z, A-Z, 0-9, _, -]. + * - retro_core_option_v2_definition::desc should contain a human readable + * description of the key. Will be used when the frontend does not + * have core option category support. Examples: "Aspect Ratio" or + * "Video > Aspect Ratio". + * - retro_core_option_v2_definition::desc_categorized should contain a + * human readable description of the key, which will be used when + * frontend has core option category support. Example: "Aspect Ratio", + * where associated retro_core_option_v2_category::desc is "Video". + * If empty or NULL, the string specified by + * retro_core_option_v2_definition::desc will be used instead. + * retro_core_option_v2_definition::desc_categorized will be ignored + * if retro_core_option_v2_definition::category_key is empty or NULL. + * - retro_core_option_v2_definition::info should contain any additional + * human readable information text that a typical user may need to + * understand the functionality of the option. + * - retro_core_option_v2_definition::info_categorized should contain + * any additional human readable information text that a typical user + * may need to understand the functionality of the option, and will be + * used when frontend has core option category support. This is provided + * to accommodate the case where info text references an option by + * name/desc, and the desc/desc_categorized text for that option differ. + * If empty or NULL, the string specified by + * retro_core_option_v2_definition::info will be used instead. + * retro_core_option_v2_definition::info_categorized will be ignored + * if retro_core_option_v2_definition::category_key is empty or NULL. + * - retro_core_option_v2_definition::category_key should contain a + * category identifier (e.g. "video" or "audio") that will be + * assigned to the core option if frontend has core option category + * support. A categorized option will be shown in a subsection/ + * submenu of the frontend core option interface. If key is empty + * or NULL, or if key does not match one of the + * retro_core_option_v2_category::key values in the associated + * retro_core_option_v2_category array, option will have no category + * and will be shown at the top level of the frontend core option + * interface. + * - retro_core_option_v2_definition::values is an array of + * retro_core_option_value structs terminated by a { NULL, NULL } + * element. + * --> retro_core_option_v2_definition::values[index].value is an + * expected option value. + * --> retro_core_option_v2_definition::values[index].label is a + * human readable label used when displaying the value on screen. + * If NULL, the value itself is used. + * - retro_core_option_v2_definition::default_value is the default + * core option setting. It must match one of the expected option + * values in the retro_core_option_v2_definition::values array. If + * it does not, or the default value is NULL, the first entry in the + * retro_core_option_v2_definition::values array is treated as the + * default. + * + * The number of possible option values should be very limited, + * and must be less than RETRO_NUM_CORE_OPTION_VALUES_MAX. + * i.e. it should be feasible to cycle through options + * without a keyboard. + * + * Example entries: + * + * - Uncategorized: + * + * { + * "foo_option", + * "Speed hack coprocessor X", + * NULL, + * "Provides increased performance at the expense of reduced accuracy.", + * NULL, + * NULL, + * { + * { "false", NULL }, + * { "true", NULL }, + * { "unstable", "Turbo (Unstable)" }, + * { NULL, NULL }, + * }, + * "false" + * } + * + * - Categorized: + * + * { + * "foo_option", + * "Advanced > Speed hack coprocessor X", + * "Speed hack coprocessor X", + * "Setting 'Advanced > Speed hack coprocessor X' to 'true' or 'Turbo' provides increased performance at the expense of reduced accuracy", + * "Setting 'Speed hack coprocessor X' to 'true' or 'Turbo' provides increased performance at the expense of reduced accuracy", + * "advanced_settings", + * { + * { "false", NULL }, + * { "true", NULL }, + * { "unstable", "Turbo (Unstable)" }, + * { NULL, NULL }, + * }, + * "false" + * } + * + * Only strings are operated on. The possible values will + * generally be displayed and stored as-is by the frontend. + */ + +#define RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL 68 + /* const struct retro_core_options_v2_intl * -- + * Allows an implementation to signal the environment + * which variables it might want to check for later using + * GET_VARIABLE. + * This allows the frontend to present these variables to + * a user dynamically. + * This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION + * returns an API version of >= 2. + * This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES. + * This should be called instead of RETRO_ENVIRONMENT_SET_CORE_OPTIONS. + * This should be called instead of RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL. + * This should be called instead of RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2. + * This should be called the first time as early as + * possible (ideally in retro_set_environment). + * Afterwards it may be called again for the core to communicate + * updated options to the frontend, but the number of core + * options must not change from the number in the initial call. + * If RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION returns an API + * version of >= 2, this callback is guaranteed to succeed + * (i.e. callback return value does not indicate success) + * If callback returns true, frontend has core option category + * support. + * If callback returns false, frontend does not have core option + * category support. + * + * This is fundamentally the same as RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2, + * with the addition of localisation support. The description of the + * RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2 callback should be consulted + * for further details. + * + * 'data' points to a retro_core_options_v2_intl struct. + * + * - retro_core_options_v2_intl::us is a pointer to a + * retro_core_options_v2 struct defining the US English + * core options implementation. It must point to a valid struct. + * + * - retro_core_options_v2_intl::local is a pointer to a + * retro_core_options_v2 struct defining core options for + * the current frontend language. It may be NULL (in which case + * retro_core_options_v2_intl::us is used by the frontend). Any items + * missing from this struct will be read from + * retro_core_options_v2_intl::us instead. + * + * NOTE: Default core option values are always taken from the + * retro_core_options_v2_intl::us struct. Any default values in + * the retro_core_options_v2_intl::local struct will be ignored. + */ + +#define RETRO_ENVIRONMENT_SET_CORE_OPTIONS_UPDATE_DISPLAY_CALLBACK 69 + /* const struct retro_core_options_update_display_callback * -- + * Allows a frontend to signal that a core must update + * the visibility of any dynamically hidden core options, + * and enables the frontend to detect visibility changes. + * Used by the frontend to update the menu display status + * of core options without requiring a call of retro_run(). + * Must be called in retro_set_environment(). + */ + +#define RETRO_ENVIRONMENT_SET_VARIABLE 70 + /* const struct retro_variable * -- + * Allows an implementation to notify the frontend + * that a core option value has changed. + * + * retro_variable::key and retro_variable::value + * must match strings that have been set previously + * via one of the following: + * + * - RETRO_ENVIRONMENT_SET_VARIABLES + * - RETRO_ENVIRONMENT_SET_CORE_OPTIONS + * - RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL + * - RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2 + * - RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL + * + * After changing a core option value via this + * callback, RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE + * will return true. + * + * If data is NULL, no changes will be registered + * and the callback will return true; an + * implementation may therefore pass NULL in order + * to test whether the callback is supported. + */ + +#define RETRO_ENVIRONMENT_GET_THROTTLE_STATE (71 | RETRO_ENVIRONMENT_EXPERIMENTAL) + /* struct retro_throttle_state * -- + * Allows an implementation to get details on the actual rate + * the frontend is attempting to call retro_run(). + */ + /* VFS functionality */ /* File paths: @@ -2781,6 +3156,213 @@ struct retro_system_info bool block_extract; }; +/* Defines overrides which modify frontend handling of + * specific content file types. + * An array of retro_system_content_info_override is + * passed to RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE + * NOTE: In the following descriptions, references to + * retro_load_game() may be replaced with + * retro_load_game_special() */ +struct retro_system_content_info_override +{ + /* A list of file extensions for which the override + * should apply, delimited by a 'pipe' character + * (e.g. "md|sms|gg") + * Permitted file extensions are limited to those + * included in retro_system_info::valid_extensions + * and/or retro_subsystem_rom_info::valid_extensions */ + const char *extensions; + + /* Overrides the need_fullpath value set in + * retro_system_info and/or retro_subsystem_rom_info. + * To reiterate: + * + * If need_fullpath is true and retro_load_game() is called: + * - retro_game_info::path is guaranteed to contain a valid + * path to an existent file + * - retro_game_info::data and retro_game_info::size are invalid + * + * If need_fullpath is false and retro_load_game() is called: + * - retro_game_info::path may be NULL + * - retro_game_info::data and retro_game_info::size are guaranteed + * to be valid + * + * In addition: + * + * If need_fullpath is true and retro_load_game() is called: + * - retro_game_info_ext::full_path is guaranteed to contain a valid + * path to an existent file + * - retro_game_info_ext::archive_path may be NULL + * - retro_game_info_ext::archive_file may be NULL + * - retro_game_info_ext::dir is guaranteed to contain a valid path + * to the directory in which the content file exists + * - retro_game_info_ext::name is guaranteed to contain the + * basename of the content file, without extension + * - retro_game_info_ext::ext is guaranteed to contain the + * extension of the content file in lower case format + * - retro_game_info_ext::data and retro_game_info_ext::size + * are invalid + * + * If need_fullpath is false and retro_load_game() is called: + * - If retro_game_info_ext::file_in_archive is false: + * - retro_game_info_ext::full_path is guaranteed to contain + * a valid path to an existent file + * - retro_game_info_ext::archive_path may be NULL + * - retro_game_info_ext::archive_file may be NULL + * - retro_game_info_ext::dir is guaranteed to contain a + * valid path to the directory in which the content file exists + * - retro_game_info_ext::name is guaranteed to contain the + * basename of the content file, without extension + * - retro_game_info_ext::ext is guaranteed to contain the + * extension of the content file in lower case format + * - If retro_game_info_ext::file_in_archive is true: + * - retro_game_info_ext::full_path may be NULL + * - retro_game_info_ext::archive_path is guaranteed to + * contain a valid path to an existent compressed file + * inside which the content file is located + * - retro_game_info_ext::archive_file is guaranteed to + * contain a valid path to an existent content file + * inside the compressed file referred to by + * retro_game_info_ext::archive_path + * e.g. for a compressed file '/path/to/foo.zip' + * containing 'bar.sfc' + * > retro_game_info_ext::archive_path will be '/path/to/foo.zip' + * > retro_game_info_ext::archive_file will be 'bar.sfc' + * - retro_game_info_ext::dir is guaranteed to contain a + * valid path to the directory in which the compressed file + * (containing the content file) exists + * - retro_game_info_ext::name is guaranteed to contain + * EITHER + * 1) the basename of the compressed file (containing + * the content file), without extension + * OR + * 2) the basename of the content file inside the + * compressed file, without extension + * In either case, a core should consider 'name' to + * be the canonical name/ID of the the content file + * - retro_game_info_ext::ext is guaranteed to contain the + * extension of the content file inside the compressed file, + * in lower case format + * - retro_game_info_ext::data and retro_game_info_ext::size are + * guaranteed to be valid */ + bool need_fullpath; + + /* If need_fullpath is false, specifies whether the content + * data buffer available in retro_load_game() is 'persistent' + * + * If persistent_data is false and retro_load_game() is called: + * - retro_game_info::data and retro_game_info::size + * are valid only until retro_load_game() returns + * - retro_game_info_ext::data and retro_game_info_ext::size + * are valid only until retro_load_game() returns + * + * If persistent_data is true and retro_load_game() is called: + * - retro_game_info::data and retro_game_info::size + * are valid until retro_deinit() returns + * - retro_game_info_ext::data and retro_game_info_ext::size + * are valid until retro_deinit() returns */ + bool persistent_data; +}; + +/* Similar to retro_game_info, but provides extended + * information about the source content file and + * game memory buffer status. + * And array of retro_game_info_ext is returned by + * RETRO_ENVIRONMENT_GET_GAME_INFO_EXT + * NOTE: In the following descriptions, references to + * retro_load_game() may be replaced with + * retro_load_game_special() */ +struct retro_game_info_ext +{ + /* - If file_in_archive is false, contains a valid + * path to an existent content file (UTF-8 encoded) + * - If file_in_archive is true, may be NULL */ + const char *full_path; + + /* - If file_in_archive is false, may be NULL + * - If file_in_archive is true, contains a valid path + * to an existent compressed file inside which the + * content file is located (UTF-8 encoded) */ + const char *archive_path; + + /* - If file_in_archive is false, may be NULL + * - If file_in_archive is true, contain a valid path + * to an existent content file inside the compressed + * file referred to by archive_path (UTF-8 encoded) + * e.g. for a compressed file '/path/to/foo.zip' + * containing 'bar.sfc' + * > archive_path will be '/path/to/foo.zip' + * > archive_file will be 'bar.sfc' */ + const char *archive_file; + + /* - If file_in_archive is false, contains a valid path + * to the directory in which the content file exists + * (UTF-8 encoded) + * - If file_in_archive is true, contains a valid path + * to the directory in which the compressed file + * (containing the content file) exists (UTF-8 encoded) */ + const char *dir; + + /* Contains the canonical name/ID of the content file + * (UTF-8 encoded). Intended for use when identifying + * 'complementary' content named after the loaded file - + * i.e. companion data of a different format (a CD image + * required by a ROM), texture packs, internally handled + * save files, etc. + * - If file_in_archive is false, contains the basename + * of the content file, without extension + * - If file_in_archive is true, then string is + * implementation specific. A frontend may choose to + * set a name value of: + * EITHER + * 1) the basename of the compressed file (containing + * the content file), without extension + * OR + * 2) the basename of the content file inside the + * compressed file, without extension + * RetroArch sets the 'name' value according to (1). + * A frontend that supports routine loading of + * content from archives containing multiple unrelated + * content files may set the 'name' value according + * to (2). */ + const char *name; + + /* - If file_in_archive is false, contains the extension + * of the content file in lower case format + * - If file_in_archive is true, contains the extension + * of the content file inside the compressed file, + * in lower case format */ + const char *ext; + + /* String of implementation specific meta-data. */ + const char *meta; + + /* Memory buffer of loaded game content. Will be NULL: + * IF + * - retro_system_info::need_fullpath is true and + * retro_system_content_info_override::need_fullpath + * is unset + * OR + * - retro_system_content_info_override::need_fullpath + * is true */ + const void *data; + + /* Size of game content memory buffer, in bytes */ + size_t size; + + /* True if loaded content file is inside a compressed + * archive */ + bool file_in_archive; + + /* - If data is NULL, value is unset/ignored + * - If data is non-NULL: + * - If persistent_data is false, data and size are + * valid only until retro_load_game() returns + * - If persistent_data is true, data and size are + * are valid until retro_deinit() returns */ + bool persistent_data; +}; + struct retro_game_geometry { unsigned base_width; /* Nominal video width of game. */ @@ -2892,6 +3474,143 @@ struct retro_core_options_intl struct retro_core_option_definition *local; }; +struct retro_core_option_v2_category +{ + /* Variable uniquely identifying the + * option category. Valid key characters + * are [a-z, A-Z, 0-9, _, -] */ + const char *key; + + /* Human-readable category description + * > Used as category menu label when + * frontend has core option category + * support */ + const char *desc; + + /* Human-readable category information + * > Used as category menu sublabel when + * frontend has core option category + * support + * > Optional (may be NULL or an empty + * string) */ + const char *info; +}; + +struct retro_core_option_v2_definition +{ + /* Variable to query in RETRO_ENVIRONMENT_GET_VARIABLE. + * Valid key characters are [a-z, A-Z, 0-9, _, -] */ + const char *key; + + /* Human-readable core option description + * > Used as menu label when frontend does + * not have core option category support + * e.g. "Video > Aspect Ratio" */ + const char *desc; + + /* Human-readable core option description + * > Used as menu label when frontend has + * core option category support + * e.g. "Aspect Ratio", where associated + * retro_core_option_v2_category::desc + * is "Video" + * > If empty or NULL, the string specified by + * desc will be used as the menu label + * > Will be ignored (and may be set to NULL) + * if category_key is empty or NULL */ + const char *desc_categorized; + + /* Human-readable core option information + * > Used as menu sublabel */ + const char *info; + + /* Human-readable core option information + * > Used as menu sublabel when frontend + * has core option category support + * (e.g. may be required when info text + * references an option by name/desc, + * and the desc/desc_categorized text + * for that option differ) + * > If empty or NULL, the string specified by + * info will be used as the menu sublabel + * > Will be ignored (and may be set to NULL) + * if category_key is empty or NULL */ + const char *info_categorized; + + /* Variable specifying category (e.g. "video", + * "audio") that will be assigned to the option + * if frontend has core option category support. + * > Categorized options will be displayed in a + * subsection/submenu of the frontend core + * option interface + * > Specified string must match one of the + * retro_core_option_v2_category::key values + * in the associated retro_core_option_v2_category + * array; If no match is not found, specified + * string will be considered as NULL + * > If specified string is empty or NULL, option will + * have no category and will be shown at the top + * level of the frontend core option interface */ + const char *category_key; + + /* Array of retro_core_option_value structs, terminated by NULL */ + struct retro_core_option_value values[RETRO_NUM_CORE_OPTION_VALUES_MAX]; + + /* Default core option value. Must match one of the values + * in the retro_core_option_value array, otherwise will be + * ignored */ + const char *default_value; +}; + +struct retro_core_options_v2 +{ + /* Array of retro_core_option_v2_category structs, + * terminated by NULL + * > If NULL, all entries in definitions array + * will have no category and will be shown at + * the top level of the frontend core option + * interface + * > Will be ignored if frontend does not have + * core option category support */ + struct retro_core_option_v2_category *categories; + + /* Array of retro_core_option_v2_definition structs, + * terminated by NULL */ + struct retro_core_option_v2_definition *definitions; +}; + +struct retro_core_options_v2_intl +{ + /* Pointer to a retro_core_options_v2 struct + * > US English implementation + * > Must point to a valid struct */ + struct retro_core_options_v2 *us; + + /* Pointer to a retro_core_options_v2 struct + * - Implementation for current frontend language + * - May be NULL */ + struct retro_core_options_v2 *local; +}; + +/* Used by the frontend to monitor changes in core option + * visibility. May be called each time any core option + * value is set via the frontend. + * - On each invocation, the core must update the visibility + * of any dynamically hidden options using the + * RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY environment + * callback. + * - On the first invocation, returns 'true' if the visibility + * of any core option has changed since the last call of + * retro_load_game() or retro_load_game_special(). + * - On each subsequent invocation, returns 'true' if the + * visibility of any core option has changed since the last + * time the function was called. */ +typedef bool (RETRO_CALLCONV *retro_core_options_update_display_callback_t)(void); +struct retro_core_options_update_display_callback +{ + retro_core_options_update_display_callback_t callback; +}; + struct retro_game_info { const char *path; /* Path to game, UTF-8 encoded. @@ -2938,6 +3657,84 @@ struct retro_framebuffer Set by frontend in GET_CURRENT_SOFTWARE_FRAMEBUFFER. */ }; +/* Used by a libretro core to override the current + * fastforwarding mode of the frontend */ +struct retro_fastforwarding_override +{ + /* Specifies the runtime speed multiplier that + * will be applied when 'fastforward' is true. + * For example, a value of 5.0 when running 60 FPS + * content will cap the fast-forward rate at 300 FPS. + * Note that the target multiplier may not be achieved + * if the host hardware has insufficient processing + * power. + * Setting a value of 0.0 (or greater than 0.0 but + * less than 1.0) will result in an uncapped + * fast-forward rate (limited only by hardware + * capacity). + * If the value is negative, it will be ignored + * (i.e. the frontend will use a runtime speed + * multiplier of its own choosing) */ + float ratio; + + /* If true, fastforwarding mode will be enabled. + * If false, fastforwarding mode will be disabled. */ + bool fastforward; + + /* If true, and if supported by the frontend, an + * on-screen notification will be displayed while + * 'fastforward' is true. + * If false, and if supported by the frontend, any + * on-screen fast-forward notifications will be + * suppressed */ + bool notification; + + /* If true, the core will have sole control over + * when fastforwarding mode is enabled/disabled; + * the frontend will not be able to change the + * state set by 'fastforward' until either + * 'inhibit_toggle' is set to false, or the core + * is unloaded */ + bool inhibit_toggle; +}; + +/* During normal operation. Rate will be equal to the core's internal FPS. */ +#define RETRO_THROTTLE_NONE 0 + +/* While paused or stepping single frames. Rate will be 0. */ +#define RETRO_THROTTLE_FRAME_STEPPING 1 + +/* During fast forwarding. + * Rate will be 0 if not specifically limited to a maximum speed. */ +#define RETRO_THROTTLE_FAST_FORWARD 2 + +/* During slow motion. Rate will be less than the core's internal FPS. */ +#define RETRO_THROTTLE_SLOW_MOTION 3 + +/* While rewinding recorded save states. Rate can vary depending on the rewind + * speed or be 0 if the frontend is not aiming for a specific rate. */ +#define RETRO_THROTTLE_REWINDING 4 + +/* While vsync is active in the video driver and the target refresh rate is + * lower than the core's internal FPS. Rate is the target refresh rate. */ +#define RETRO_THROTTLE_VSYNC 5 + +/* When the frontend does not throttle in any way. Rate will be 0. + * An example could be if no vsync or audio output is active. */ +#define RETRO_THROTTLE_UNBLOCKED 6 + +struct retro_throttle_state +{ + /* The current throttling mode. Should be one of the values above. */ + unsigned mode; + + /* How many times per second the frontend aims to call retro_run. + * Depending on the mode, it can be 0 if there is no known fixed rate. + * This won't be accurate if the total processing time of the core and + * the frontend is longer than what is available for one frame. */ + float rate; +}; + /* Callbacks */ /* Environment callback. Gives implementations a way of performing diff --git a/yabause/src/libretro/libretro.c b/yabause/src/libretro/libretro.c index f52ac1ea4..af5444152 100644 --- a/yabause/src/libretro/libretro.c +++ b/yabause/src/libretro/libretro.c @@ -77,6 +77,8 @@ static unsigned disk_index = 0; static unsigned disk_total = 0; static bool disk_tray_open = false; +static bool libretro_supports_option_categories = false; + struct retro_perf_callback perf_cb; retro_get_cpu_features_t perf_get_cpu_features_cb = NULL; @@ -94,7 +96,8 @@ void retro_set_environment(retro_environment_t cb) { environ_cb = cb; - libretro_set_core_options(environ_cb); + libretro_set_core_options(environ_cb, + &libretro_supports_option_categories); static const struct retro_controller_description peripherals[] = { { "Saturn Pad", RETRO_DEVICE_JOYPAD }, diff --git a/yabause/src/libretro/libretro_core_options.h b/yabause/src/libretro/libretro_core_options.h index 757000db3..f3d39eae7 100644 --- a/yabause/src/libretro/libretro_core_options.h +++ b/yabause/src/libretro/libretro_core_options.h @@ -7,6 +7,10 @@ #include #include +#ifndef HAVE_NO_LANGEXTRA +#include "libretro_core_options_intl.h" +#endif + #ifdef __cplusplus extern "C" { #endif @@ -26,11 +30,19 @@ extern "C" { * - Will be used as a fallback for any missing entries in * frontend language definition */ -struct retro_core_option_definition option_defs_us[] = { + +struct retro_core_option_v2_category option_cats_us[] = { + { NULL, NULL, NULL }, +}; + +struct retro_core_option_v2_definition option_defs_us[] = { { "yabause_frameskip", "Frameskip", + NULL, "Enable frameskip, it should help with performances.", + NULL, + NULL, { { "disabled", NULL }, { "enabled", NULL }, @@ -41,7 +53,10 @@ struct retro_core_option_definition option_defs_us[] = { { "yabause_force_hle_bios", "Force HLE BIOS (Restart Required)", + NULL, "Use at your own risk, it's causing more issues than it solves.", + NULL, + NULL, { { "disabled", NULL }, { "enabled", NULL }, @@ -51,8 +66,11 @@ struct retro_core_option_definition option_defs_us[] = { }, { "yabause_addon_cartridge", - "Addon Cartridge (Restart Required)", - "Select the addon cartridge.", + "Add-on Cartridge (Restart Required)", + NULL, + "Select the add-on cartridge.", + NULL, + NULL, { { "none", NULL }, { "1M_ram", NULL }, @@ -64,7 +82,10 @@ struct retro_core_option_definition option_defs_us[] = { { "yabause_multitap_port1", "6Player Adaptor on Port 1", + NULL, "Enable multitap in port 1", + NULL, + NULL, { { "disabled", NULL }, { "enabled", NULL }, @@ -75,7 +96,10 @@ struct retro_core_option_definition option_defs_us[] = { { "yabause_multitap_port2", "6Player Adaptor on Port 2", + NULL, "Enable multitap in port 2", + NULL, + NULL, { { "disabled", NULL }, { "enabled", NULL }, @@ -87,7 +111,10 @@ struct retro_core_option_definition option_defs_us[] = { { "yabause_numthreads", "Number of Threads (Restart Required)", + NULL, "Depending on your CPU, changing this value can help with performances.", + NULL, + NULL, { { "1", NULL }, { "2", NULL }, @@ -100,198 +127,12 @@ struct retro_core_option_definition option_defs_us[] = { "4" }, #endif - { NULL, NULL, NULL, {{0}}, NULL }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -/* RETRO_LANGUAGE_JAPANESE */ - -/* RETRO_LANGUAGE_FRENCH */ - -/* RETRO_LANGUAGE_SPANISH */ - - -struct retro_core_option_definition option_defs_es[] = { - { - "yabause_frameskip", - "Omisión de fotogramas", - "Activa la omisión de fotogramas. Debería mejorar el rendimiento.", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled" - }, - { - "yabause_force_hle_bios", - "Forzar BIOS HLE (es necesario reiniciar)", - "Utiliza esta opción por tu cuenta y riesgo, ya que produce más problemas de los que resuelve.", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled" - }, - { - "yabause_addon_cartridge", - "Cartucho de expansión (es necesario reiniciar)", - "Selecciona el cartucho de ampliación.", - { - { "none", NULL }, - { "1M_ram", "RAM de 1 MB" }, - { "4M_ram", "RAM de 4 MB" }, - { NULL, NULL}, - }, - "none" - }, - { - "yabause_multitap_port1", - "Adaptador para seis jugadores en el puerto 1", - "Activar un multitap en el puerto 1.", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled" - }, - { - "yabause_multitap_port2", - "Adaptador para seis jugadores en el puerto 2", - "Activar un multitap en el puerto 2.", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled" - }, -#ifdef HAVE_THREADS - { - "yabause_numthreads", - "Número de hilos (es necesario reiniciar)", - "Este valor puede mejorar el rendimiento en función de tu CPU.", - { - { "1", NULL }, - { "2", NULL }, - { "4", NULL }, - { "8", NULL }, - { "16", NULL }, - { "32", NULL }, - { NULL, NULL}, - }, - "4" - }, -#endif - { NULL, NULL, NULL, {{0}}, NULL }, -}; - -/* RETRO_LANGUAGE_GERMAN */ - -/* RETRO_LANGUAGE_ITALIAN */ - -/* RETRO_LANGUAGE_DUTCH */ - -/* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ - -/* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ - -/* RETRO_LANGUAGE_RUSSIAN */ - -/* RETRO_LANGUAGE_KOREAN */ - -/* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ - -/* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ - -/* RETRO_LANGUAGE_ESPERANTO */ - -/* RETRO_LANGUAGE_POLISH */ - -/* RETRO_LANGUAGE_VIETNAMESE */ - -/* RETRO_LANGUAGE_ARABIC */ - -/* RETRO_LANGUAGE_GREEK */ - -/* RETRO_LANGUAGE_TURKISH */ - -struct retro_core_option_definition option_defs_tr[] = { - { - "yabause_frameskip", - "Kare Atlama", - "Kare atlamayı etkinleştirir, performansa yardımcı olması gerekir.", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled" - }, - { - "yabause_force_hle_bios", - "HLE BIOS'u zorla (Yeniden Başlatılmalı)", - "Kendi sorumluluğunuzda kullanın, çözdüğünden daha fazla soruna neden oluyor.", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled" - }, - { - "yabause_addon_cartridge", - "Kartuş Eklentisi (Yeniden Başlatılmalı)", - "Ek kartuşu seçin.", - { - { "none", NULL }, - { "1M_ram", NULL }, - { "4M_ram", NULL }, - { NULL, NULL}, - }, - "none" - }, - { - "yabause_multitap_port1", - "Bağlantı Noktası 1'deki 6Player Adaptörü", - "1. bağlantı noktasında multitap'ı etkinleştir", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled" - }, - { - "yabause_multitap_port2", - "Bağlantı Noktası 2'deki 6Player Adaptörü", - "2. bağlantı noktasında multitap'ı etkinleştir", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled" - }, -#ifdef HAVE_THREADS - { - "yabause_numthreads", - "İş Parçacığı Sayısı (Yeniden Başlatılmalı)", - "CPU'nuza bağlı olarak, bu değeri değiştirmek performansa yardımcı olabilir.", - { - { "1", NULL }, - { "2", NULL }, - { "4", NULL }, - { "8", NULL }, - { "16", NULL }, - { "32", NULL }, - { NULL, NULL}, - }, - "4" - }, -#endif - { NULL, NULL, NULL, {{0}}, NULL }, +struct retro_core_options_v2 options_us = { + option_cats_us, + option_defs_us }; /* @@ -300,27 +141,34 @@ struct retro_core_option_definition option_defs_tr[] = { ******************************** */ -struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = { - option_defs_us, /* RETRO_LANGUAGE_ENGLISH */ - NULL, /* RETRO_LANGUAGE_JAPANESE */ - NULL, /* RETRO_LANGUAGE_FRENCH */ - option_defs_es, /* RETRO_LANGUAGE_SPANISH */ - NULL, /* RETRO_LANGUAGE_GERMAN */ - NULL, /* RETRO_LANGUAGE_ITALIAN */ - NULL, /* RETRO_LANGUAGE_DUTCH */ - NULL, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ - NULL, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ - NULL, /* RETRO_LANGUAGE_RUSSIAN */ - NULL, /* RETRO_LANGUAGE_KOREAN */ - NULL, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ - NULL, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ - NULL, /* RETRO_LANGUAGE_ESPERANTO */ - NULL, /* RETRO_LANGUAGE_POLISH */ - NULL, /* RETRO_LANGUAGE_VIETNAMESE */ - NULL, /* RETRO_LANGUAGE_ARABIC */ - NULL, /* RETRO_LANGUAGE_GREEK */ - option_defs_tr, /* RETRO_LANGUAGE_TURKISH */ +#ifndef HAVE_NO_LANGEXTRA +struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST] = { + &options_us, /* RETRO_LANGUAGE_ENGLISH */ + &options_ja, /* RETRO_LANGUAGE_JAPANESE */ + &options_fr, /* RETRO_LANGUAGE_FRENCH */ + &options_es, /* RETRO_LANGUAGE_SPANISH */ + &options_de, /* RETRO_LANGUAGE_GERMAN */ + &options_it, /* RETRO_LANGUAGE_ITALIAN */ + &options_nl, /* RETRO_LANGUAGE_DUTCH */ + &options_pt_br, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ + &options_pt_pt, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ + &options_ru, /* RETRO_LANGUAGE_RUSSIAN */ + &options_ko, /* RETRO_LANGUAGE_KOREAN */ + &options_cht, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ + &options_chs, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ + &options_eo, /* RETRO_LANGUAGE_ESPERANTO */ + &options_pl, /* RETRO_LANGUAGE_POLISH */ + &options_vn, /* RETRO_LANGUAGE_VIETNAMESE */ + &options_ar, /* RETRO_LANGUAGE_ARABIC */ + &options_el, /* RETRO_LANGUAGE_GREEK */ + &options_tr, /* RETRO_LANGUAGE_TURKISH */ + &options_sv, /* RETRO_LANGUAGE_SLOVAK */ + &options_fa, /* RETRO_LANGUAGE_PERSIAN */ + &options_he, /* RETRO_LANGUAGE_HEBREW */ + &options_ast, /* RETRO_LANGUAGE_ASTURIAN */ + &options_fi, /* RETRO_LANGUAGE_FINNISH */ }; +#endif /* ******************************** @@ -335,35 +183,61 @@ struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = { * be as painless as possible for core devs) */ -static INLINE void libretro_set_core_options(retro_environment_t environ_cb) +static INLINE void libretro_set_core_options(retro_environment_t environ_cb, + bool *categories_supported) { - unsigned version = 0; + unsigned version = 0; +#ifndef HAVE_NO_LANGEXTRA + unsigned language = 0; +#endif - if (!environ_cb) + if (!environ_cb || !categories_supported) return; - if (environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version) && (version >= 1)) - { - struct retro_core_options_intl core_options_intl; - unsigned language = 0; + *categories_supported = false; - core_options_intl.us = option_defs_us; + if (!environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version)) + version = 0; + + if (version >= 2) + { +#ifndef HAVE_NO_LANGEXTRA + struct retro_core_options_v2_intl core_options_intl; + + core_options_intl.us = &options_us; core_options_intl.local = NULL; if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) && (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH)) - core_options_intl.local = option_defs_intl[language]; + core_options_intl.local = options_intl[language]; - environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_intl); + *categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL, + &core_options_intl); +#else + *categories_supported = environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2, + &options_us); +#endif } else { - size_t i; + size_t i, j; + size_t option_index = 0; size_t num_options = 0; + struct retro_core_option_definition + *option_v1_defs_us = NULL; +#ifndef HAVE_NO_LANGEXTRA + size_t num_options_intl = 0; + struct retro_core_option_v2_definition + *option_defs_intl = NULL; + struct retro_core_option_definition + *option_v1_defs_intl = NULL; + struct retro_core_options_intl + core_options_v1_intl; +#endif struct retro_variable *variables = NULL; char **values_buf = NULL; - /* Determine number of options */ + /* Determine total number of options */ while (true) { if (option_defs_us[num_options].key) @@ -372,86 +246,187 @@ static INLINE void libretro_set_core_options(retro_environment_t environ_cb) break; } - /* Allocate arrays */ - variables = (struct retro_variable *)calloc(num_options + 1, sizeof(struct retro_variable)); - values_buf = (char **)calloc(num_options, sizeof(char *)); - - if (!variables || !values_buf) - goto error; - - /* Copy parameters from option_defs_us array */ - for (i = 0; i < num_options; i++) + if (version >= 1) { - const char *key = option_defs_us[i].key; - const char *desc = option_defs_us[i].desc; - const char *default_value = option_defs_us[i].default_value; - struct retro_core_option_value *values = option_defs_us[i].values; - size_t buf_len = 3; - size_t default_index = 0; + /* Allocate US array */ + option_v1_defs_us = (struct retro_core_option_definition *) + calloc(num_options + 1, sizeof(struct retro_core_option_definition)); - values_buf[i] = NULL; - - if (desc) + /* Copy parameters from option_defs_us array */ + for (i = 0; i < num_options; i++) { - size_t num_values = 0; + struct retro_core_option_v2_definition *option_def_us = &option_defs_us[i]; + struct retro_core_option_value *option_values = option_def_us->values; + struct retro_core_option_definition *option_v1_def_us = &option_v1_defs_us[i]; + struct retro_core_option_value *option_v1_values = option_v1_def_us->values; - /* Determine number of values */ + option_v1_def_us->key = option_def_us->key; + option_v1_def_us->desc = option_def_us->desc; + option_v1_def_us->info = option_def_us->info; + option_v1_def_us->default_value = option_def_us->default_value; + + /* Values must be copied individually... */ + while (option_values->value) + { + option_v1_values->value = option_values->value; + option_v1_values->label = option_values->label; + + option_values++; + option_v1_values++; + } + } + +#ifndef HAVE_NO_LANGEXTRA + if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) && + (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH) && + options_intl[language]) + option_defs_intl = options_intl[language]->definitions; + + if (option_defs_intl) + { + /* Determine number of intl options */ while (true) { - if (values[num_values].value) - { - /* Check if this is the default value */ - if (default_value) - if (strcmp(values[num_values].value, default_value) == 0) - default_index = num_values; - - buf_len += strlen(values[num_values].value); - num_values++; - } + if (option_defs_intl[num_options_intl].key) + num_options_intl++; else break; } - /* Build values string */ - if (num_values > 0) + /* Allocate intl array */ + option_v1_defs_intl = (struct retro_core_option_definition *) + calloc(num_options_intl + 1, sizeof(struct retro_core_option_definition)); + + /* Copy parameters from option_defs_intl array */ + for (i = 0; i < num_options_intl; i++) { - size_t j; + struct retro_core_option_v2_definition *option_def_intl = &option_defs_intl[i]; + struct retro_core_option_value *option_values = option_def_intl->values; + struct retro_core_option_definition *option_v1_def_intl = &option_v1_defs_intl[i]; + struct retro_core_option_value *option_v1_values = option_v1_def_intl->values; - buf_len += num_values - 1; - buf_len += strlen(desc); + option_v1_def_intl->key = option_def_intl->key; + option_v1_def_intl->desc = option_def_intl->desc; + option_v1_def_intl->info = option_def_intl->info; + option_v1_def_intl->default_value = option_def_intl->default_value; - values_buf[i] = (char *)calloc(buf_len, sizeof(char)); - if (!values_buf[i]) - goto error; - - strcpy(values_buf[i], desc); - strcat(values_buf[i], "; "); - - /* Default value goes first */ - strcat(values_buf[i], values[default_index].value); - - /* Add remaining values */ - for (j = 0; j < num_values; j++) + /* Values must be copied individually... */ + while (option_values->value) { - if (j != default_index) - { - strcat(values_buf[i], "|"); - strcat(values_buf[i], values[j].value); - } + option_v1_values->value = option_values->value; + option_v1_values->label = option_values->label; + + option_values++; + option_v1_values++; } } } - variables[i].key = key; - variables[i].value = values_buf[i]; + core_options_v1_intl.us = option_v1_defs_us; + core_options_v1_intl.local = option_v1_defs_intl; + + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_v1_intl); +#else + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, option_v1_defs_us); +#endif + } + else + { + /* Allocate arrays */ + variables = (struct retro_variable *)calloc(num_options + 1, + sizeof(struct retro_variable)); + values_buf = (char **)calloc(num_options, sizeof(char *)); + + if (!variables || !values_buf) + goto error; + + /* Copy parameters from option_defs_us array */ + for (i = 0; i < num_options; i++) + { + const char *key = option_defs_us[i].key; + const char *desc = option_defs_us[i].desc; + const char *default_value = option_defs_us[i].default_value; + struct retro_core_option_value *values = option_defs_us[i].values; + size_t buf_len = 3; + size_t default_index = 0; + + values_buf[i] = NULL; + + if (desc) + { + size_t num_values = 0; + + /* Determine number of values */ + while (true) + { + if (values[num_values].value) + { + /* Check if this is the default value */ + if (default_value) + if (strcmp(values[num_values].value, default_value) == 0) + default_index = num_values; + + buf_len += strlen(values[num_values].value); + num_values++; + } + else + break; + } + + /* Build values string */ + if (num_values > 0) + { + buf_len += num_values - 1; + buf_len += strlen(desc); + + values_buf[i] = (char *)calloc(buf_len, sizeof(char)); + if (!values_buf[i]) + goto error; + + strcpy(values_buf[i], desc); + strcat(values_buf[i], "; "); + + /* Default value goes first */ + strcat(values_buf[i], values[default_index].value); + + /* Add remaining values */ + for (j = 0; j < num_values; j++) + { + if (j != default_index) + { + strcat(values_buf[i], "|"); + strcat(values_buf[i], values[j].value); + } + } + } + } + + variables[option_index].key = key; + variables[option_index].value = values_buf[i]; + option_index++; + } + + /* Set variables */ + environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables); } - - /* Set variables */ - environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables); error: - /* Clean up */ + + if (option_v1_defs_us) + { + free(option_v1_defs_us); + option_v1_defs_us = NULL; + } + +#ifndef HAVE_NO_LANGEXTRA + if (option_v1_defs_intl) + { + free(option_v1_defs_intl); + option_v1_defs_intl = NULL; + } +#endif + if (values_buf) { for (i = 0; i < num_options; i++) diff --git a/yabause/src/libretro/libretro_core_options_intl.h b/yabause/src/libretro/libretro_core_options_intl.h new file mode 100644 index 000000000..02ba67436 --- /dev/null +++ b/yabause/src/libretro/libretro_core_options_intl.h @@ -0,0 +1,4485 @@ +#ifndef LIBRETRO_CORE_OPTIONS_INTL_H__ +#define LIBRETRO_CORE_OPTIONS_INTL_H__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1500 && _MSC_VER < 1900) +/* https://support.microsoft.com/en-us/kb/980263 */ +#pragma execution_character_set("utf-8") +#pragma warning(disable:4566) +#endif + +#include + +/* + ******************************** + * VERSION: 2.0 + ******************************** + * + * - 2.0: Add support for core options v2 interface + * - 1.3: Move translations to libretro_core_options_intl.h + * - libretro_core_options_intl.h includes BOM and utf-8 + * fix for MSVC 2010-2013 + * - Added HAVE_NO_LANGEXTRA flag to disable translations + * on platforms/compilers without BOM support + * - 1.2: Use core options v1 interface when + * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1 + * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1) + * - 1.1: Support generation of core options v0 retro_core_option_value + * arrays containing options with a single value + * - 1.0: First commit +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + ******************************** + * Core Option Definitions + ******************************** +*/ +/* RETRO_LANGUAGE_AR */ + +#define YABAUSE_FRAMESKIP_LABEL_AR NULL +#define YABAUSE_FRAMESKIP_INFO_0_AR NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_AR NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_AR NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_AR NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_AR NULL +#define OPTION_VAL_NONE_AR NULL +#define OPTION_VAL_1M_RAM_AR NULL +#define OPTION_VAL_4M_RAM_AR NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_AR NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_AR NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_AR NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_AR NULL +#define YABAUSE_NUMTHREADS_LABEL_AR NULL +#define YABAUSE_NUMTHREADS_INFO_0_AR NULL + +struct retro_core_option_v2_category option_cats_ar[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ar[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_AR, + NULL, + YABAUSE_FRAMESKIP_INFO_0_AR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_AR, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_AR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_AR, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_AR, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_AR }, + { "1M_ram", OPTION_VAL_1M_RAM_AR }, + { "4M_ram", OPTION_VAL_4M_RAM_AR }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_AR, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_AR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_AR, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_AR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_AR, + NULL, + YABAUSE_NUMTHREADS_INFO_0_AR, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_ar = { + option_cats_ar, + option_defs_ar +}; + +/* RETRO_LANGUAGE_AST */ + +#define YABAUSE_FRAMESKIP_LABEL_AST NULL +#define YABAUSE_FRAMESKIP_INFO_0_AST NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_AST NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_AST NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_AST NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_AST NULL +#define OPTION_VAL_NONE_AST NULL +#define OPTION_VAL_1M_RAM_AST NULL +#define OPTION_VAL_4M_RAM_AST NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_AST NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_AST NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_AST NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_AST NULL +#define YABAUSE_NUMTHREADS_LABEL_AST NULL +#define YABAUSE_NUMTHREADS_INFO_0_AST NULL + +struct retro_core_option_v2_category option_cats_ast[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ast[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_AST, + NULL, + YABAUSE_FRAMESKIP_INFO_0_AST, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_AST, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_AST, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_AST, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_AST, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_AST }, + { "1M_ram", OPTION_VAL_1M_RAM_AST }, + { "4M_ram", OPTION_VAL_4M_RAM_AST }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_AST, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_AST, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_AST, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_AST, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_AST, + NULL, + YABAUSE_NUMTHREADS_INFO_0_AST, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_ast = { + option_cats_ast, + option_defs_ast +}; + +/* RETRO_LANGUAGE_CA */ + +#define YABAUSE_FRAMESKIP_LABEL_CA NULL +#define YABAUSE_FRAMESKIP_INFO_0_CA NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_CA NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_CA NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_CA NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_CA NULL +#define OPTION_VAL_NONE_CA NULL +#define OPTION_VAL_1M_RAM_CA NULL +#define OPTION_VAL_4M_RAM_CA NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_CA NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_CA NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_CA NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_CA NULL +#define YABAUSE_NUMTHREADS_LABEL_CA NULL +#define YABAUSE_NUMTHREADS_INFO_0_CA NULL + +struct retro_core_option_v2_category option_cats_ca[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ca[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_CA, + NULL, + YABAUSE_FRAMESKIP_INFO_0_CA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_CA, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_CA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_CA, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_CA, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_CA }, + { "1M_ram", OPTION_VAL_1M_RAM_CA }, + { "4M_ram", OPTION_VAL_4M_RAM_CA }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_CA, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_CA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_CA, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_CA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_CA, + NULL, + YABAUSE_NUMTHREADS_INFO_0_CA, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_ca = { + option_cats_ca, + option_defs_ca +}; + +/* RETRO_LANGUAGE_CHS */ + +#define YABAUSE_FRAMESKIP_LABEL_CHS NULL +#define YABAUSE_FRAMESKIP_INFO_0_CHS NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_CHS NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_CHS NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_CHS NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_CHS NULL +#define OPTION_VAL_NONE_CHS NULL +#define OPTION_VAL_1M_RAM_CHS NULL +#define OPTION_VAL_4M_RAM_CHS NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_CHS NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_CHS NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_CHS NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_CHS NULL +#define YABAUSE_NUMTHREADS_LABEL_CHS NULL +#define YABAUSE_NUMTHREADS_INFO_0_CHS NULL + +struct retro_core_option_v2_category option_cats_chs[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_chs[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_CHS, + NULL, + YABAUSE_FRAMESKIP_INFO_0_CHS, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_CHS, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_CHS, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_CHS, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_CHS, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_CHS }, + { "1M_ram", OPTION_VAL_1M_RAM_CHS }, + { "4M_ram", OPTION_VAL_4M_RAM_CHS }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_CHS, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_CHS, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_CHS, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_CHS, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_CHS, + NULL, + YABAUSE_NUMTHREADS_INFO_0_CHS, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_chs = { + option_cats_chs, + option_defs_chs +}; + +/* RETRO_LANGUAGE_CHT */ + +#define YABAUSE_FRAMESKIP_LABEL_CHT NULL +#define YABAUSE_FRAMESKIP_INFO_0_CHT NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_CHT NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_CHT NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_CHT NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_CHT NULL +#define OPTION_VAL_NONE_CHT NULL +#define OPTION_VAL_1M_RAM_CHT NULL +#define OPTION_VAL_4M_RAM_CHT NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_CHT NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_CHT NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_CHT NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_CHT NULL +#define YABAUSE_NUMTHREADS_LABEL_CHT NULL +#define YABAUSE_NUMTHREADS_INFO_0_CHT NULL + +struct retro_core_option_v2_category option_cats_cht[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_cht[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_CHT, + NULL, + YABAUSE_FRAMESKIP_INFO_0_CHT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_CHT, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_CHT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_CHT, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_CHT, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_CHT }, + { "1M_ram", OPTION_VAL_1M_RAM_CHT }, + { "4M_ram", OPTION_VAL_4M_RAM_CHT }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_CHT, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_CHT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_CHT, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_CHT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_CHT, + NULL, + YABAUSE_NUMTHREADS_INFO_0_CHT, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_cht = { + option_cats_cht, + option_defs_cht +}; + +/* RETRO_LANGUAGE_CS */ + +#define YABAUSE_FRAMESKIP_LABEL_CS NULL +#define YABAUSE_FRAMESKIP_INFO_0_CS NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_CS NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_CS NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_CS NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_CS NULL +#define OPTION_VAL_NONE_CS NULL +#define OPTION_VAL_1M_RAM_CS NULL +#define OPTION_VAL_4M_RAM_CS NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_CS NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_CS NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_CS NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_CS NULL +#define YABAUSE_NUMTHREADS_LABEL_CS NULL +#define YABAUSE_NUMTHREADS_INFO_0_CS NULL + +struct retro_core_option_v2_category option_cats_cs[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_cs[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_CS, + NULL, + YABAUSE_FRAMESKIP_INFO_0_CS, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_CS, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_CS, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_CS, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_CS, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_CS }, + { "1M_ram", OPTION_VAL_1M_RAM_CS }, + { "4M_ram", OPTION_VAL_4M_RAM_CS }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_CS, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_CS, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_CS, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_CS, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_CS, + NULL, + YABAUSE_NUMTHREADS_INFO_0_CS, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_cs = { + option_cats_cs, + option_defs_cs +}; + +/* RETRO_LANGUAGE_CY */ + +#define YABAUSE_FRAMESKIP_LABEL_CY NULL +#define YABAUSE_FRAMESKIP_INFO_0_CY NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_CY NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_CY NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_CY NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_CY NULL +#define OPTION_VAL_NONE_CY NULL +#define OPTION_VAL_1M_RAM_CY NULL +#define OPTION_VAL_4M_RAM_CY NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_CY NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_CY NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_CY NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_CY NULL +#define YABAUSE_NUMTHREADS_LABEL_CY NULL +#define YABAUSE_NUMTHREADS_INFO_0_CY NULL + +struct retro_core_option_v2_category option_cats_cy[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_cy[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_CY, + NULL, + YABAUSE_FRAMESKIP_INFO_0_CY, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_CY, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_CY, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_CY, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_CY, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_CY }, + { "1M_ram", OPTION_VAL_1M_RAM_CY }, + { "4M_ram", OPTION_VAL_4M_RAM_CY }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_CY, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_CY, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_CY, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_CY, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_CY, + NULL, + YABAUSE_NUMTHREADS_INFO_0_CY, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_cy = { + option_cats_cy, + option_defs_cy +}; + +/* RETRO_LANGUAGE_DA */ + +#define YABAUSE_FRAMESKIP_LABEL_DA NULL +#define YABAUSE_FRAMESKIP_INFO_0_DA NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_DA NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_DA NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_DA NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_DA NULL +#define OPTION_VAL_NONE_DA NULL +#define OPTION_VAL_1M_RAM_DA NULL +#define OPTION_VAL_4M_RAM_DA NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_DA NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_DA NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_DA NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_DA NULL +#define YABAUSE_NUMTHREADS_LABEL_DA NULL +#define YABAUSE_NUMTHREADS_INFO_0_DA NULL + +struct retro_core_option_v2_category option_cats_da[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_da[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_DA, + NULL, + YABAUSE_FRAMESKIP_INFO_0_DA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_DA, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_DA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_DA, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_DA, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_DA }, + { "1M_ram", OPTION_VAL_1M_RAM_DA }, + { "4M_ram", OPTION_VAL_4M_RAM_DA }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_DA, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_DA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_DA, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_DA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_DA, + NULL, + YABAUSE_NUMTHREADS_INFO_0_DA, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_da = { + option_cats_da, + option_defs_da +}; + +/* RETRO_LANGUAGE_DE */ + +#define YABAUSE_FRAMESKIP_LABEL_DE NULL +#define YABAUSE_FRAMESKIP_INFO_0_DE NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_DE NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_DE NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_DE NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_DE NULL +#define OPTION_VAL_NONE_DE NULL +#define OPTION_VAL_1M_RAM_DE NULL +#define OPTION_VAL_4M_RAM_DE NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_DE NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_DE NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_DE NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_DE NULL +#define YABAUSE_NUMTHREADS_LABEL_DE NULL +#define YABAUSE_NUMTHREADS_INFO_0_DE NULL + +struct retro_core_option_v2_category option_cats_de[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_de[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_DE, + NULL, + YABAUSE_FRAMESKIP_INFO_0_DE, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_DE, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_DE, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_DE, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_DE, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_DE }, + { "1M_ram", OPTION_VAL_1M_RAM_DE }, + { "4M_ram", OPTION_VAL_4M_RAM_DE }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_DE, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_DE, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_DE, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_DE, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_DE, + NULL, + YABAUSE_NUMTHREADS_INFO_0_DE, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_de = { + option_cats_de, + option_defs_de +}; + +/* RETRO_LANGUAGE_EL */ + +#define YABAUSE_FRAMESKIP_LABEL_EL NULL +#define YABAUSE_FRAMESKIP_INFO_0_EL NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_EL NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_EL NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_EL NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_EL NULL +#define OPTION_VAL_NONE_EL NULL +#define OPTION_VAL_1M_RAM_EL NULL +#define OPTION_VAL_4M_RAM_EL NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_EL NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_EL NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_EL NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_EL NULL +#define YABAUSE_NUMTHREADS_LABEL_EL NULL +#define YABAUSE_NUMTHREADS_INFO_0_EL NULL + +struct retro_core_option_v2_category option_cats_el[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_el[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_EL, + NULL, + YABAUSE_FRAMESKIP_INFO_0_EL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_EL, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_EL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_EL, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_EL, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_EL }, + { "1M_ram", OPTION_VAL_1M_RAM_EL }, + { "4M_ram", OPTION_VAL_4M_RAM_EL }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_EL, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_EL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_EL, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_EL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_EL, + NULL, + YABAUSE_NUMTHREADS_INFO_0_EL, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_el = { + option_cats_el, + option_defs_el +}; + +/* RETRO_LANGUAGE_EO */ + +#define YABAUSE_FRAMESKIP_LABEL_EO NULL +#define YABAUSE_FRAMESKIP_INFO_0_EO NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_EO NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_EO NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_EO NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_EO NULL +#define OPTION_VAL_NONE_EO NULL +#define OPTION_VAL_1M_RAM_EO NULL +#define OPTION_VAL_4M_RAM_EO NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_EO NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_EO NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_EO NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_EO NULL +#define YABAUSE_NUMTHREADS_LABEL_EO NULL +#define YABAUSE_NUMTHREADS_INFO_0_EO NULL + +struct retro_core_option_v2_category option_cats_eo[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_eo[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_EO, + NULL, + YABAUSE_FRAMESKIP_INFO_0_EO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_EO, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_EO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_EO, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_EO, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_EO }, + { "1M_ram", OPTION_VAL_1M_RAM_EO }, + { "4M_ram", OPTION_VAL_4M_RAM_EO }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_EO, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_EO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_EO, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_EO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_EO, + NULL, + YABAUSE_NUMTHREADS_INFO_0_EO, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_eo = { + option_cats_eo, + option_defs_eo +}; + +/* RETRO_LANGUAGE_ES */ + +#define YABAUSE_FRAMESKIP_LABEL_ES "Omisión de fotogramas" +#define YABAUSE_FRAMESKIP_INFO_0_ES "Activa la omisión de fotogramas. Debería mejorar el rendimiento." +#define YABAUSE_FORCE_HLE_BIOS_LABEL_ES "Forzar BIOS HLE (es necesario reiniciar)" +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_ES "Utiliza esta opción por tu cuenta y riesgo, ya que produce más problemas de los que resuelve." +#define YABAUSE_ADDON_CARTRIDGE_LABEL_ES "Cartucho de expansión (es necesario reiniciar)" +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_ES "Selecciona el cartucho de ampliación." +#define OPTION_VAL_NONE_ES NULL +#define OPTION_VAL_1M_RAM_ES "RAM de 1 MB" +#define OPTION_VAL_4M_RAM_ES "RAM de 4 MB" +#define YABAUSE_MULTITAP_PORT1_LABEL_ES "Adaptador para seis jugadores en el puerto 1" +#define YABAUSE_MULTITAP_PORT1_INFO_0_ES "Activar un multitap en el puerto 1." +#define YABAUSE_MULTITAP_PORT2_LABEL_ES "Adaptador para seis jugadores en el puerto 2" +#define YABAUSE_MULTITAP_PORT2_INFO_0_ES "Activar un multitap en el puerto 2." +#define YABAUSE_NUMTHREADS_LABEL_ES "Número de hilos (es necesario reiniciar)" +#define YABAUSE_NUMTHREADS_INFO_0_ES "Este valor puede mejorar el rendimiento en función de tu CPU." + +struct retro_core_option_v2_category option_cats_es[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_es[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_ES, + NULL, + YABAUSE_FRAMESKIP_INFO_0_ES, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_ES, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_ES, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_ES, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_ES, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_ES }, + { "1M_ram", OPTION_VAL_1M_RAM_ES }, + { "4M_ram", OPTION_VAL_4M_RAM_ES }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_ES, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_ES, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_ES, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_ES, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_ES, + NULL, + YABAUSE_NUMTHREADS_INFO_0_ES, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_es = { + option_cats_es, + option_defs_es +}; + +/* RETRO_LANGUAGE_FA */ + +#define YABAUSE_FRAMESKIP_LABEL_FA NULL +#define YABAUSE_FRAMESKIP_INFO_0_FA NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_FA NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_FA NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_FA NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_FA NULL +#define OPTION_VAL_NONE_FA NULL +#define OPTION_VAL_1M_RAM_FA NULL +#define OPTION_VAL_4M_RAM_FA NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_FA NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_FA NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_FA NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_FA NULL +#define YABAUSE_NUMTHREADS_LABEL_FA NULL +#define YABAUSE_NUMTHREADS_INFO_0_FA NULL + +struct retro_core_option_v2_category option_cats_fa[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_fa[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_FA, + NULL, + YABAUSE_FRAMESKIP_INFO_0_FA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_FA, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_FA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_FA, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_FA, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_FA }, + { "1M_ram", OPTION_VAL_1M_RAM_FA }, + { "4M_ram", OPTION_VAL_4M_RAM_FA }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_FA, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_FA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_FA, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_FA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_FA, + NULL, + YABAUSE_NUMTHREADS_INFO_0_FA, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_fa = { + option_cats_fa, + option_defs_fa +}; + +/* RETRO_LANGUAGE_FI */ + +#define YABAUSE_FRAMESKIP_LABEL_FI NULL +#define YABAUSE_FRAMESKIP_INFO_0_FI NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_FI NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_FI NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_FI NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_FI NULL +#define OPTION_VAL_NONE_FI NULL +#define OPTION_VAL_1M_RAM_FI NULL +#define OPTION_VAL_4M_RAM_FI NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_FI NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_FI NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_FI NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_FI NULL +#define YABAUSE_NUMTHREADS_LABEL_FI NULL +#define YABAUSE_NUMTHREADS_INFO_0_FI NULL + +struct retro_core_option_v2_category option_cats_fi[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_fi[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_FI, + NULL, + YABAUSE_FRAMESKIP_INFO_0_FI, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_FI, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_FI, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_FI, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_FI, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_FI }, + { "1M_ram", OPTION_VAL_1M_RAM_FI }, + { "4M_ram", OPTION_VAL_4M_RAM_FI }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_FI, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_FI, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_FI, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_FI, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_FI, + NULL, + YABAUSE_NUMTHREADS_INFO_0_FI, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_fi = { + option_cats_fi, + option_defs_fi +}; + +/* RETRO_LANGUAGE_FR */ + +#define YABAUSE_FRAMESKIP_LABEL_FR NULL +#define YABAUSE_FRAMESKIP_INFO_0_FR NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_FR NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_FR NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_FR NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_FR NULL +#define OPTION_VAL_NONE_FR NULL +#define OPTION_VAL_1M_RAM_FR NULL +#define OPTION_VAL_4M_RAM_FR NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_FR NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_FR NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_FR NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_FR NULL +#define YABAUSE_NUMTHREADS_LABEL_FR NULL +#define YABAUSE_NUMTHREADS_INFO_0_FR NULL + +struct retro_core_option_v2_category option_cats_fr[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_fr[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_FR, + NULL, + YABAUSE_FRAMESKIP_INFO_0_FR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_FR, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_FR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_FR, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_FR, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_FR }, + { "1M_ram", OPTION_VAL_1M_RAM_FR }, + { "4M_ram", OPTION_VAL_4M_RAM_FR }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_FR, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_FR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_FR, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_FR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_FR, + NULL, + YABAUSE_NUMTHREADS_INFO_0_FR, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_fr = { + option_cats_fr, + option_defs_fr +}; + +/* RETRO_LANGUAGE_GL */ + +#define YABAUSE_FRAMESKIP_LABEL_GL NULL +#define YABAUSE_FRAMESKIP_INFO_0_GL NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_GL NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_GL NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_GL NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_GL NULL +#define OPTION_VAL_NONE_GL NULL +#define OPTION_VAL_1M_RAM_GL NULL +#define OPTION_VAL_4M_RAM_GL NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_GL NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_GL NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_GL NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_GL NULL +#define YABAUSE_NUMTHREADS_LABEL_GL NULL +#define YABAUSE_NUMTHREADS_INFO_0_GL NULL + +struct retro_core_option_v2_category option_cats_gl[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_gl[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_GL, + NULL, + YABAUSE_FRAMESKIP_INFO_0_GL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_GL, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_GL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_GL, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_GL, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_GL }, + { "1M_ram", OPTION_VAL_1M_RAM_GL }, + { "4M_ram", OPTION_VAL_4M_RAM_GL }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_GL, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_GL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_GL, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_GL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_GL, + NULL, + YABAUSE_NUMTHREADS_INFO_0_GL, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_gl = { + option_cats_gl, + option_defs_gl +}; + +/* RETRO_LANGUAGE_HE */ + +#define YABAUSE_FRAMESKIP_LABEL_HE NULL +#define YABAUSE_FRAMESKIP_INFO_0_HE NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_HE NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_HE NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_HE NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_HE NULL +#define OPTION_VAL_NONE_HE NULL +#define OPTION_VAL_1M_RAM_HE NULL +#define OPTION_VAL_4M_RAM_HE NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_HE NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_HE NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_HE NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_HE NULL +#define YABAUSE_NUMTHREADS_LABEL_HE NULL +#define YABAUSE_NUMTHREADS_INFO_0_HE NULL + +struct retro_core_option_v2_category option_cats_he[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_he[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_HE, + NULL, + YABAUSE_FRAMESKIP_INFO_0_HE, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_HE, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_HE, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_HE, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_HE, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_HE }, + { "1M_ram", OPTION_VAL_1M_RAM_HE }, + { "4M_ram", OPTION_VAL_4M_RAM_HE }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_HE, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_HE, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_HE, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_HE, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_HE, + NULL, + YABAUSE_NUMTHREADS_INFO_0_HE, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_he = { + option_cats_he, + option_defs_he +}; + +/* RETRO_LANGUAGE_HU */ + +#define YABAUSE_FRAMESKIP_LABEL_HU NULL +#define YABAUSE_FRAMESKIP_INFO_0_HU NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_HU NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_HU NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_HU NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_HU NULL +#define OPTION_VAL_NONE_HU NULL +#define OPTION_VAL_1M_RAM_HU NULL +#define OPTION_VAL_4M_RAM_HU NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_HU NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_HU NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_HU NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_HU NULL +#define YABAUSE_NUMTHREADS_LABEL_HU NULL +#define YABAUSE_NUMTHREADS_INFO_0_HU NULL + +struct retro_core_option_v2_category option_cats_hu[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_hu[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_HU, + NULL, + YABAUSE_FRAMESKIP_INFO_0_HU, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_HU, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_HU, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_HU, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_HU, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_HU }, + { "1M_ram", OPTION_VAL_1M_RAM_HU }, + { "4M_ram", OPTION_VAL_4M_RAM_HU }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_HU, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_HU, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_HU, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_HU, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_HU, + NULL, + YABAUSE_NUMTHREADS_INFO_0_HU, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_hu = { + option_cats_hu, + option_defs_hu +}; + +/* RETRO_LANGUAGE_ID */ + +#define YABAUSE_FRAMESKIP_LABEL_ID NULL +#define YABAUSE_FRAMESKIP_INFO_0_ID NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_ID NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_ID NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_ID NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_ID NULL +#define OPTION_VAL_NONE_ID NULL +#define OPTION_VAL_1M_RAM_ID NULL +#define OPTION_VAL_4M_RAM_ID NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_ID NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_ID NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_ID NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_ID NULL +#define YABAUSE_NUMTHREADS_LABEL_ID NULL +#define YABAUSE_NUMTHREADS_INFO_0_ID NULL + +struct retro_core_option_v2_category option_cats_id[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_id[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_ID, + NULL, + YABAUSE_FRAMESKIP_INFO_0_ID, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_ID, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_ID, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_ID, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_ID, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_ID }, + { "1M_ram", OPTION_VAL_1M_RAM_ID }, + { "4M_ram", OPTION_VAL_4M_RAM_ID }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_ID, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_ID, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_ID, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_ID, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_ID, + NULL, + YABAUSE_NUMTHREADS_INFO_0_ID, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_id = { + option_cats_id, + option_defs_id +}; + +/* RETRO_LANGUAGE_IT */ + +#define YABAUSE_FRAMESKIP_LABEL_IT NULL +#define YABAUSE_FRAMESKIP_INFO_0_IT NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_IT NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_IT NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_IT NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_IT NULL +#define OPTION_VAL_NONE_IT NULL +#define OPTION_VAL_1M_RAM_IT NULL +#define OPTION_VAL_4M_RAM_IT NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_IT NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_IT NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_IT NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_IT NULL +#define YABAUSE_NUMTHREADS_LABEL_IT NULL +#define YABAUSE_NUMTHREADS_INFO_0_IT NULL + +struct retro_core_option_v2_category option_cats_it[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_it[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_IT, + NULL, + YABAUSE_FRAMESKIP_INFO_0_IT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_IT, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_IT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_IT, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_IT, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_IT }, + { "1M_ram", OPTION_VAL_1M_RAM_IT }, + { "4M_ram", OPTION_VAL_4M_RAM_IT }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_IT, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_IT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_IT, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_IT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_IT, + NULL, + YABAUSE_NUMTHREADS_INFO_0_IT, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_it = { + option_cats_it, + option_defs_it +}; + +/* RETRO_LANGUAGE_JA */ + +#define YABAUSE_FRAMESKIP_LABEL_JA NULL +#define YABAUSE_FRAMESKIP_INFO_0_JA NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_JA NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_JA NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_JA NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_JA NULL +#define OPTION_VAL_NONE_JA NULL +#define OPTION_VAL_1M_RAM_JA NULL +#define OPTION_VAL_4M_RAM_JA NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_JA NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_JA NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_JA NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_JA NULL +#define YABAUSE_NUMTHREADS_LABEL_JA NULL +#define YABAUSE_NUMTHREADS_INFO_0_JA NULL + +struct retro_core_option_v2_category option_cats_ja[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ja[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_JA, + NULL, + YABAUSE_FRAMESKIP_INFO_0_JA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_JA, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_JA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_JA, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_JA, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_JA }, + { "1M_ram", OPTION_VAL_1M_RAM_JA }, + { "4M_ram", OPTION_VAL_4M_RAM_JA }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_JA, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_JA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_JA, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_JA, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_JA, + NULL, + YABAUSE_NUMTHREADS_INFO_0_JA, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_ja = { + option_cats_ja, + option_defs_ja +}; + +/* RETRO_LANGUAGE_KO */ + +#define YABAUSE_FRAMESKIP_LABEL_KO NULL +#define YABAUSE_FRAMESKIP_INFO_0_KO NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_KO NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_KO NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_KO NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_KO NULL +#define OPTION_VAL_NONE_KO NULL +#define OPTION_VAL_1M_RAM_KO NULL +#define OPTION_VAL_4M_RAM_KO NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_KO NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_KO NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_KO NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_KO NULL +#define YABAUSE_NUMTHREADS_LABEL_KO NULL +#define YABAUSE_NUMTHREADS_INFO_0_KO NULL + +struct retro_core_option_v2_category option_cats_ko[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ko[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_KO, + NULL, + YABAUSE_FRAMESKIP_INFO_0_KO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_KO, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_KO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_KO, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_KO, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_KO }, + { "1M_ram", OPTION_VAL_1M_RAM_KO }, + { "4M_ram", OPTION_VAL_4M_RAM_KO }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_KO, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_KO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_KO, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_KO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_KO, + NULL, + YABAUSE_NUMTHREADS_INFO_0_KO, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_ko = { + option_cats_ko, + option_defs_ko +}; + +/* RETRO_LANGUAGE_MT */ + +#define YABAUSE_FRAMESKIP_LABEL_MT NULL +#define YABAUSE_FRAMESKIP_INFO_0_MT NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_MT NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_MT NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_MT NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_MT NULL +#define OPTION_VAL_NONE_MT NULL +#define OPTION_VAL_1M_RAM_MT NULL +#define OPTION_VAL_4M_RAM_MT NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_MT NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_MT NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_MT NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_MT NULL +#define YABAUSE_NUMTHREADS_LABEL_MT NULL +#define YABAUSE_NUMTHREADS_INFO_0_MT NULL + +struct retro_core_option_v2_category option_cats_mt[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_mt[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_MT, + NULL, + YABAUSE_FRAMESKIP_INFO_0_MT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_MT, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_MT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_MT, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_MT, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_MT }, + { "1M_ram", OPTION_VAL_1M_RAM_MT }, + { "4M_ram", OPTION_VAL_4M_RAM_MT }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_MT, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_MT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_MT, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_MT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_MT, + NULL, + YABAUSE_NUMTHREADS_INFO_0_MT, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_mt = { + option_cats_mt, + option_defs_mt +}; + +/* RETRO_LANGUAGE_NL */ + +#define YABAUSE_FRAMESKIP_LABEL_NL NULL +#define YABAUSE_FRAMESKIP_INFO_0_NL NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_NL NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_NL NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_NL NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_NL NULL +#define OPTION_VAL_NONE_NL NULL +#define OPTION_VAL_1M_RAM_NL NULL +#define OPTION_VAL_4M_RAM_NL NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_NL NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_NL NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_NL NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_NL NULL +#define YABAUSE_NUMTHREADS_LABEL_NL NULL +#define YABAUSE_NUMTHREADS_INFO_0_NL NULL + +struct retro_core_option_v2_category option_cats_nl[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_nl[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_NL, + NULL, + YABAUSE_FRAMESKIP_INFO_0_NL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_NL, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_NL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_NL, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_NL, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_NL }, + { "1M_ram", OPTION_VAL_1M_RAM_NL }, + { "4M_ram", OPTION_VAL_4M_RAM_NL }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_NL, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_NL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_NL, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_NL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_NL, + NULL, + YABAUSE_NUMTHREADS_INFO_0_NL, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_nl = { + option_cats_nl, + option_defs_nl +}; + +/* RETRO_LANGUAGE_OC */ + +#define YABAUSE_FRAMESKIP_LABEL_OC NULL +#define YABAUSE_FRAMESKIP_INFO_0_OC NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_OC NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_OC NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_OC NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_OC NULL +#define OPTION_VAL_NONE_OC NULL +#define OPTION_VAL_1M_RAM_OC NULL +#define OPTION_VAL_4M_RAM_OC NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_OC NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_OC NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_OC NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_OC NULL +#define YABAUSE_NUMTHREADS_LABEL_OC NULL +#define YABAUSE_NUMTHREADS_INFO_0_OC NULL + +struct retro_core_option_v2_category option_cats_oc[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_oc[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_OC, + NULL, + YABAUSE_FRAMESKIP_INFO_0_OC, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_OC, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_OC, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_OC, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_OC, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_OC }, + { "1M_ram", OPTION_VAL_1M_RAM_OC }, + { "4M_ram", OPTION_VAL_4M_RAM_OC }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_OC, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_OC, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_OC, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_OC, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_OC, + NULL, + YABAUSE_NUMTHREADS_INFO_0_OC, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_oc = { + option_cats_oc, + option_defs_oc +}; + +/* RETRO_LANGUAGE_PL */ + +#define YABAUSE_FRAMESKIP_LABEL_PL NULL +#define YABAUSE_FRAMESKIP_INFO_0_PL NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_PL NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_PL NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_PL NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_PL NULL +#define OPTION_VAL_NONE_PL NULL +#define OPTION_VAL_1M_RAM_PL NULL +#define OPTION_VAL_4M_RAM_PL NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_PL NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_PL NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_PL NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_PL NULL +#define YABAUSE_NUMTHREADS_LABEL_PL NULL +#define YABAUSE_NUMTHREADS_INFO_0_PL NULL + +struct retro_core_option_v2_category option_cats_pl[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_pl[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_PL, + NULL, + YABAUSE_FRAMESKIP_INFO_0_PL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_PL, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_PL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_PL, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_PL, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_PL }, + { "1M_ram", OPTION_VAL_1M_RAM_PL }, + { "4M_ram", OPTION_VAL_4M_RAM_PL }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_PL, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_PL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_PL, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_PL, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_PL, + NULL, + YABAUSE_NUMTHREADS_INFO_0_PL, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_pl = { + option_cats_pl, + option_defs_pl +}; + +/* RETRO_LANGUAGE_PT_BR */ + +#define YABAUSE_FRAMESKIP_LABEL_PT_BR NULL +#define YABAUSE_FRAMESKIP_INFO_0_PT_BR NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_PT_BR NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_PT_BR NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_PT_BR NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_PT_BR NULL +#define OPTION_VAL_NONE_PT_BR NULL +#define OPTION_VAL_1M_RAM_PT_BR NULL +#define OPTION_VAL_4M_RAM_PT_BR NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_PT_BR NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_PT_BR NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_PT_BR NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_PT_BR NULL +#define YABAUSE_NUMTHREADS_LABEL_PT_BR NULL +#define YABAUSE_NUMTHREADS_INFO_0_PT_BR NULL + +struct retro_core_option_v2_category option_cats_pt_br[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_pt_br[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_PT_BR, + NULL, + YABAUSE_FRAMESKIP_INFO_0_PT_BR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_PT_BR, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_PT_BR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_PT_BR, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_PT_BR, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_PT_BR }, + { "1M_ram", OPTION_VAL_1M_RAM_PT_BR }, + { "4M_ram", OPTION_VAL_4M_RAM_PT_BR }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_PT_BR, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_PT_BR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_PT_BR, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_PT_BR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_PT_BR, + NULL, + YABAUSE_NUMTHREADS_INFO_0_PT_BR, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_pt_br = { + option_cats_pt_br, + option_defs_pt_br +}; + +/* RETRO_LANGUAGE_PT_PT */ + +#define YABAUSE_FRAMESKIP_LABEL_PT_PT NULL +#define YABAUSE_FRAMESKIP_INFO_0_PT_PT NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_PT_PT NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_PT_PT NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_PT_PT NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_PT_PT NULL +#define OPTION_VAL_NONE_PT_PT NULL +#define OPTION_VAL_1M_RAM_PT_PT NULL +#define OPTION_VAL_4M_RAM_PT_PT NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_PT_PT NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_PT_PT NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_PT_PT NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_PT_PT NULL +#define YABAUSE_NUMTHREADS_LABEL_PT_PT NULL +#define YABAUSE_NUMTHREADS_INFO_0_PT_PT NULL + +struct retro_core_option_v2_category option_cats_pt_pt[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_pt_pt[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_PT_PT, + NULL, + YABAUSE_FRAMESKIP_INFO_0_PT_PT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_PT_PT, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_PT_PT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_PT_PT, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_PT_PT, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_PT_PT }, + { "1M_ram", OPTION_VAL_1M_RAM_PT_PT }, + { "4M_ram", OPTION_VAL_4M_RAM_PT_PT }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_PT_PT, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_PT_PT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_PT_PT, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_PT_PT, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_PT_PT, + NULL, + YABAUSE_NUMTHREADS_INFO_0_PT_PT, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_pt_pt = { + option_cats_pt_pt, + option_defs_pt_pt +}; + +/* RETRO_LANGUAGE_RO */ + +#define YABAUSE_FRAMESKIP_LABEL_RO NULL +#define YABAUSE_FRAMESKIP_INFO_0_RO NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_RO NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_RO NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_RO NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_RO NULL +#define OPTION_VAL_NONE_RO NULL +#define OPTION_VAL_1M_RAM_RO NULL +#define OPTION_VAL_4M_RAM_RO NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_RO NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_RO NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_RO NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_RO NULL +#define YABAUSE_NUMTHREADS_LABEL_RO NULL +#define YABAUSE_NUMTHREADS_INFO_0_RO NULL + +struct retro_core_option_v2_category option_cats_ro[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ro[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_RO, + NULL, + YABAUSE_FRAMESKIP_INFO_0_RO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_RO, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_RO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_RO, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_RO, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_RO }, + { "1M_ram", OPTION_VAL_1M_RAM_RO }, + { "4M_ram", OPTION_VAL_4M_RAM_RO }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_RO, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_RO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_RO, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_RO, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_RO, + NULL, + YABAUSE_NUMTHREADS_INFO_0_RO, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_ro = { + option_cats_ro, + option_defs_ro +}; + +/* RETRO_LANGUAGE_RU */ + +#define YABAUSE_FRAMESKIP_LABEL_RU NULL +#define YABAUSE_FRAMESKIP_INFO_0_RU NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_RU NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_RU NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_RU NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_RU NULL +#define OPTION_VAL_NONE_RU NULL +#define OPTION_VAL_1M_RAM_RU NULL +#define OPTION_VAL_4M_RAM_RU NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_RU NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_RU NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_RU NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_RU NULL +#define YABAUSE_NUMTHREADS_LABEL_RU NULL +#define YABAUSE_NUMTHREADS_INFO_0_RU NULL + +struct retro_core_option_v2_category option_cats_ru[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ru[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_RU, + NULL, + YABAUSE_FRAMESKIP_INFO_0_RU, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_RU, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_RU, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_RU, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_RU, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_RU }, + { "1M_ram", OPTION_VAL_1M_RAM_RU }, + { "4M_ram", OPTION_VAL_4M_RAM_RU }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_RU, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_RU, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_RU, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_RU, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_RU, + NULL, + YABAUSE_NUMTHREADS_INFO_0_RU, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_ru = { + option_cats_ru, + option_defs_ru +}; + +/* RETRO_LANGUAGE_SI */ + +#define YABAUSE_FRAMESKIP_LABEL_SI NULL +#define YABAUSE_FRAMESKIP_INFO_0_SI NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_SI NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_SI NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_SI NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_SI NULL +#define OPTION_VAL_NONE_SI NULL +#define OPTION_VAL_1M_RAM_SI NULL +#define OPTION_VAL_4M_RAM_SI NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_SI NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_SI NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_SI NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_SI NULL +#define YABAUSE_NUMTHREADS_LABEL_SI NULL +#define YABAUSE_NUMTHREADS_INFO_0_SI NULL + +struct retro_core_option_v2_category option_cats_si[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_si[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_SI, + NULL, + YABAUSE_FRAMESKIP_INFO_0_SI, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_SI, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_SI, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_SI, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_SI, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_SI }, + { "1M_ram", OPTION_VAL_1M_RAM_SI }, + { "4M_ram", OPTION_VAL_4M_RAM_SI }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_SI, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_SI, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_SI, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_SI, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_SI, + NULL, + YABAUSE_NUMTHREADS_INFO_0_SI, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_si = { + option_cats_si, + option_defs_si +}; + +/* RETRO_LANGUAGE_SK */ + +#define YABAUSE_FRAMESKIP_LABEL_SK NULL +#define YABAUSE_FRAMESKIP_INFO_0_SK NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_SK NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_SK NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_SK NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_SK NULL +#define OPTION_VAL_NONE_SK NULL +#define OPTION_VAL_1M_RAM_SK NULL +#define OPTION_VAL_4M_RAM_SK NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_SK NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_SK NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_SK NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_SK NULL +#define YABAUSE_NUMTHREADS_LABEL_SK NULL +#define YABAUSE_NUMTHREADS_INFO_0_SK NULL + +struct retro_core_option_v2_category option_cats_sk[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_sk[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_SK, + NULL, + YABAUSE_FRAMESKIP_INFO_0_SK, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_SK, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_SK, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_SK, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_SK, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_SK }, + { "1M_ram", OPTION_VAL_1M_RAM_SK }, + { "4M_ram", OPTION_VAL_4M_RAM_SK }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_SK, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_SK, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_SK, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_SK, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_SK, + NULL, + YABAUSE_NUMTHREADS_INFO_0_SK, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_sk = { + option_cats_sk, + option_defs_sk +}; + +/* RETRO_LANGUAGE_SR */ + +#define YABAUSE_FRAMESKIP_LABEL_SR NULL +#define YABAUSE_FRAMESKIP_INFO_0_SR NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_SR NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_SR NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_SR NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_SR NULL +#define OPTION_VAL_NONE_SR NULL +#define OPTION_VAL_1M_RAM_SR NULL +#define OPTION_VAL_4M_RAM_SR NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_SR NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_SR NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_SR NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_SR NULL +#define YABAUSE_NUMTHREADS_LABEL_SR NULL +#define YABAUSE_NUMTHREADS_INFO_0_SR NULL + +struct retro_core_option_v2_category option_cats_sr[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_sr[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_SR, + NULL, + YABAUSE_FRAMESKIP_INFO_0_SR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_SR, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_SR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_SR, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_SR, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_SR }, + { "1M_ram", OPTION_VAL_1M_RAM_SR }, + { "4M_ram", OPTION_VAL_4M_RAM_SR }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_SR, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_SR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_SR, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_SR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_SR, + NULL, + YABAUSE_NUMTHREADS_INFO_0_SR, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_sr = { + option_cats_sr, + option_defs_sr +}; + +/* RETRO_LANGUAGE_SV */ + +#define YABAUSE_FRAMESKIP_LABEL_SV NULL +#define YABAUSE_FRAMESKIP_INFO_0_SV NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_SV NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_SV NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_SV NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_SV NULL +#define OPTION_VAL_NONE_SV NULL +#define OPTION_VAL_1M_RAM_SV NULL +#define OPTION_VAL_4M_RAM_SV NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_SV NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_SV NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_SV NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_SV NULL +#define YABAUSE_NUMTHREADS_LABEL_SV NULL +#define YABAUSE_NUMTHREADS_INFO_0_SV NULL + +struct retro_core_option_v2_category option_cats_sv[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_sv[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_SV, + NULL, + YABAUSE_FRAMESKIP_INFO_0_SV, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_SV, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_SV, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_SV, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_SV, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_SV }, + { "1M_ram", OPTION_VAL_1M_RAM_SV }, + { "4M_ram", OPTION_VAL_4M_RAM_SV }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_SV, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_SV, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_SV, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_SV, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_SV, + NULL, + YABAUSE_NUMTHREADS_INFO_0_SV, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_sv = { + option_cats_sv, + option_defs_sv +}; + +/* RETRO_LANGUAGE_TR */ + +#define YABAUSE_FRAMESKIP_LABEL_TR "Kare Atlama" +#define YABAUSE_FRAMESKIP_INFO_0_TR "Kare atlamayı etkinleştirir, performansa yardımcı olması gerekir." +#define YABAUSE_FORCE_HLE_BIOS_LABEL_TR "HLE BIOS'u zorla (Yeniden Başlatılmalı)" +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_TR "Kendi sorumluluğunuzda kullanın, çözdüğünden daha fazla soruna neden oluyor." +#define YABAUSE_ADDON_CARTRIDGE_LABEL_TR "Kartuş Eklentisi (Yeniden Başlatılmalı)" +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_TR "Ek kartuşu seçin." +#define OPTION_VAL_NONE_TR NULL +#define OPTION_VAL_1M_RAM_TR NULL +#define OPTION_VAL_4M_RAM_TR NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_TR "Bağlantı Noktası 1'deki 6Player Adaptörü" +#define YABAUSE_MULTITAP_PORT1_INFO_0_TR "1. bağlantı noktasında multitap'ı etkinleştir" +#define YABAUSE_MULTITAP_PORT2_LABEL_TR "Bağlantı Noktası 2'deki 6Player Adaptörü" +#define YABAUSE_MULTITAP_PORT2_INFO_0_TR "2. bağlantı noktasında multitap'ı etkinleştir" +#define YABAUSE_NUMTHREADS_LABEL_TR "İş Parçacığı Sayısı (Yeniden Başlatılmalı)" +#define YABAUSE_NUMTHREADS_INFO_0_TR "CPU'nuza bağlı olarak, bu değeri değiştirmek performansa yardımcı olabilir." + +struct retro_core_option_v2_category option_cats_tr[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_tr[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_TR, + NULL, + YABAUSE_FRAMESKIP_INFO_0_TR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_TR, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_TR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_TR, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_TR, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_TR }, + { "1M_ram", OPTION_VAL_1M_RAM_TR }, + { "4M_ram", OPTION_VAL_4M_RAM_TR }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_TR, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_TR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_TR, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_TR, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_TR, + NULL, + YABAUSE_NUMTHREADS_INFO_0_TR, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_tr = { + option_cats_tr, + option_defs_tr +}; + +/* RETRO_LANGUAGE_UK */ + +#define YABAUSE_FRAMESKIP_LABEL_UK NULL +#define YABAUSE_FRAMESKIP_INFO_0_UK NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_UK NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_UK NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_UK NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_UK NULL +#define OPTION_VAL_NONE_UK NULL +#define OPTION_VAL_1M_RAM_UK NULL +#define OPTION_VAL_4M_RAM_UK NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_UK NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_UK NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_UK NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_UK NULL +#define YABAUSE_NUMTHREADS_LABEL_UK NULL +#define YABAUSE_NUMTHREADS_INFO_0_UK NULL + +struct retro_core_option_v2_category option_cats_uk[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_uk[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_UK, + NULL, + YABAUSE_FRAMESKIP_INFO_0_UK, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_UK, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_UK, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_UK, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_UK, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_UK }, + { "1M_ram", OPTION_VAL_1M_RAM_UK }, + { "4M_ram", OPTION_VAL_4M_RAM_UK }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_UK, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_UK, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_UK, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_UK, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_UK, + NULL, + YABAUSE_NUMTHREADS_INFO_0_UK, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_uk = { + option_cats_uk, + option_defs_uk +}; + +/* RETRO_LANGUAGE_VN */ + +#define YABAUSE_FRAMESKIP_LABEL_VN NULL +#define YABAUSE_FRAMESKIP_INFO_0_VN NULL +#define YABAUSE_FORCE_HLE_BIOS_LABEL_VN NULL +#define YABAUSE_FORCE_HLE_BIOS_INFO_0_VN NULL +#define YABAUSE_ADDON_CARTRIDGE_LABEL_VN NULL +#define YABAUSE_ADDON_CARTRIDGE_INFO_0_VN NULL +#define OPTION_VAL_NONE_VN NULL +#define OPTION_VAL_1M_RAM_VN NULL +#define OPTION_VAL_4M_RAM_VN NULL +#define YABAUSE_MULTITAP_PORT1_LABEL_VN NULL +#define YABAUSE_MULTITAP_PORT1_INFO_0_VN NULL +#define YABAUSE_MULTITAP_PORT2_LABEL_VN NULL +#define YABAUSE_MULTITAP_PORT2_INFO_0_VN NULL +#define YABAUSE_NUMTHREADS_LABEL_VN NULL +#define YABAUSE_NUMTHREADS_INFO_0_VN NULL + +struct retro_core_option_v2_category option_cats_vn[] = { + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_vn[] = { + { + "yabause_frameskip", + YABAUSE_FRAMESKIP_LABEL_VN, + NULL, + YABAUSE_FRAMESKIP_INFO_0_VN, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_force_hle_bios", + YABAUSE_FORCE_HLE_BIOS_LABEL_VN, + NULL, + YABAUSE_FORCE_HLE_BIOS_INFO_0_VN, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_addon_cartridge", + YABAUSE_ADDON_CARTRIDGE_LABEL_VN, + NULL, + YABAUSE_ADDON_CARTRIDGE_INFO_0_VN, + NULL, + NULL, + { + { "none", OPTION_VAL_NONE_VN }, + { "1M_ram", OPTION_VAL_1M_RAM_VN }, + { "4M_ram", OPTION_VAL_4M_RAM_VN }, + { NULL, NULL}, + }, + "none" + }, + { + "yabause_multitap_port1", + YABAUSE_MULTITAP_PORT1_LABEL_VN, + NULL, + YABAUSE_MULTITAP_PORT1_INFO_0_VN, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "yabause_multitap_port2", + YABAUSE_MULTITAP_PORT2_LABEL_VN, + NULL, + YABAUSE_MULTITAP_PORT2_INFO_0_VN, + NULL, + NULL, + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, +#ifdef HAVE_THREADS + { + "yabause_numthreads", + YABAUSE_NUMTHREADS_LABEL_VN, + NULL, + YABAUSE_NUMTHREADS_INFO_0_VN, + NULL, + NULL, + { + { "1", NULL }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { NULL, NULL}, + }, + "4" + }, +#endif + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_vn = { + option_cats_vn, + option_defs_vn +}; + + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file