Fixes Diablo 1 SPU bug properly and remove Diablo hack.
[pcsx_rearmed.git] / frontend / libretro_core_options.h
1 #ifndef LIBRETRO_CORE_OPTIONS_H__
2 #define LIBRETRO_CORE_OPTIONS_H__
3
4 #include <stdlib.h>
5 #include <string.h>
6
7 #include <libretro.h>
8 #include <retro_inline.h>
9
10 #ifndef HAVE_NO_LANGEXTRA
11 #include "libretro_core_options_intl.h"
12 #endif
13
14 /*
15  ********************************
16  * VERSION: 1.3
17  ********************************
18  *
19  * - 1.3: Move translations to libretro_core_options_intl.h
20  *        - libretro_core_options_intl.h includes BOM and utf-8
21  *          fix for MSVC 2010-2013
22  *        - Added HAVE_NO_LANGEXTRA flag to disable translations
23  *          on platforms/compilers without BOM support
24  * - 1.2: Use core options v1 interface when
25  *        RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1
26  *        (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1)
27  * - 1.1: Support generation of core options v0 retro_core_option_value
28  *        arrays containing options with a single value
29  * - 1.0: First commit
30 */
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 /*
37  ********************************
38  * Core Option Definitions
39  ********************************
40 */
41
42 /* RETRO_LANGUAGE_ENGLISH */
43
44 /* Default language:
45  * - All other languages must include the same keys and values
46  * - Will be used as a fallback in the event that frontend language
47  *   is not available
48  * - Will be used as a fallback for any missing entries in
49  *   frontend language definition
50  */
51
52 struct retro_core_option_definition option_defs_us[] = {
53    {
54       "pcsx_rearmed_frameskip",
55       "Frameskip",
56       "Choose how much frames should be skipped to improve performance at the expense of visual smoothness.",
57       {
58          { "0", NULL },
59          { "1", NULL },
60          { "2", NULL },
61          { "3", NULL },
62          { NULL, NULL },
63       },
64       "0",
65    },
66    {
67       "pcsx_rearmed_bios",
68       "Use BIOS",
69       "Allows you to use real bios file (if available) or emulated bios (HLE). Its recommended to use official bios file for better compatibility.",
70       {
71          { "auto", "auto" },
72          { "HLE",  "hle" },
73          { NULL, NULL },
74       },
75       "auto",
76    },
77    {
78       "pcsx_rearmed_region",
79       "Region",
80       "Choose what region the system is from. 60 Hz for NTSC, 50 Hz for PAL.",
81       {
82          { "auto", "auto" },
83          { "NTSC", "ntsc" },
84          { "PAL",  "pal" },
85          { NULL, NULL },
86       },
87       "auto",
88    },
89    {
90       "pcsx_rearmed_memcard2",
91       "Enable Second Memory Card (Shared)",
92       "Enabled the memory card slot 2. This memory card is shared amongst all games.",
93       {
94          { "disabled", NULL },
95          { "enabled",  NULL },
96          { NULL, NULL },
97       },
98       "disabled",
99    },
100    {
101       "pcsx_rearmed_show_other_input_settings",
102       "Show other input settings",
103       "Shows or hides other inputs settings like multitaps, player 3-8 ports, analog fine-tunings, etc.",
104       {
105          { "disabled", NULL },
106          { "enabled",  NULL },
107          { NULL, NULL },
108       },
109       "disabled",
110    },
111    {
112       "pcsx_rearmed_input_sensitivity",
113       "Emulated Mouse Sensitivity",
114       "Adjust responsiveness when using mouse controller (Default 1.0).",
115       {
116          { "0.05", NULL },
117          { "0.10", NULL },
118          { "0.15", NULL },
119          { "0.20", NULL },
120          { "0.25", NULL },
121          { "0.30", NULL },
122          { "0.35", NULL },
123          { "0.40", NULL },
124          { "0.45", NULL },
125          { "0.50", NULL },
126          { "0.55", NULL },
127          { "0.60", NULL },
128          { "0.65", NULL },
129          { "0.70", NULL },
130          { "0.75", NULL },
131          { "0.80", NULL },
132          { "0.85", NULL },
133          { "0.90", NULL },
134          { "0.95", NULL },
135          { "1.00", NULL },
136          { "1.05", NULL },
137          { "1.10", NULL },
138          { "1.15", NULL },
139          { "1.20", NULL },
140          { "1.25", NULL },
141          { "1.30", NULL },
142          { "1.35", NULL },
143          { "1.40", NULL },
144          { "1.45", NULL },
145          { "1.50", NULL },
146          { "1.55", NULL },
147          { "1.60", NULL },
148          { "1.65", NULL },
149          { "1.70", NULL },
150          { "1.75", NULL },
151          { "1.80", NULL },
152          { "1.85", NULL },
153          { "1.90", NULL },
154          { "1.95", NULL },
155          { "2.00", NULL },
156       },
157       "1.00",
158    },
159    {
160       "pcsx_rearmed_multitap",
161       "Multitap Mode (Restart)",
162       "Sets the playstation multitap peripheral to either controller port 1 or controller port 2 to support of upto 5 players simultaneously, or on both for upto 8 players simultaneously. Option depends on games that has support for multitap feature. Leave option on disabled if not such compatible games to avoid any input-related problems.",
163       {
164          { "disabled",      NULL },
165          { "port 1",        NULL },
166          { "port 2",        NULL },
167          { "ports 1 and 2", NULL },
168          { NULL, NULL },
169       },
170       "disabled",
171    },
172    {
173       "pcsx_rearmed_negcon_deadzone",
174       "NegCon Twist Deadzone (Percent)",
175       "Sets the deadzone of the RetroPad left analog stick when simulating the 'twist' action of emulated neGcon Controllers. Used to eliminate drift/unwanted input.",
176       {
177          { "0",  NULL },
178          { "5",  NULL },
179          { "10", NULL },
180          { "15", NULL },
181          { "20", NULL },
182          { "25", NULL },
183          { "30", NULL },
184          { NULL, NULL },
185       },
186       "0",
187    },
188    {
189       "pcsx_rearmed_negcon_response",
190       "NegCon Twist Response",
191       "Specifies the analog response when using a RetroPad left analog stick to simulate the 'twist' action of emulated neGcon Controllers.",
192       {
193          { "linear",    NULL },
194          { "quadratic", NULL },
195          { "cubic",     NULL },
196          { NULL, NULL },
197       },
198       "linear",
199    },
200    {
201       "pcsx_rearmed_analog_axis_modifier",
202       "Analog axis bounds.",
203       "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.",
204       {
205          { "circle", NULL },
206          { "square", NULL },
207          { NULL, NULL },
208       },
209       "circle",
210    },
211    {
212       "pcsx_rearmed_vibration",
213       "Enable Vibration",
214       "Enables vibration feedback for controllers that supports vibration features.",
215       {
216          { "disabled", NULL },
217          { "enabled",  NULL },
218          { NULL, NULL },
219       },
220       "enabled",
221    },
222    {
223       "pcsx_rearmed_gunconadjustx",
224       "Guncon Adjust X",
225       "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies an increment on the x axis.",
226       {
227          { "0", NULL },
228          { "-25", NULL },
229          { "-24", NULL },
230          { "-23", NULL },
231          { "-22", NULL },
232          { "-21", NULL },
233          { "-20", NULL },
234          { "-19", NULL },
235          { "-18", NULL },
236          { "-17", NULL },
237          { "-16", NULL },
238          { "-15", NULL },
239          { "-14", NULL },
240          { "-13", NULL },
241          { "-12", NULL },
242          { "-11", NULL },
243          { "-10", NULL },
244          { "-09", NULL },
245          { "-08", NULL },
246          { "-07", NULL },
247          { "-06", NULL },
248          { "-05", NULL },
249          { "-04", NULL },
250          { "-03", NULL },
251          { "-02", NULL },
252          { "-01", NULL },
253          { "00", NULL },
254          { "01", NULL },
255          { "02", NULL },
256          { "03", NULL },
257          { "04", NULL },
258          { "05", NULL },
259          { "06", NULL },
260          { "07", NULL },
261          { "08", NULL },
262          { "09", NULL },
263          { "10", NULL },
264          { "11", NULL },
265          { "12", NULL },
266          { "13", NULL },
267          { "14", NULL },
268          { "15", NULL },
269          { "16", NULL },
270          { "17", NULL },
271          { "18", NULL },
272          { "19", NULL },
273          { "20", NULL },
274          { "21", NULL },
275          { "22", NULL },
276          { "23", NULL },
277          { "24", NULL },
278          { "25", NULL },
279          { NULL, NULL },
280       },
281       "0",
282    },
283    {
284       "pcsx_rearmed_gunconadjusty",
285       "Guncon Adjust Y",
286       "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies an increment on the y axis.",
287       {
288          { "0", NULL },
289          { "-25", NULL },
290          { "-24", NULL },
291          { "-23", NULL },
292          { "-22", NULL },
293          { "-21", NULL },
294          { "-20", NULL },
295          { "-19", NULL },
296          { "-18", NULL },
297          { "-17", NULL },
298          { "-16", NULL },
299          { "-15", NULL },
300          { "-14", NULL },
301          { "-13", NULL },
302          { "-12", NULL },
303          { "-11", NULL },
304          { "-10", NULL },
305          { "-09", NULL },
306          { "-08", NULL },
307          { "-07", NULL },
308          { "-06", NULL },
309          { "-05", NULL },
310          { "-04", NULL },
311          { "-03", NULL },
312          { "-02", NULL },
313          { "-01", NULL },
314          { "00", NULL },
315          { "01", NULL },
316          { "02", NULL },
317          { "03", NULL },
318          { "04", NULL },
319          { "05", NULL },
320          { "06", NULL },
321          { "07", NULL },
322          { "08", NULL },
323          { "09", NULL },
324          { "10", NULL },
325          { "11", NULL },
326          { "12", NULL },
327          { "13", NULL },
328          { "14", NULL },
329          { "15", NULL },
330          { "16", NULL },
331          { "17", NULL },
332          { "18", NULL },
333          { "19", NULL },
334          { "20", NULL },
335          { "21", NULL },
336          { "22", NULL },
337          { "23", NULL },
338          { "24", NULL },
339          { "25", NULL },
340          { NULL, NULL },
341       },
342       "0",
343    },
344    {
345       "pcsx_rearmed_gunconadjustratiox",
346       "Guncon Adjust Ratio X",
347       "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies a ratio on the x axis.",
348       {
349          { "1", NULL },
350          { "0.75", NULL },
351          { "0.76", NULL },
352          { "0.77", NULL },
353          { "0.78", NULL },
354          { "0.79", NULL },
355          { "0.80", NULL },
356          { "0.81", NULL },
357          { "0.82", NULL },
358          { "0.83", NULL },
359          { "0.84", NULL },
360          { "0.85", NULL },
361          { "0.86", NULL },
362          { "0.87", NULL },
363          { "0.88", NULL },
364          { "0.89", NULL },
365          { "0.90", NULL },
366          { "0.91", NULL },
367          { "0.92", NULL },
368          { "0.93", NULL },
369          { "0.94", NULL },
370          { "0.95", NULL },
371          { "0.96", NULL },
372          { "0.97", NULL },
373          { "0.98", NULL },
374          { "0.99", NULL },
375          { "1.00", NULL },
376          { "1.01", NULL },
377          { "1.02", NULL },
378          { "1.03", NULL },
379          { "1.04", NULL },
380          { "1.05", NULL },
381          { "1.06", NULL },
382          { "1.07", NULL },
383          { "1.08", NULL },
384          { "1.09", NULL },
385          { "1.10", NULL },
386          { "1.11", NULL },
387          { "1.12", NULL },
388          { "1.13", NULL },
389          { "1.14", NULL },
390          { "1.15", NULL },
391          { "1.16", NULL },
392          { "1.17", NULL },
393          { "1.18", NULL },
394          { "1.19", NULL },
395          { "1.20", NULL },
396          { "1.21", NULL },
397          { "1.22", NULL },
398          { "1.23", NULL },
399          { "1.24", NULL },
400          { "1.25", NULL },
401          { NULL, NULL },
402       },
403       "1",
404    },
405    {
406       "pcsx_rearmed_gunconadjustratioy",
407       "Guncon Adjust Ratio Y",
408       "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies a ratio on the y axis.",
409       {
410          { "1", NULL },
411          { "0.75", NULL },
412          { "0.76", NULL },
413          { "0.77", NULL },
414          { "0.78", NULL },
415          { "0.79", NULL },
416          { "0.80", NULL },
417          { "0.81", NULL },
418          { "0.82", NULL },
419          { "0.83", NULL },
420          { "0.84", NULL },
421          { "0.85", NULL },
422          { "0.86", NULL },
423          { "0.87", NULL },
424          { "0.88", NULL },
425          { "0.89", NULL },
426          { "0.90", NULL },
427          { "0.91", NULL },
428          { "0.92", NULL },
429          { "0.93", NULL },
430          { "0.94", NULL },
431          { "0.95", NULL },
432          { "0.96", NULL },
433          { "0.97", NULL },
434          { "0.98", NULL },
435          { "0.99", NULL },
436          { "1.00", NULL },
437          { "1.01", NULL },
438          { "1.02", NULL },
439          { "1.03", NULL },
440          { "1.04", NULL },
441          { "1.05", NULL },
442          { "1.06", NULL },
443          { "1.07", NULL },
444          { "1.08", NULL },
445          { "1.09", NULL },
446          { "1.10", NULL },
447          { "1.11", NULL },
448          { "1.12", NULL },
449          { "1.13", NULL },
450          { "1.14", NULL },
451          { "1.15", NULL },
452          { "1.16", NULL },
453          { "1.17", NULL },
454          { "1.18", NULL },
455          { "1.19", NULL },
456          { "1.20", NULL },
457          { "1.21", NULL },
458          { "1.22", NULL },
459          { "1.23", NULL },
460          { "1.24", NULL },
461          { "1.25", NULL },
462          { NULL, NULL },
463       },
464       "1",
465    },
466    {
467       "pcsx_rearmed_dithering",
468       "Enable Dithering",
469       "If Off, disables the dithering pattern the PSX applies to combat color banding.",
470       {
471          { "disabled", NULL },
472          { "enabled",  NULL },
473          { NULL, NULL },
474       },
475 #if defined HAVE_LIBNX || defined _3DS
476           "disabled",
477 #else
478       "enabled",
479 #endif
480    },
481
482 #if defined(LIGHTREC) || defined(NEW_DYNAREC)
483    {
484       "pcsx_rearmed_drc",
485       "Dynamic Recompiler",
486       "Enables core to use dynamic recompiler or interpreter (slower) CPU instructions.",
487       {
488          { "disabled", NULL },
489          { "enabled",  NULL },
490          { NULL, NULL },
491       },
492       "enabled",
493    },
494 #endif /* LIGHTREC || NEW_DYNAREC */
495
496 #ifdef NEW_DYNAREC
497    {
498       "pcsx_rearmed_psxclock",
499       "PSX CPU Clock",
500 #if defined(HAVE_PRE_ARMV7) && !defined(_3DS)
501       "Overclock or underclock the PSX clock. Default is 50",
502 #else
503       "Overclock or underclock the PSX clock. Default is 57",
504 #endif
505       {
506          { "30",  NULL },
507          { "31",  NULL },
508          { "32",  NULL },
509          { "33",  NULL },
510          { "34",  NULL },
511          { "35",  NULL },
512          { "36",  NULL },
513          { "37",  NULL },
514          { "38",  NULL },
515          { "39",  NULL },
516          { "40",  NULL },
517          { "41",  NULL },
518          { "42",  NULL },
519          { "43",  NULL },
520          { "44",  NULL },
521          { "45",  NULL },
522          { "46",  NULL },
523          { "47",  NULL },
524          { "48",  NULL },
525          { "49",  NULL },
526          { "50",  NULL },
527          { "51",  NULL },
528          { "52",  NULL },
529          { "53",  NULL },
530          { "54",  NULL },
531          { "55",  NULL },
532          { "56",  NULL },
533          { "57",  NULL },
534          { "58",  NULL },
535          { "59",  NULL },
536          { "60",  NULL },
537          { "61",  NULL },
538          { "62",  NULL },
539          { "63",  NULL },
540          { "64",  NULL },
541          { "65",  NULL },
542          { "66",  NULL },
543          { "67",  NULL },
544          { "68",  NULL },
545          { "69",  NULL },
546          { "70",  NULL },
547          { "71",  NULL },
548          { "72",  NULL },
549          { "73",  NULL },
550          { "74",  NULL },
551          { "75",  NULL },
552          { "76",  NULL },
553          { "77",  NULL },
554          { "78",  NULL },
555          { "79",  NULL },
556          { "80",  NULL },
557          { "81",  NULL },
558          { "82",  NULL },
559          { "83",  NULL },
560          { "84",  NULL },
561          { "85",  NULL },
562          { "86",  NULL },
563          { "87",  NULL },
564          { "88",  NULL },
565          { "89",  NULL },
566          { "90",  NULL },
567          { "91",  NULL },
568          { "92",  NULL },
569          { "93",  NULL },
570          { "94",  NULL },
571          { "95",  NULL },
572          { "96",  NULL },
573          { "97",  NULL },
574          { "98",  NULL },
575          { "99",  NULL },
576          { "100", NULL },
577          { NULL, NULL },
578       },
579 #if defined(HAVE_PRE_ARMV7) && !defined(_3DS)
580       "50",
581 #else
582       "57",
583 #endif
584    },
585 #endif /* NEW_DYNAREC */
586
587 #ifdef GPU_NEON
588    {
589       "pcsx_rearmed_neon_interlace_enable",
590       "Enable Interlacing Mode",
591       "Enables fake scanlines effect.",
592       {
593          { "disabled", NULL },
594          { "enabled",  NULL },
595          { NULL, NULL },
596       },
597       "disabled",
598    },
599    {
600       "pcsx_rearmed_neon_enhancement_enable",
601       "Enhanced Resolution (Slow)",
602       "Renders in double resolution at the cost of lower performance.",
603       {
604          { "disabled", NULL },
605          { "enabled",  NULL },
606          { NULL, NULL },
607       },
608       "disabled",
609    },
610    {
611       "pcsx_rearmed_neon_enhancement_no_main",
612       "Enhanced Resolution (Speed Hack)",
613       "Speed hack for Enhanced resolution option (glitches some games).",
614       {
615          { "disabled", NULL },
616          { "enabled",  NULL },
617          { NULL, NULL },
618       },
619       "disabled",
620    },
621 #endif /* GPU_NEON */
622
623    {
624       "pcsx_rearmed_duping_enable",
625       "Frame Duping",
626       "A speedup, redraws/reuses the last frame if there was no new data.",
627       {
628          { "disabled", NULL },
629          { "enabled",  NULL },
630          { NULL, NULL },
631       },
632       "enabled",
633    },
634    {
635       "pcsx_rearmed_display_internal_fps",
636       "Display Internal FPS",
637       "Shows an on-screen frames per second counter when enabled.",
638       {
639          { "disabled", NULL },
640          { "enabled",  NULL },
641          { NULL, NULL },
642       },
643       "disabled",
644    },
645
646    /* GPU PEOPS OPTIONS */
647 #ifdef GPU_PEOPS
648    {
649       "pcsx_rearmed_show_gpu_peops_settings",
650       "Advanced GPU P.E.Op.S. Settings",
651       "Shows or hides advanced GPU plugin settings. NOTE: Quick Menu must be toggled for this setting to take effect.",
652       {
653          { "disabled", NULL },
654          { "enabled",  NULL },
655          { NULL, NULL },
656       },
657       "disabled",
658    },
659    {
660       "pcsx_rearmed_gpu_peops_odd_even_bit",
661       "(GPU) Odd/Even Bit Hack",
662       "Needed for Chrono Cross.",
663       {
664          { "disabled", NULL },
665          { "enabled",  NULL },
666          { NULL, NULL },
667       },
668       "disabled",
669    },
670    {
671       "pcsx_rearmed_gpu_peops_expand_screen_width",
672       "(GPU) Expand Screen Width",
673       "Capcom fighting games",
674       {
675          { "disabled", NULL },
676          { "enabled",  NULL },
677          { NULL, NULL },
678       },
679       "disabled",
680    },
681    {
682       "pcsx_rearmed_gpu_peops_ignore_brightness",
683       "(GPU) Ignore Brightness Color",
684       "Black screens in Lunar Silver Star Story games",
685       {
686          { "disabled", NULL },
687          { "enabled",  NULL },
688          { NULL, NULL },
689       },
690       "disabled",
691    },
692    {
693       "pcsx_rearmed_gpu_peops_disable_coord_check",
694       "(GPU) Disable Coordinate Check",
695       "Compatibility mode",
696       {
697          { "disabled", NULL },
698          { "enabled",  NULL },
699          { NULL, NULL },
700       },
701       "disabled",
702    },
703    {
704       "pcsx_rearmed_gpu_peops_lazy_screen_update",
705       "(GPU) Lazy Screen Update",
706       "Pandemonium 2",
707       {
708          { "disabled", NULL },
709          { "enabled",  NULL },
710          { NULL, NULL },
711       },
712       "disabled",
713    },
714    {
715       "pcsx_rearmed_gpu_peops_old_frame_skip",
716       "(GPU) Old Frame Skipping",
717       "Skip every second frame",
718       {
719          { "disabled", NULL },
720          { "enabled",  NULL },
721          { NULL, NULL },
722       },
723       "enabled",
724    },
725    {
726       "pcsx_rearmed_gpu_peops_repeated_triangles",
727       "(GPU) Repeated Flat Tex Triangles",
728       "Needed by Star Wars: Dark Forces",
729       {
730          { "disabled", NULL },
731          { "enabled",  NULL },
732          { NULL, NULL },
733       },
734       "disabled",
735    },
736    {
737       "pcsx_rearmed_gpu_peops_quads_with_triangles",
738       "(GPU) Draw Quads with Triangles",
739       "Better g-colors, worse textures",
740       {
741          { "disabled", NULL },
742          { "enabled",  NULL },
743          { NULL, NULL },
744       },
745       "disabled",
746    },
747    {
748       "pcsx_rearmed_gpu_peops_fake_busy_state",
749       "(GPU) Fake 'Gpu Busy' States",
750       "Toggle busy flags after drawing",
751       {
752          { "disabled", NULL },
753          { "enabled",  NULL },
754          { NULL, NULL },
755       },
756       "disabled",
757    },
758 #endif
759
760     /* GPU UNAI Advanced Options */
761 #ifdef GPU_UNAI
762    {
763       "pcsx_rearmed_show_gpu_unai_settings",
764       "Advance GPU UNAI/PCSX4All Settings",
765       "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.",
766       {
767          { "disabled", NULL },
768          { "enabled",  NULL },
769          { NULL, NULL},
770       },
771       "disabled",
772    },
773    {
774       "pcsx_rearmed_gpu_unai_blending",
775       "(GPU) Enable Blending",
776       NULL,
777       {
778          { "disabled", NULL },
779          { "enabled",  NULL },
780          { NULL, NULL},
781       },
782       "enabled",
783    },
784    {
785       "pcsx_rearmed_gpu_unai_lighting",
786       "(GPU) Enable Lighting",
787       NULL,
788       {
789          { "disabled", NULL },
790          { "enabled",  NULL },
791          { NULL, NULL},
792       },
793       "enabled",
794    },
795    {
796       "pcsx_rearmed_gpu_unai_fast_lighting",
797       "(GPU) Enable Fast Lighting",
798       NULL,
799       {
800          { "disabled", NULL },
801          { "enabled",  NULL },
802          { NULL, NULL},
803       },
804       "disabled",
805    },
806    {
807       "pcsx_rearmed_gpu_unai_ilace_force",
808       "(GPU) Enable Forced Interlace",
809       NULL,
810       {
811          { "disabled", NULL },
812          { "enabled",  NULL },
813          { NULL, NULL},
814       },
815       "disabled",
816    },
817    {
818       "pcsx_rearmed_gpu_unai_pixel_skip",
819       "(GPU) Enable Pixel Skip",
820       NULL,
821       {
822          { "disabled", NULL },
823          { "enabled",  NULL },
824          { NULL, NULL},
825       },
826       "disabled",
827    },
828    {
829       "pcsx_rearmed_gpu_unai_scale_hires",
830       "(GPU) Enable Hi-Res Downscaling",
831       "When enabled, will scale hi-res modes to 320x240, skipping unrendered pixels.",
832       {
833          { "disabled", NULL },
834          { "enabled",  NULL },
835          { NULL, NULL},
836       },
837       "disabled",
838    },
839 #endif /* GPU UNAI Advanced Settings */
840 #ifdef THREAD_RENDERING
841    {
842       "pcsx_rearmed_gpu_thread_rendering",
843       "Threaded Rendering",
844       "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.",
845       {
846          { "disabled", NULL },
847          { "sync",  NULL },
848          { "async",  NULL },
849          { NULL, NULL},
850       },
851       "disabled",
852    },
853 #endif
854
855    {
856       "pcsx_rearmed_show_bios_bootlogo",
857       "Show Bios Bootlogo",
858       "When enabled, shows the PlayStation logo when starting or resetting. (Breaks some games).",
859       {
860          { "disabled", NULL },
861          { "enabled",  NULL },
862          { NULL, NULL },
863       },
864       "disabled",
865    },
866    {
867       "pcsx_rearmed_spu_reverb",
868       "Sound Reverb",
869       "Enables or disables audio reverb effect.",
870       {
871          { "disabled", NULL },
872          { "enabled",  NULL },
873          { NULL, NULL },
874       },
875       "enabled",
876    },
877    {
878       "pcsx_rearmed_spu_interpolation",
879       "Sound Interpolation",
880       NULL,
881       {
882          { "simple",   "Simple" },
883          { "gaussian", "Gaussian" },
884          { "cubic",    "Cubic" },
885          { "off",      "disabled" },
886          { NULL, NULL },
887       },
888       "simple",
889    },
890    {
891       "pcsx_rearmed_pe2_fix",
892       "Parasite Eve 2/Vandal Hearts 1/2 Fix",
893       NULL,
894       {
895          { "disabled", NULL },
896          { "enabled",  NULL },
897          { NULL, NULL },
898       },
899       "disabled",
900    },
901    {
902       "pcsx_rearmed_inuyasha_fix",
903       "InuYasha Sengoku Battle Fix",
904       NULL,
905       {
906          { "disabled", NULL },
907          { "enabled",  NULL },
908          { NULL, NULL },
909       },
910       "disabled",
911    },
912 #ifndef _WIN32
913    {
914       "pcsx_rearmed_async_cd",
915       "CD Access Method (Restart)",
916       "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).",
917       {
918          { "sync",     "Synchronous" },
919          { "async",    "Asynchronous" },
920          { "precache", "Precache" },
921          { NULL, NULL},
922       },
923       "sync",
924    },
925 #endif
926    /* ADVANCED OPTIONS */
927    {
928       "pcsx_rearmed_noxadecoding",
929       "XA Decoding",
930       NULL,
931       {
932          { "disabled", NULL },
933          { "enabled",  NULL },
934          { NULL, NULL },
935       },
936       "enabled",
937    },
938    {
939       "pcsx_rearmed_nocdaudio",
940       "CD Audio",
941       NULL,
942       {
943          { "disabled", NULL },
944          { "enabled",  NULL },
945          { NULL, NULL },
946       },
947       "enabled",
948    },
949    {
950       "pcsx_rearmed_spuirq",
951       "SPU IRQ Always Enabled",
952       "Compatibility tweak, should be left to off in most cases.",
953       {
954          { "disabled", NULL },
955          { "enabled",  NULL },
956          { NULL, NULL },
957       },
958       "disabled",
959    },
960
961 #ifdef NEW_DYNAREC
962    {
963       "pcsx_rearmed_nosmccheck",
964       "(Speed Hack) Disable SMC Checks",
965       "Will cause crashes when loading, break memcards.",
966       {
967          { "disabled", NULL },
968          { "enabled",  NULL },
969          { NULL, NULL },
970       },
971       "disabled",
972    },
973    {
974       "pcsx_rearmed_gteregsunneeded",
975       "(Speed Hack) Assume GTE Regs Unneeded",
976       "May cause graphical glitches.",
977       {
978          { "disabled", NULL },
979          { "enabled",  NULL },
980          { NULL, NULL },
981       },
982       "disabled",
983    },
984    {
985       "pcsx_rearmed_nogteflags",
986       "(Speed Hack) Disable GTE Flags",
987       "Will cause graphical glitches.",
988       {
989          { "disabled", NULL },
990          { "enabled",  NULL },
991          { NULL, NULL },
992       },
993       "disabled",
994    },
995 #endif /* NEW_DYNAREC */
996
997    { NULL, NULL, NULL, {{0}}, NULL },
998 };
999
1000 /*
1001  ********************************
1002  * Language Mapping
1003  ********************************
1004 */
1005
1006 #ifndef HAVE_NO_LANGEXTRA
1007 struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = {
1008    option_defs_us, /* RETRO_LANGUAGE_ENGLISH */
1009    NULL,           /* RETRO_LANGUAGE_JAPANESE */
1010    NULL,           /* RETRO_LANGUAGE_FRENCH */
1011    NULL,           /* RETRO_LANGUAGE_SPANISH */
1012    NULL,           /* RETRO_LANGUAGE_GERMAN */
1013    NULL,           /* RETRO_LANGUAGE_ITALIAN */
1014    NULL,           /* RETRO_LANGUAGE_DUTCH */
1015    NULL,           /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */
1016    NULL,           /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */
1017    NULL,           /* RETRO_LANGUAGE_RUSSIAN */
1018    NULL,           /* RETRO_LANGUAGE_KOREAN */
1019    NULL,           /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */
1020    NULL,           /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */
1021    NULL,           /* RETRO_LANGUAGE_ESPERANTO */
1022    NULL,           /* RETRO_LANGUAGE_POLISH */
1023    NULL,           /* RETRO_LANGUAGE_VIETNAMESE */
1024    NULL,           /* RETRO_LANGUAGE_ARABIC */
1025    NULL,           /* RETRO_LANGUAGE_GREEK */
1026    option_defs_tr, /* RETRO_LANGUAGE_TURKISH */
1027 };
1028 #endif
1029
1030 /*
1031  ********************************
1032  * Functions
1033  ********************************
1034 */
1035
1036 /* Handles configuration/setting of core options.
1037  * Should be called as early as possible - ideally inside
1038  * retro_set_environment(), and no later than retro_load_game()
1039  * > We place the function body in the header to avoid the
1040  *   necessity of adding more .c files (i.e. want this to
1041  *   be as painless as possible for core devs)
1042  */
1043
1044 static INLINE void libretro_set_core_options(retro_environment_t environ_cb)
1045 {
1046    unsigned version = 0;
1047
1048    if (!environ_cb)
1049       return;
1050
1051    if (environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version) && (version >= 1))
1052    {
1053 #ifndef HAVE_NO_LANGEXTRA
1054       struct retro_core_options_intl core_options_intl;
1055       unsigned language = 0;
1056
1057       core_options_intl.us    = option_defs_us;
1058       core_options_intl.local = NULL;
1059
1060       if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) &&
1061           (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH))
1062          core_options_intl.local = option_defs_intl[language];
1063
1064       environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_intl);
1065 #else
1066       environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, &option_defs_us);
1067 #endif
1068    }
1069    else
1070    {
1071       size_t i;
1072       size_t option_index              = 0;
1073       size_t num_options               = 0;
1074       struct retro_variable *variables = NULL;
1075       char **values_buf                = NULL;
1076
1077       /* Determine number of options
1078        * > Note: We are going to skip a number of irrelevant
1079        *   core options when building the retro_variable array,
1080        *   but we'll allocate space for all of them. The difference
1081        *   in resource usage is negligible, and this allows us to
1082        *   keep the code 'cleaner' */
1083       while (true)
1084       {
1085          if (option_defs_us[num_options].key)
1086             num_options++;
1087          else
1088             break;
1089       }
1090
1091       /* Allocate arrays */
1092       variables  = (struct retro_variable *)calloc(num_options + 1, sizeof(struct retro_variable));
1093       values_buf = (char **)calloc(num_options, sizeof(char *));
1094
1095       if (!variables || !values_buf)
1096          goto error;
1097
1098       /* Copy parameters from option_defs_us array */
1099       for (i = 0; i < num_options; i++)
1100       {
1101          const char *key                        = option_defs_us[i].key;
1102          const char *desc                       = option_defs_us[i].desc;
1103          const char *default_value              = option_defs_us[i].default_value;
1104          struct retro_core_option_value *values = option_defs_us[i].values;
1105          size_t buf_len                         = 3;
1106          size_t default_index                   = 0;
1107
1108          values_buf[i] = NULL;
1109
1110          /* Skip options that are irrelevant when using the
1111           * old style core options interface */
1112          if ((strcmp(key, "pcsx_rearmed_show_gpu_peops_settings") == 0))
1113             continue;
1114
1115          if (desc)
1116          {
1117             size_t num_values = 0;
1118
1119             /* Determine number of values */
1120             while (true)
1121             {
1122                if (values[num_values].value)
1123                {
1124                   /* Check if this is the default value */
1125                   if (default_value)
1126                      if (strcmp(values[num_values].value, default_value) == 0)
1127                         default_index = num_values;
1128
1129                   buf_len += strlen(values[num_values].value);
1130                   num_values++;
1131                }
1132                else
1133                   break;
1134             }
1135
1136             /* Build values string */
1137             if (num_values > 0)
1138             {
1139                size_t j;
1140
1141                buf_len += num_values - 1;
1142                buf_len += strlen(desc);
1143
1144                values_buf[i] = (char *)calloc(buf_len, sizeof(char));
1145                if (!values_buf[i])
1146                   goto error;
1147
1148                strcpy(values_buf[i], desc);
1149                strcat(values_buf[i], "; ");
1150
1151                /* Default value goes first */
1152                strcat(values_buf[i], values[default_index].value);
1153
1154                /* Add remaining values */
1155                for (j = 0; j < num_values; j++)
1156                {
1157                   if (j != default_index)
1158                   {
1159                      strcat(values_buf[i], "|");
1160                      strcat(values_buf[i], values[j].value);
1161                   }
1162                }
1163             }
1164          }
1165
1166          variables[option_index].key   = key;
1167          variables[option_index].value = values_buf[i];
1168          option_index++;
1169       }
1170
1171       /* Set variables */
1172       environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);
1173
1174 error:
1175
1176       /* Clean up */
1177       if (values_buf)
1178       {
1179          for (i = 0; i < num_options; i++)
1180          {
1181             if (values_buf[i])
1182             {
1183                free(values_buf[i]);
1184                values_buf[i] = NULL;
1185             }
1186          }
1187
1188          free(values_buf);
1189          values_buf = NULL;
1190       }
1191
1192       if (variables)
1193       {
1194          free(variables);
1195          variables = NULL;
1196       }
1197    }
1198 }
1199
1200 #ifdef __cplusplus
1201 }
1202 #endif
1203
1204 #endif