#ifndef LIBRETRO_CORE_OPTIONS_H__ #define LIBRETRO_CORE_OPTIONS_H__ #include #include #include #include #ifndef HAVE_NO_LANGEXTRA #include "libretro_core_options_intl.h" #endif /* ******************************** * VERSION: 1.3 ******************************** * * - 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_ENGLISH */ /* Default language: * - All other languages must include the same keys and values * - Will be used as a fallback in the event that frontend language * is not available * - Will be used as a fallback for any missing entries in * frontend language definition */ struct retro_core_option_definition option_defs_us[] = { { "pcsx_rearmed_frameskip", "Frameskip", "Choose how much frames should be skipped to improve performance at the expense of visual smoothness.", { { "0", NULL }, { "1", NULL }, { "2", NULL }, { "3", NULL }, { NULL, NULL }, }, "0", }, { "pcsx_rearmed_bios", "Use BIOS", "Allows you to use real bios file (if available) or emulated bios (HLE). Its recommended to use official bios file for better compatibility.", { { "auto", "auto" }, { "HLE", "hle" }, { NULL, NULL }, }, "auto", }, { "pcsx_rearmed_region", "Region", "Choose what region the system is from. 60 Hz for NTSC, 50 Hz for PAL.", { { "auto", "auto" }, { "NTSC", "ntsc" }, { "PAL", "pal" }, { NULL, NULL }, }, "auto", }, { "pcsx_rearmed_memcard2", "Enable Second Memory Card (Shared)", "Enabled the memory card slot 2. This memory card is shared amongst all games.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_show_other_input_settings", "Show other input settings", "Shows or hides other inputs settings like multitaps, player 3-8 ports, analog fine-tunings, etc.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_input_sensitivity", "Emulated Mouse Sensitivity", "Adjust responsiveness when using mouse controller (Default 1.0).", { { "0.05", NULL }, { "0.10", NULL }, { "0.15", NULL }, { "0.20", NULL }, { "0.25", NULL }, { "0.30", NULL }, { "0.35", NULL }, { "0.40", NULL }, { "0.45", NULL }, { "0.50", NULL }, { "0.55", NULL }, { "0.60", NULL }, { "0.65", NULL }, { "0.70", NULL }, { "0.75", NULL }, { "0.80", NULL }, { "0.85", NULL }, { "0.90", NULL }, { "0.95", NULL }, { "1.00", NULL }, { "1.05", NULL }, { "1.10", NULL }, { "1.15", NULL }, { "1.20", NULL }, { "1.25", NULL }, { "1.30", NULL }, { "1.35", NULL }, { "1.40", NULL }, { "1.45", NULL }, { "1.50", NULL }, { "1.55", NULL }, { "1.60", NULL }, { "1.65", NULL }, { "1.70", NULL }, { "1.75", NULL }, { "1.80", NULL }, { "1.85", NULL }, { "1.90", NULL }, { "1.95", NULL }, { "2.00", NULL }, }, "1.00", }, { "pcsx_rearmed_multitap1", "Multitap 1 (Restart)", "Enables/Disables multitap on port 1, allowing upto 5 players in games that permit it.", { { "automatic", NULL }, { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_multitap2", "Multitap 2 (Restart)", "Enables/Disables multitap on port 2, allowing up to 8 players in games that permit it. Multitap 1 has to be enabled for this to work.", { { "automatic", NULL }, { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_negcon_deadzone", "NegCon Twist Deadzone (Percent)", "Sets the deadzone of the RetroPad left analog stick when simulating the 'twist' action of emulated neGcon Controllers. Used to eliminate drift/unwanted input.", { { "0", NULL }, { "5", NULL }, { "10", NULL }, { "15", NULL }, { "20", NULL }, { "25", NULL }, { "30", NULL }, { NULL, NULL }, }, "0", }, { "pcsx_rearmed_negcon_response", "NegCon Twist Response", "Specifies the analog response when using a RetroPad left analog stick to simulate the 'twist' action of emulated neGcon Controllers.", { { "linear", NULL }, { "quadratic", NULL }, { "cubic", NULL }, { NULL, NULL }, }, "linear", }, { "pcsx_rearmed_analog_axis_modifier", "Analog axis bounds.", "Range bounds for analog axis. Square bounds help controllers with highly circular ranges that are unable to fully saturate the x and y axis at 45degree deflections.", { { "circle", NULL }, { "square", NULL }, { NULL, NULL }, }, "circle", }, { "pcsx_rearmed_vibration", "Enable Vibration", "Enables vibration feedback for controllers that supports vibration features.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "enabled", }, { "pcsx_rearmed_gunconadjustx", "Guncon Adjust X", "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies an increment on the x axis.", { { "0", NULL }, { "-25", NULL }, { "-24", NULL }, { "-23", NULL }, { "-22", NULL }, { "-21", NULL }, { "-20", NULL }, { "-19", NULL }, { "-18", NULL }, { "-17", NULL }, { "-16", NULL }, { "-15", NULL }, { "-14", NULL }, { "-13", NULL }, { "-12", NULL }, { "-11", NULL }, { "-10", NULL }, { "-09", NULL }, { "-08", NULL }, { "-07", NULL }, { "-06", NULL }, { "-05", NULL }, { "-04", NULL }, { "-03", NULL }, { "-02", NULL }, { "-01", NULL }, { "00", NULL }, { "01", NULL }, { "02", NULL }, { "03", NULL }, { "04", NULL }, { "05", NULL }, { "06", NULL }, { "07", NULL }, { "08", NULL }, { "09", NULL }, { "10", NULL }, { "11", NULL }, { "12", NULL }, { "13", NULL }, { "14", NULL }, { "15", NULL }, { "16", NULL }, { "17", NULL }, { "18", NULL }, { "19", NULL }, { "20", NULL }, { "21", NULL }, { "22", NULL }, { "23", NULL }, { "24", NULL }, { "25", NULL }, { NULL, NULL }, }, "0", }, { "pcsx_rearmed_gunconadjusty", "Guncon Adjust Y", "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies an increment on the y axis.", { { "0", NULL }, { "-25", NULL }, { "-24", NULL }, { "-23", NULL }, { "-22", NULL }, { "-21", NULL }, { "-20", NULL }, { "-19", NULL }, { "-18", NULL }, { "-17", NULL }, { "-16", NULL }, { "-15", NULL }, { "-14", NULL }, { "-13", NULL }, { "-12", NULL }, { "-11", NULL }, { "-10", NULL }, { "-09", NULL }, { "-08", NULL }, { "-07", NULL }, { "-06", NULL }, { "-05", NULL }, { "-04", NULL }, { "-03", NULL }, { "-02", NULL }, { "-01", NULL }, { "00", NULL }, { "01", NULL }, { "02", NULL }, { "03", NULL }, { "04", NULL }, { "05", NULL }, { "06", NULL }, { "07", NULL }, { "08", NULL }, { "09", NULL }, { "10", NULL }, { "11", NULL }, { "12", NULL }, { "13", NULL }, { "14", NULL }, { "15", NULL }, { "16", NULL }, { "17", NULL }, { "18", NULL }, { "19", NULL }, { "20", NULL }, { "21", NULL }, { "22", NULL }, { "23", NULL }, { "24", NULL }, { "25", NULL }, { NULL, NULL }, }, "0", }, { "pcsx_rearmed_gunconadjustratiox", "Guncon Adjust Ratio X", "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies a ratio on the x axis.", { { "1", NULL }, { "0.75", NULL }, { "0.76", NULL }, { "0.77", NULL }, { "0.78", NULL }, { "0.79", NULL }, { "0.80", NULL }, { "0.81", NULL }, { "0.82", NULL }, { "0.83", NULL }, { "0.84", NULL }, { "0.85", NULL }, { "0.86", NULL }, { "0.87", NULL }, { "0.88", NULL }, { "0.89", NULL }, { "0.90", NULL }, { "0.91", NULL }, { "0.92", NULL }, { "0.93", NULL }, { "0.94", NULL }, { "0.95", NULL }, { "0.96", NULL }, { "0.97", NULL }, { "0.98", NULL }, { "0.99", NULL }, { "1.00", NULL }, { "1.01", NULL }, { "1.02", NULL }, { "1.03", NULL }, { "1.04", NULL }, { "1.05", NULL }, { "1.06", NULL }, { "1.07", NULL }, { "1.08", NULL }, { "1.09", NULL }, { "1.10", NULL }, { "1.11", NULL }, { "1.12", NULL }, { "1.13", NULL }, { "1.14", NULL }, { "1.15", NULL }, { "1.16", NULL }, { "1.17", NULL }, { "1.18", NULL }, { "1.19", NULL }, { "1.20", NULL }, { "1.21", NULL }, { "1.22", NULL }, { "1.23", NULL }, { "1.24", NULL }, { "1.25", NULL }, { NULL, NULL }, }, "1", }, { "pcsx_rearmed_gunconadjustratioy", "Guncon Adjust Ratio Y", "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies a ratio on the y axis.", { { "1", NULL }, { "0.75", NULL }, { "0.76", NULL }, { "0.77", NULL }, { "0.78", NULL }, { "0.79", NULL }, { "0.80", NULL }, { "0.81", NULL }, { "0.82", NULL }, { "0.83", NULL }, { "0.84", NULL }, { "0.85", NULL }, { "0.86", NULL }, { "0.87", NULL }, { "0.88", NULL }, { "0.89", NULL }, { "0.90", NULL }, { "0.91", NULL }, { "0.92", NULL }, { "0.93", NULL }, { "0.94", NULL }, { "0.95", NULL }, { "0.96", NULL }, { "0.97", NULL }, { "0.98", NULL }, { "0.99", NULL }, { "1.00", NULL }, { "1.01", NULL }, { "1.02", NULL }, { "1.03", NULL }, { "1.04", NULL }, { "1.05", NULL }, { "1.06", NULL }, { "1.07", NULL }, { "1.08", NULL }, { "1.09", NULL }, { "1.10", NULL }, { "1.11", NULL }, { "1.12", NULL }, { "1.13", NULL }, { "1.14", NULL }, { "1.15", NULL }, { "1.16", NULL }, { "1.17", NULL }, { "1.18", NULL }, { "1.19", NULL }, { "1.20", NULL }, { "1.21", NULL }, { "1.22", NULL }, { "1.23", NULL }, { "1.24", NULL }, { "1.25", NULL }, { NULL, NULL }, }, "1", }, { "pcsx_rearmed_dithering", "Enable Dithering", "If Off, disables the dithering pattern the PSX applies to combat color banding.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, #if defined HAVE_LIBNX || defined _3DS "disabled", #else "enabled", #endif }, #if defined(LIGHTREC) || defined(NEW_DYNAREC) { "pcsx_rearmed_drc", "Dynamic Recompiler", "Enables core to use dynamic recompiler or interpreter (slower) CPU instructions.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "enabled", }, #endif /* LIGHTREC || NEW_DYNAREC */ #ifdef NEW_DYNAREC { "pcsx_rearmed_psxclock", "PSX CPU Clock", #if defined(HAVE_PRE_ARMV7) && !defined(_3DS) "Overclock or underclock the PSX clock. Default is 50", #else "Overclock or underclock the PSX clock. Default is 57", #endif { { "30", NULL }, { "31", NULL }, { "32", NULL }, { "33", NULL }, { "34", NULL }, { "35", NULL }, { "36", NULL }, { "37", NULL }, { "38", NULL }, { "39", NULL }, { "40", NULL }, { "41", NULL }, { "42", NULL }, { "43", NULL }, { "44", NULL }, { "45", NULL }, { "46", NULL }, { "47", NULL }, { "48", NULL }, { "49", NULL }, { "50", NULL }, { "51", NULL }, { "52", NULL }, { "53", NULL }, { "54", NULL }, { "55", NULL }, { "56", NULL }, { "57", NULL }, { "58", NULL }, { "59", NULL }, { "60", NULL }, { "61", NULL }, { "62", NULL }, { "63", NULL }, { "64", NULL }, { "65", NULL }, { "66", NULL }, { "67", NULL }, { "68", NULL }, { "69", NULL }, { "70", NULL }, { "71", NULL }, { "72", NULL }, { "73", NULL }, { "74", NULL }, { "75", NULL }, { "76", NULL }, { "77", NULL }, { "78", NULL }, { "79", NULL }, { "80", NULL }, { "81", NULL }, { "82", NULL }, { "83", NULL }, { "84", NULL }, { "85", NULL }, { "86", NULL }, { "87", NULL }, { "88", NULL }, { "89", NULL }, { "90", NULL }, { "91", NULL }, { "92", NULL }, { "93", NULL }, { "94", NULL }, { "95", NULL }, { "96", NULL }, { "97", NULL }, { "98", NULL }, { "99", NULL }, { "100", NULL }, { NULL, NULL }, }, #if defined(HAVE_PRE_ARMV7) && !defined(_3DS) "50", #else "57", #endif }, #endif /* NEW_DYNAREC */ #ifdef GPU_NEON { "pcsx_rearmed_neon_interlace_enable", "Enable Interlacing Mode", "Enables fake scanlines effect.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_neon_enhancement_enable", "Enhanced Resolution (Slow)", "Renders in double resolution at the cost of lower performance.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_neon_enhancement_no_main", "Enhanced Resolution (Speed Hack)", "Speed hack for Enhanced resolution option (glitches some games).", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, #endif /* GPU_NEON */ { "pcsx_rearmed_duping_enable", "Frame Duping", "A speedup, redraws/reuses the last frame if there was no new data.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "enabled", }, { "pcsx_rearmed_display_internal_fps", "Display Internal FPS", "Shows an on-screen frames per second counter when enabled.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, /* GPU PEOPS OPTIONS */ #ifdef GPU_PEOPS { "pcsx_rearmed_show_gpu_peops_settings", "Advanced GPU P.E.Op.S. Settings", "Shows or hides advanced GPU plugin settings. NOTE: Quick Menu must be toggled for this setting to take effect.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_gpu_peops_odd_even_bit", "(GPU) Odd/Even Bit Hack", "Needed for Chrono Cross.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_gpu_peops_expand_screen_width", "(GPU) Expand Screen Width", "Capcom fighting games", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_gpu_peops_ignore_brightness", "(GPU) Ignore Brightness Color", "Black screens in Lunar Silver Star Story games", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_gpu_peops_disable_coord_check", "(GPU) Disable Coordinate Check", "Compatibility mode", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_gpu_peops_lazy_screen_update", "(GPU) Lazy Screen Update", "Pandemonium 2", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_gpu_peops_old_frame_skip", "(GPU) Old Frame Skipping", "Skip every second frame", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "enabled", }, { "pcsx_rearmed_gpu_peops_repeated_triangles", "(GPU) Repeated Flat Tex Triangles", "Needed by Star Wars: Dark Forces", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_gpu_peops_quads_with_triangles", "(GPU) Draw Quads with Triangles", "Better g-colors, worse textures", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_gpu_peops_fake_busy_state", "(GPU) Fake 'Gpu Busy' States", "Toggle busy flags after drawing", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, #endif /* GPU UNAI Advanced Options */ #ifdef GPU_UNAI { "pcsx_rearmed_show_gpu_unai_settings", "Advance GPU UNAI/PCSX4All Settings", "Shows or hides advanced gpu settings. A core restart might be needed for settings to take effect. NOTE: Quick Menu must be toggled for this setting to take effect.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL}, }, "disabled", }, { "pcsx_rearmed_gpu_unai_blending", "(GPU) Enable Blending", NULL, { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL}, }, "enabled", }, { "pcsx_rearmed_gpu_unai_lighting", "(GPU) Enable Lighting", NULL, { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL}, }, "enabled", }, { "pcsx_rearmed_gpu_unai_fast_lighting", "(GPU) Enable Fast Lighting", NULL, { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL}, }, "disabled", }, { "pcsx_rearmed_gpu_unai_ilace_force", "(GPU) Enable Forced Interlace", NULL, { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL}, }, "disabled", }, { "pcsx_rearmed_gpu_unai_pixel_skip", "(GPU) Enable Pixel Skip", NULL, { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL}, }, "disabled", }, { "pcsx_rearmed_gpu_unai_scale_hires", "(GPU) Enable Hi-Res Downscaling", "When enabled, will scale hi-res modes to 320x240, skipping unrendered pixels.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL}, }, "disabled", }, #endif /* GPU UNAI Advanced Settings */ #ifdef THREAD_RENDERING { "pcsx_rearmed_gpu_thread_rendering", "Threaded Rendering", "When enabled, runs GPU commands in a thread. Sync waits for drawing to finish before vsync. Async will not wait unless there's another frame behind it.", { { "disabled", NULL }, { "sync", NULL }, { "async", NULL }, { NULL, NULL}, }, "disabled", }, #endif { "pcsx_rearmed_show_bios_bootlogo", "Show Bios Bootlogo", "When enabled, shows the PlayStation logo when starting or resetting. (Breaks some games).", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_spu_reverb", "Sound Reverb", "Enables or disables audio reverb effect.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "enabled", }, { "pcsx_rearmed_spu_interpolation", "Sound Interpolation", NULL, { { "simple", "Simple" }, { "gaussian", "Gaussian" }, { "cubic", "Cubic" }, { "off", "disabled" }, { NULL, NULL }, }, "simple", }, { "pcsx_rearmed_idiablofix", "Diablo Music Fix", NULL, { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_pe2_fix", "Parasite Eve 2/Vandal Hearts 1/2 Fix", NULL, { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_inuyasha_fix", "InuYasha Sengoku Battle Fix", NULL, { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, #ifndef _WIN32 { "pcsx_rearmed_async_cd", "CD Access Method (Restart)", "Select method used to read data from content disk images. 'Synchronous' mimics original hardware. 'Asynchronous' can reduce stuttering on devices with slow storage. 'Precache' loads disk image into memory for faster access (CHD only).", { { "sync", "Synchronous" }, { "async", "Asynchronous" }, { "precache", "Precache" }, { NULL, NULL}, }, "sync", }, #endif /* ADVANCED OPTIONS */ { "pcsx_rearmed_noxadecoding", "XA Decoding", NULL, { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "enabled", }, { "pcsx_rearmed_nocdaudio", "CD Audio", NULL, { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "enabled", }, { "pcsx_rearmed_spuirq", "SPU IRQ Always Enabled", "Compatibility tweak, should be left to off in most cases.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, #ifdef NEW_DYNAREC { "pcsx_rearmed_nosmccheck", "(Speed Hack) Disable SMC Checks", "Will cause crashes when loading, break memcards.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_gteregsunneeded", "(Speed Hack) Assume GTE Regs Unneeded", "May cause graphical glitches.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, { "pcsx_rearmed_nogteflags", "(Speed Hack) Disable GTE Flags", "Will cause graphical glitches.", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, #endif /* NEW_DYNAREC */ { NULL, NULL, NULL, {{0}}, NULL }, }; /* ******************************** * Language Mapping ******************************** */ #ifndef HAVE_NO_LANGEXTRA 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 */ NULL, /* 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 */ }; #endif /* ******************************** * Functions ******************************** */ /* Handles configuration/setting of core options. * Should be called as early as possible - ideally inside * retro_set_environment(), and no later than retro_load_game() * > We place the function body in the header to avoid the * necessity of adding more .c files (i.e. want this to * be as painless as possible for core devs) */ static INLINE void libretro_set_core_options(retro_environment_t environ_cb) { unsigned version = 0; if (!environ_cb) return; if (environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version) && (version >= 1)) { #ifndef HAVE_NO_LANGEXTRA struct retro_core_options_intl core_options_intl; unsigned language = 0; core_options_intl.us = option_defs_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]; environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_intl); #else environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, &option_defs_us); #endif } else { size_t i; size_t option_index = 0; size_t num_options = 0; struct retro_variable *variables = NULL; char **values_buf = NULL; /* Determine number of options * > Note: We are going to skip a number of irrelevant * core options when building the retro_variable array, * but we'll allocate space for all of them. The difference * in resource usage is negligible, and this allows us to * keep the code 'cleaner' */ while (true) { if (option_defs_us[num_options].key) num_options++; else 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++) { 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; /* Skip options that are irrelevant when using the * old style core options interface */ if ((strcmp(key, "pcsx_rearmed_show_gpu_peops_settings") == 0)) continue; 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) { size_t j; 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); error: /* Clean up */ if (values_buf) { for (i = 0; i < num_options; i++) { if (values_buf[i]) { free(values_buf[i]); values_buf[i] = NULL; } } free(values_buf); values_buf = NULL; } if (variables) { free(variables); variables = NULL; } } } #ifdef __cplusplus } #endif #endif