From e68827645e751cd4fb96adb14d8939c5eca796a3 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 9 Nov 2021 15:54:25 -0800 Subject: [PATCH 01/59] Qt: Update translations --- src/platform/qt/ts/mgba-de.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-en.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-es.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-fi.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-fr.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-hu.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-it.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-ja.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-ko.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-ms.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-nb_NO.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-nl.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-pl.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-pt_BR.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-ru.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-template.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-tr.ts | 236 ++++++++++++++-------------- src/platform/qt/ts/mgba-zh_CN.ts | 236 ++++++++++++++-------------- 18 files changed, 2124 insertions(+), 2124 deletions(-) diff --git a/src/platform/qt/ts/mgba-de.ts b/src/platform/qt/ts/mgba-de.ts index 8739b617a..3160b4750 100644 --- a/src/platform/qt/ts/mgba-de.ts +++ b/src/platform/qt/ts/mgba-de.ts @@ -3933,48 +3933,48 @@ Download-Größe: %3 Gamepads - + Shortcuts Tastenkürzel - - + + Shaders Shader - + Select BIOS BIOS auswählen - + Select directory Verzeichnis auswählen - + (%1×%2) (%1×%2) - + Never Nie - + Just now Gerade eben - + Less than an hour ago Vor weniger als einer Stunde - + %n hour(s) ago Vor %n Stunde(n) @@ -3982,7 +3982,7 @@ Download-Größe: %3 - + %n day(s) ago Vor %n Tag(en) @@ -5279,8 +5279,8 @@ Download-Größe: %3 - - + + Mute Stummschalten @@ -5326,7 +5326,7 @@ Download-Größe: %3 - + frames Bild(er) @@ -5366,93 +5366,93 @@ Download-Größe: %3 Erzwinge pixelgenaue Skalierung - - + + Pause Pausiert - + When inactive: Wenn inaktiv: - + When minimized: Wenn minimiert: - + Current channel: Aktueller Channel: - + Current version: Aktuelle Version: - + Update channel: Update-Channel: - + Available version: Verfügbare Version: - + (Unknown) (unbekannt) - + Last checked: Zuletzt geprüft: - + Automatically check on start Beim Start automatisch auf Aktualisierungen prüfen - + Check now Jetzt überprüfen - + Default color palette only Nur Standard-Farbpalette - + SGB color palette if available SGB-Farbpalette, sofern verfügbar - + GBC color palette if available GBC-Farbpalette, sofern verfügbar - + SGB (preferred) or GBC color palette if available SGB (bevorzugt) oder GBC-Farbpalette, sofern verfügbar - + Game Boy Camera Game Boy Camera - + Driver: Treiber: - + Source: Quelle: @@ -5472,257 +5472,257 @@ Download-Größe: %3 Sprache - + List view Listenansicht - + Tree view Baumansicht - + Dynamically update window title Fenster-Titel dynamisch aktualisieren - + Show FPS in title bar Bildwiederholrate in der Titelleiste anzeigen - + Save state extra data: Zusätzliche Savestate-Daten: - - + + Save game Spielstand - + Load state extra data: Zusätzliche Savestate-Daten laden: - + Models Modelle - + GB only: Nur GB: - + SGB compatible: SGB-kompatibel: - + GBC only: Nur GBC: - + GBC compatible: GBC-kompatibel: - + SGB and GBC compatible: SGB- und GBC-kompatibel: - + Game Boy palette Game Boy-Palette - + Preset: Voreinstellungen: - + Enable Game Boy Player features by default Game Boy Player-Features standardmäßig aktivieren - + Automatically save cheats Cheats automatisch speichern - + Automatically load cheats Cheats automatisch laden - + Automatically save state Zustand (Savestate) automatisch speichern - + Automatically load state Zustand (Savestate) automatisch laden - + Enable Discord Rich Presence Discord-Integration aktivieren - + Show OSD messages Bildschirmmeldungen anzeigen - + Show filename instead of ROM name in title bar Dateinamen statt ROM-Namen in der Titelleiste anzeigen - + Fast forward (held) speed: Vorlauf-Geschwindigkeit (halten): - + Enable VBA bug compatibility in ROM hacks VBA-Bug-Kompatibilität in ROM-Hacks aktivieren - + Video renderer: Video-Renderer: - + Software Software - + OpenGL OpenGL - + OpenGL enhancements OpenGL-Verbesserungen - + High-resolution scale: Hochauflösende Skalierung: - + XQ GBA audio (experimental) XQ GBA-Audio (experimentell) - + Cheats Cheats - + Log to file In Datei protokollieren - + Log to console Auf die Konsole protokollieren - + Select Log File Protokoll-Datei auswählen - + Default BG colors: Standard-Hintergrundfarben: - + Default sprite colors 1: Standard-Sprite-Farben 1: - + Default sprite colors 2: Standard-Sprite-Farben 2: - + Super Game Boy borders Super Game Boy-Rahmen - + Library: Bibliothek: - + Show when no game open Anzeigen, wenn kein Spiel geöffnet ist - + Clear cache Cache leeren - + Fast forward speed: Vorlauf-Geschwindigkeit: - + Preload entire ROM into memory ROM-Datei vollständig in Arbeitsspeicher vorladen - - - - - - - - - + + + + + + + + + Browse Durchsuchen - + Use BIOS file if found BIOS-Datei verwenden, wenn vorhanden - + Skip BIOS intro BIOS-Intro überspringen - - + + Unbounded unbegrenzt - + Suspend screensaver Bildschirmschoner deaktivieren @@ -5732,39 +5732,39 @@ Download-Größe: %3 BIOS - + Run all Alle ausführen - + Remove known Bekannte entfernen - + Detect and remove Erkennen und entfernen - + Allow opposing input directions Gegensätzliche Eingaberichtungen erlauben - - + + Screenshot Screenshot - - + + Cheat codes Cheat-Codes - + Enable rewind Rücklauf aktivieren @@ -5774,71 +5774,71 @@ Download-Größe: %3 Bilineare Filterung - + Rewind history: Rücklauf-Verlauf: - + Idle loops: Leerlaufprozesse: - + Autofire interval: Autofeuer-Intervall: - + (240×160) (240×160) - + GB BIOS file: Datei mit GB-BIOS: - + GBA BIOS file: Datei mit GBA-BIOS: - + GBC BIOS file: Datei mit GBC-BIOS: - + SGB BIOS file: Datei mit SGB-BIOS: - + Save games Spielstände - - - - - + + + + + Same directory as the ROM Verzeichnis der ROM-Datei - + Save states Savestates - + Screenshots Bildschirmfotos - + Patches Korrekturen diff --git a/src/platform/qt/ts/mgba-en.ts b/src/platform/qt/ts/mgba-en.ts index 9ab28f26e..2df942fa8 100644 --- a/src/platform/qt/ts/mgba-en.ts +++ b/src/platform/qt/ts/mgba-en.ts @@ -3929,48 +3929,48 @@ Download size: %3 - + Shortcuts - - + + Shaders - + Select BIOS - + Select directory - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3978,7 +3978,7 @@ Download size: %3 - + %n day(s) ago @@ -5278,8 +5278,8 @@ Download size: %3 - - + + Mute @@ -5325,7 +5325,7 @@ Download size: %3 - + frames @@ -5370,93 +5370,93 @@ Download size: %3 - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5476,363 +5476,363 @@ Download size: %3 - + Library: - + List view - + Tree view - + Show when no game open - + Clear cache - + Allow opposing input directions - + Suspend screensaver - + Dynamically update window title - + Show filename instead of ROM name in title bar - + Show OSD messages - + Enable Discord Rich Presence - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show FPS in title bar - + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory - + Save state extra data: - - + + Save game - + Load state extra data: - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: - - + + Screenshot - - + + Cheat codes - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL - + OpenGL enhancements - + High-resolution scale: - + (240×160) - + XQ GBA audio (experimental) - + GB BIOS file: - - - - - - - - - + + + + + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders diff --git a/src/platform/qt/ts/mgba-es.ts b/src/platform/qt/ts/mgba-es.ts index f9b576404..0f1775af7 100644 --- a/src/platform/qt/ts/mgba-es.ts +++ b/src/platform/qt/ts/mgba-es.ts @@ -3930,48 +3930,48 @@ Download size: %3 Controladores - + Shortcuts Atajos de teclado - - + + Shaders Shaders - + Select BIOS Seleccionar BIOS - + Select directory Elegir carpeta - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3979,7 +3979,7 @@ Download size: %3 - + %n day(s) ago @@ -5281,8 +5281,8 @@ Download size: %3 - - + + Mute Silenciar @@ -5328,7 +5328,7 @@ Download size: %3 - + frames cuadros @@ -5368,93 +5368,93 @@ Download size: %3 Filtro bilineal - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only Sólo paleta de colores predeterminada - + SGB color palette if available Paleta de color SGB si está disponible - + GBC color palette if available Paleta de color GBC si está disponible - + SGB (preferred) or GBC color palette if available Paleta de colores SGB (preferida) o GBC si está disponible - + Game Boy Camera Cámara Game Boy - + Driver: Controlador: - + Source: Fuente: @@ -5469,68 +5469,68 @@ Download size: %3 Mezcla entre cuadros - + Dynamically update window title Actualizar titulo de ventana dinámicamente - + Show OSD messages Mostrar mensajes en el OSD - + Save state extra data: Guardar datos adicionales de estado: - - + + Save game Guardar partida - + Load state extra data: Cargar datos adicionales de estado: - + Enable VBA bug compatibility in ROM hacks Activar modo de compatibilidad VBA en ROM hacks - + Preset: Ajustes: - + Show filename instead of ROM name in title bar Enseñar el nombre de archivo en lugar del nombre de ROM en el titulo de la ventana - + Fast forward (held) speed: Avance rápido (mantenido): - + (240×160) (240×160) - + Log to file Guardar a archivo - + Log to console Guardar a consola - + Select Log File Seleccionar @@ -5545,297 +5545,297 @@ Download size: %3 Idioma - + Library: Biblioteca: - + List view Lista - + Tree view Árbol - + Show when no game open Mostrar cuando no haya un juego abierto - + Clear cache Limpiar caché - + Allow opposing input directions Permitir direcciones opuestas al mismo tiempo - + Suspend screensaver Suspender protector de pantalla - + Show FPS in title bar Mostrar FPS en la barra de título - + Automatically save cheats Guardar trucos automáticamente - + Automatically load cheats Cargar trucos automáticamente - + Automatically save state Guardar estado automáticamente - + Automatically load state Cargar estado automáticamente - + Enable Discord Rich Presence Hablitar Rich Presence en Discord - + Fast forward speed: Avance rápido: - - + + Unbounded Sin límite - + Enable rewind Habilitar el rebobinar - + Rewind history: Hist. de rebobinado: - + Idle loops: Bucles inactivos: - + Run all Ejecutarlos todos - + Remove known Eliminar los conocidos - + Detect and remove Detectar y eliminar - - + + Screenshot Pantallazo - - + + Cheat codes Trucos - + Preload entire ROM into memory Cargar ROM completa a la memoria - + Autofire interval: Intervalo de turbo: - + Enable Game Boy Player features by default Habilitar funcionalidad de Game Boy Player por defecto - + Video renderer: Renderizador de video: - + Software Software - + OpenGL OpenGL - + OpenGL enhancements Mejoras para OpenGL - + High-resolution scale: Escala de alta resolución: - + XQ GBA audio (experimental) Mejorar audio GBA (experimental) - + GB BIOS file: Archivo BIOS GB: - - - - - - - - - + + + + + + + + + Browse Examinar - + Use BIOS file if found Usar archivo BIOS si fue encontrado - + Skip BIOS intro Saltar animación de entrada del BIOS - + GBA BIOS file: Archivo BIOS GBA: - + GBC BIOS file: Archivo BIOS GBC: - + SGB BIOS file: Archivo BIOS SGB: - + Save games Datos de guardado - - - - - + + + + + Same directory as the ROM Al mismo directorio que la ROM - + Save states Estados de guardado - + Screenshots Pantallazos - + Patches Parches - + Cheats Trucos - + Models Modelos - + GB only: Sólo GB: - + SGB compatible: Compatible con SGB: - + GBC only: Sólo GBC: - + GBC compatible: Compatible con GBC: - + SGB and GBC compatible: Compatible con SGB y GBC: - + Game Boy palette Paleta de Game Boy - + Default BG colors: Colores de fondo por defecto: - + Super Game Boy borders Bordes de Super Game Boy - + Default sprite colors 1: Colores de sprite 1 por defecto: - + Default sprite colors 2: Colores de sprite 2 por defecto: diff --git a/src/platform/qt/ts/mgba-fi.ts b/src/platform/qt/ts/mgba-fi.ts index 33831462a..d48cdd4e7 100644 --- a/src/platform/qt/ts/mgba-fi.ts +++ b/src/platform/qt/ts/mgba-fi.ts @@ -3930,48 +3930,48 @@ Download size: %3 - + Shortcuts - - + + Shaders - + Select BIOS - + Select directory - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3979,7 +3979,7 @@ Download size: %3 - + %n day(s) ago @@ -5279,8 +5279,8 @@ Download size: %3 - - + + Mute @@ -5326,7 +5326,7 @@ Download size: %3 - + frames @@ -5371,93 +5371,93 @@ Download size: %3 - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5477,363 +5477,363 @@ Download size: %3 - + Library: - + List view - + Tree view - + Show when no game open - + Clear cache - + Allow opposing input directions - + Suspend screensaver - + Dynamically update window title - + Show filename instead of ROM name in title bar - + Show OSD messages - + Enable Discord Rich Presence - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show FPS in title bar - + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory - + Save state extra data: - - + + Save game - + Load state extra data: - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: - - + + Screenshot - - + + Cheat codes - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL - + OpenGL enhancements - + High-resolution scale: - + (240×160) - + XQ GBA audio (experimental) - + GB BIOS file: - - - - - - - - - + + + + + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats Huijaukset - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index 7b5306fa6..a95ad8595 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -3949,48 +3949,48 @@ Download size: %3 Contrôleurs - + Shortcuts Raccourcis - - + + Shaders Shaders - + Select BIOS Choisir le BIOS - + Select directory - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3998,7 +3998,7 @@ Download size: %3 - + %n day(s) ago @@ -5301,8 +5301,8 @@ Download size: %3 - - + + Mute Muet @@ -5348,7 +5348,7 @@ Download size: %3 - + frames images @@ -5388,174 +5388,174 @@ Download size: %3 Filtrage bilinéaire - - + + Pause - + Dynamically update window title - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Save state extra data: - - + + Save game - + Load state extra data: - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: - + Enable Game Boy Player features by default - + Log to file Journalisation vers le fichier - + Log to console Journalisation vers la console - + Select Log File Sélectionner le fichier de journalisation @@ -5570,57 +5570,57 @@ Download size: %3 Langue - + Library: Bibliothèque : - + List view Vue par liste - + Tree view Vue en arborescence - + Show when no game open Afficher quand aucun jeu n'est ouvert - + Clear cache Vider le cache - + Allow opposing input directions Autoriser les directions opposées - + Suspend screensaver Suspendre l'économiseur d'écran - + Show FPS in title bar Afficher le nombre de FPS dans la barre de titre - + Automatically save cheats Sauvegarder automatiquement les cheats - + Automatically load cheats Charger automatiquement les cheats - + Automatically save state Sauvegarder automatiquement l'état @@ -5635,227 +5635,227 @@ Download size: %3 Mélange d'images - + Enable Discord Rich Presence Activer l'intégration avec Discord - + Automatically load state Charger automatiquement l'état - + Show OSD messages Afficher les messages OSD - + Show filename instead of ROM name in title bar Afficher le nom du fichier au lieu du nom de la ROM dans la barre de titre - + Fast forward speed: Vitesse d'avance rapide : - - + + Unbounded Sans limites - + Fast forward (held) speed: Vitesse d'avance rapide (maintenue) : - + Enable rewind Permettre le rembobinage - + Rewind history: Historique du rembobinage : - + Idle loops: Boucles d'inactivité : - + Run all Tout lancer - + Remove known Supprimer les éléments connus - + Detect and remove Détecter et supprimer - - + + Screenshot Capture d'écran - - + + Cheat codes Codes de triches - + Preload entire ROM into memory Précharger toute la ROM en mémoire - + Autofire interval: Intervalle de tir automatique : - + Enable VBA bug compatibility in ROM hacks - + Video renderer: Rendu vidéo : - + Software Logiciel(s) - + OpenGL OpenGL - + OpenGL enhancements Améliorations OpenGL - + High-resolution scale: Échelle haute résolution : - + (240×160) (240×160) - + XQ GBA audio (experimental) XQ GBA audio (expérimental) - + GB BIOS file: GB BIOS : - - - - - - - - - + + + + + + + + + Browse Parcourir - + Use BIOS file if found Utiliser le fichier BIOS si trouvé - + Skip BIOS intro Passer l'intro du BIOS - + GBA BIOS file: GBA BIOS : - + GBC BIOS file: GBC BIOS : - + SGB BIOS file: SGB BIOS : - + Save games Sauvegarder les jeux - - - - - + + + + + Same directory as the ROM Même répertoire que la ROM - + Save states Sauvegarder les états - + Screenshots Captures d'écran - + Patches Correctifs - + Cheats Cheats - + Default BG colors: Couleurs par défaut de l'arrière plan : - + Super Game Boy borders Bordures Super Game Boy - + Default sprite colors 1: Couleurs par défaut de la sprite nº 1 : - + Default sprite colors 2: Couleurs par défaut de la sprite n°2 : diff --git a/src/platform/qt/ts/mgba-hu.ts b/src/platform/qt/ts/mgba-hu.ts index 6420a63ef..466a4572b 100644 --- a/src/platform/qt/ts/mgba-hu.ts +++ b/src/platform/qt/ts/mgba-hu.ts @@ -3930,55 +3930,55 @@ Download size: %3 - + Shortcuts - - + + Shaders - + Select BIOS - + Select directory - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -5277,8 +5277,8 @@ Download size: %3 - - + + Mute @@ -5324,7 +5324,7 @@ Download size: %3 - + frames @@ -5369,37 +5369,37 @@ Download size: %3 - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5419,419 +5419,419 @@ Download size: %3 - + Library: - + List view - + Tree view - + Show when no game open - + Clear cache - + Allow opposing input directions - + Suspend screensaver - + Dynamically update window title - + Show filename instead of ROM name in title bar - + Show OSD messages - + Enable Discord Rich Presence Discord Rich Presence engedélyezése - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show FPS in title bar - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory - + Save state extra data: - - + + Save game - + Load state extra data: - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: - - + + Screenshot - - + + Cheat codes - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL - + OpenGL enhancements - + High-resolution scale: - + (240×160) - + XQ GBA audio (experimental) - + GB BIOS file: - - - - - - - - - + + + + + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats Csalások - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders diff --git a/src/platform/qt/ts/mgba-it.ts b/src/platform/qt/ts/mgba-it.ts index 09d32a059..de5fc78e8 100644 --- a/src/platform/qt/ts/mgba-it.ts +++ b/src/platform/qt/ts/mgba-it.ts @@ -3930,48 +3930,48 @@ Download size: %3 Controller - + Shortcuts Scorciatoie - - + + Shaders Shader - + Select BIOS Seleziona BIOS - + Select directory Seleziona directory - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3979,7 +3979,7 @@ Download size: %3 - + %n day(s) ago @@ -5276,8 +5276,8 @@ Download size: %3 - - + + Mute Muto @@ -5323,7 +5323,7 @@ Download size: %3 - + frames frame @@ -5358,128 +5358,128 @@ Download size: %3 Blocca rapporti aspetto - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Models Modelli - + GB only: Solo GB: - + SGB compatible: Compatibile SGB: - + GBC only: Solo GBC: - + GBC compatible: Compatibile BGC: - + SGB and GBC compatible: Compatibile SGB e GBC: - + Game Boy palette Tavolozza Game Boy - + Default color palette only Solo tavolozza colori predefinita - + SGB color palette if available Tavolozza colori SGB se disponibile - + GBC color palette if available Tavolozza colori GBC se disponibile - + SGB (preferred) or GBC color palette if available Tavolozza colori SGB (preferita) o GBC se disponibile - + Game Boy Camera Videocamera Game Boy - + Driver: Driver: - + Source: Sorgente: @@ -5494,187 +5494,187 @@ Download size: %3 Miscelazione dei frame - + Dynamically update window title Aggiorna dinamicamente il titolo della finestra - + Enable Discord Rich Presence Abilita Discord Rich Presence - + Save state extra data: Dati extra stato di salvataggio: - - + + Save game Salvataggio - + Load state extra data: Carica dati extra stato di salvataggio: - + Enable VBA bug compatibility in ROM hacks Abilita compatibilità con i bug di VBA nelle hack delle ROM - + Preset: Profilo: - + Show OSD messages Mostra messaggi OSD - + Show filename instead of ROM name in title bar Mostra nome file anziché nome ROM nella barra del titolo - + Fast forward (held) speed: Velocità di crociera: - + Enable Game Boy Player features by default Abilita funzionalità Game Boy Player per impostazione predefinita - + Video renderer: Rend. video: - + Software Software - + OpenGL OpenGL - + OpenGL enhancements Miglioramenti OpenGL - + High-resolution scale: Rapporto alta risoluzione: - + (240×160) (240×160) - + XQ GBA audio (experimental) audio XQ GBA (sperimentale) - + Cheats Trucchi - + Log to file Registro log in file - + Log to console Registro log in console - + Select Log File Seleziona file log - + Default BG colors: Colori predefiniti sfondo: - + Super Game Boy borders Bordi Super Game Boy - + Default sprite colors 1: Colori predefiniti sprite 1: - + Default sprite colors 2: Colori predefiniti sprite 2: - + Library: Libreria: - + Show when no game open Mostra quando nessun gioco è aperto - + Clear cache Svuota la cache - + Fast forward speed: Velocità di avanzamento rapido: - - - - - - - - - + + + + + + + + + Browse Sfoglia - + Use BIOS file if found Usa il file del BIOS se è presente - + Skip BIOS intro Salta intro del BIOS - - + + Unbounded Illimitato - + Suspend screensaver Sospendi salvaschermo @@ -5684,39 +5684,39 @@ Download size: %3 BIOS - + Run all esegui tutto - + Remove known rimuovi conosciuti - + Detect and remove rileva e rimuovi - + Allow opposing input directions Consenti direzioni opposte - - + + Screenshot Schermata - - + + Cheat codes Trucchi - + Enable rewind Abilita riavvolgimento @@ -5736,106 +5736,106 @@ Download size: %3 Lingua - + List view lista a elenco - + Tree view vista ad albero - + Show FPS in title bar Mostra gli FPS nella barra del titolo - + Automatically save cheats Salva i trucchi automaticamente - + Automatically load cheats Carica i trucchi automaticamente - + Automatically save state Salva stato automaticamente - + Automatically load state Carica stato automaticamente - + Rewind history: Cronologia riavvolgimento: - + Idle loops: Cicli inattivi: - + Preload entire ROM into memory Precarica ROM in memoria - + Autofire interval: Intervallo Autofire: - + GB BIOS file: File BIOS del GB: - + GBA BIOS file: File BIOS del GBA: - + GBC BIOS file: File BIOS del GBC: - + SGB BIOS file: File BIOS del SGB: - + Save games Salva le partite - - - - - + + + + + Same directory as the ROM Stessa cartella della ROM - + Save states Salvataggio Stati - + Screenshots Schermate - + Patches Patch diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index ea0878d30..0b131ea3e 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -3930,55 +3930,55 @@ Download size: %3 コントローラー - + Shortcuts ショートカット - - + + Shaders シェーダー - + Select BIOS BIOSを選択 - + Select directory - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -5279,8 +5279,8 @@ Download size: %3 - - + + Mute ミュート @@ -5326,7 +5326,7 @@ Download size: %3 - + frames フレーム @@ -5366,93 +5366,93 @@ Download size: %3 バイリニアフィルタリング - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5467,98 +5467,98 @@ Download size: %3 フレーム間混合 - + Dynamically update window title ウィンドウタイトルを動的に更新 - + Show OSD messages OSDメッセージを表示 - + Fast forward (held) speed: 早送り(押し)速度: - + Save state extra data: - - + + Save game - + Load state extra data: - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: - + Enable Game Boy Player features by default ゲームボーイプレーヤーの機能をデフォルトで有効 - + (240×160) (240×160) - + Log to file ファイル出力 - + Log to console コンソール出力 - + Select Log File ログファイルを選択 @@ -5573,267 +5573,267 @@ Download size: %3 言語 - + Library: ライブラリー: - + List view リスト表示 - + Tree view ツリー表示 - + Show when no game open ゲームが開いていないときに表示 - + Clear cache キャッシュの消去 - + Allow opposing input directions 反対の入力方向を有効 - + Suspend screensaver スクリーンセーバーを停止 - + Show FPS in title bar タイトルバーにFPSを表示 - + Automatically save cheats チートの自動セーブ - + Automatically load cheats チートの自動ロード - + Automatically save state ステートの自動セーブ - + Automatically load state ステートの自動ロード - + Enable Discord Rich Presence DiscordのRich Presenceを有効 - + Show filename instead of ROM name in title bar タイトルバーにゲーム名の代わりにファイル名を表示 - + Fast forward speed: 早送り速度: - - + + Unbounded 制限なし - + Enable rewind 巻戻し有効 - + Rewind history: 巻戻し履歴: - + Idle loops: アイドルループ: - + Run all すべて実行 - + Remove known 既知を削除 - + Detect and remove 検出して削除 - - + + Screenshot スクリーンショット - - + + Cheat codes チートコード - + Preload entire ROM into memory ROM全体をメモリにプリロード - + Autofire interval: 連射間隔: - + Enable VBA bug compatibility in ROM hacks - + Video renderer: ビデオレンダラー: - + Software ソフト - + OpenGL OpenGL - + OpenGL enhancements OpenGL機能強化 - + High-resolution scale: 高解像度スケール: - + XQ GBA audio (experimental) XQ GBA オーディオ機能(実験的) - + GB BIOS file: ゲームボーイBIOS: - - - - - - - - - + + + + + + + + + Browse 参照 - + Use BIOS file if found 存在する場合にBIOSファイルを使用 - + Skip BIOS intro BIOSイントロをスキップ - + GBA BIOS file: ゲームボーイアドバンスBIOS: - + GBC BIOS file: ゲームボーイカラーBIOS: - + SGB BIOS file: スーパーゲームボーイBIOS: - + Save games セーブデータ - - - - - + + + + + Same directory as the ROM ROMファイルと同じディレクトリ - + Save states セーブステート - + Screenshots スクリーンショット - + Patches パッチ - + Cheats チート - + Default BG colors: デフォルト背景色: - + Super Game Boy borders スーパーゲームボーイのボーダー - + Default sprite colors 1: デフォルトスプライト1: - + Default sprite colors 2: デフォルトスプライト2: diff --git a/src/platform/qt/ts/mgba-ko.ts b/src/platform/qt/ts/mgba-ko.ts index a9a96cfac..999e47159 100644 --- a/src/platform/qt/ts/mgba-ko.ts +++ b/src/platform/qt/ts/mgba-ko.ts @@ -3930,55 +3930,55 @@ Download size: %3 컨트롤러 - + Shortcuts 단축키 - - + + Shaders 쉐이더 - + Select BIOS 바이오스 선택 - + Select directory - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -5274,8 +5274,8 @@ Download size: %3 - - + + Mute 무음 @@ -5321,7 +5321,7 @@ Download size: %3 - + frames 프레임 @@ -5356,93 +5356,93 @@ Download size: %3 화면비 잠금 - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5457,222 +5457,222 @@ Download size: %3 - + Dynamically update window title - + Show filename instead of ROM name in title bar - + Show OSD messages - + Enable Discord Rich Presence - + Fast forward (held) speed: - + Save state extra data: - - + + Save game - + Load state extra data: - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL 오픈GL - + OpenGL enhancements - + High-resolution scale: - + (240×160) - + XQ GBA audio (experimental) - + Cheats 치트 - + Default BG colors: 기본 배경 색상: - + Super Game Boy borders 슈퍼 게임 보이 테두리 - + Default sprite colors 1: 기본 스프라이트 색상 1: - + Log to file - + Log to console - + Select Log File - + Default sprite colors 2: 기본 스프라이트 색상 2: - + Library: 라이브러리: - + Show when no game open 게임이 없을 떄 표시 - + Clear cache 캐시 지우기 - + Fast forward speed: 빨리 감기 속도: - - - - - - - - - + + + + + + + + + Browse 브라우저 - + Use BIOS file if found 발견되면 바이오스 파일 사용 - + Skip BIOS intro 바이오스 소개 건너 뛰기 - - + + Unbounded 무제한 - + Suspend screensaver 화면 보호기 일시 중지 @@ -5682,39 +5682,39 @@ Download size: %3 바이오스 - + Run all 모두 실행 - + Remove known 알려진 것 제거 - + Detect and remove 감지 및 제거 - + Allow opposing input directions 반대 방향 입력 허용 - - + + Screenshot 스크린샷 - - + + Cheat codes 치트 코드 - + Enable rewind Abilita riavvolgimento @@ -5734,106 +5734,106 @@ Download size: %3 언어 - + List view 목록 보기 - + Tree view 트리 보기 - + Show FPS in title bar 제목 표시 줄에 FPS 표시 - + Automatically save cheats 자동 치트 저장 - + Automatically load cheats 자동 치트 로드 - + Automatically save state 자동 상태 저장 - + Automatically load state 자동 상태 로드 - + Rewind history: 되감기 기록: - + Idle loops: Idle loops: - + Preload entire ROM into memory 전체 롬을 메모리에 미리 로드하십시오. - + Autofire interval: Intervallo Autofire: - + GB BIOS file: GB 바이오스 파일: - + GBA BIOS file: GBA 바이오스 파일: - + GBC BIOS file: GBC 바이오스 파일: - + SGB BIOS file: SGB 바이오스 파일: - + Save games 게임 저장 - - - - - + + + + + Same directory as the ROM 롬과 같은 디렉토리 - + Save states 저장 파일 상태 - + Screenshots 스크린샷 - + Patches 패치 diff --git a/src/platform/qt/ts/mgba-ms.ts b/src/platform/qt/ts/mgba-ms.ts index c5e3e6237..5dce03287 100644 --- a/src/platform/qt/ts/mgba-ms.ts +++ b/src/platform/qt/ts/mgba-ms.ts @@ -3929,55 +3929,55 @@ Download size: %3 Pengawal - + Shortcuts Pintas - - + + Shaders - + Select BIOS Pilih BIOS - + Select directory Pilih direktori - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -5278,8 +5278,8 @@ Download size: %3 - - + + Mute Senyap @@ -5325,7 +5325,7 @@ Download size: %3 - + frames bingkai @@ -5370,93 +5370,93 @@ Download size: %3 Penapisan bilinear - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only Palet warna piawai sahaja - + SGB color palette if available Palet warna SGB jika ada - + GBC color palette if available Palet warna GBC jika ada - + SGB (preferred) or GBC color palette if available SGB (pilihan utama) atau palet warna GBC jika ada - + Game Boy Camera Game Boy Camera - + Driver: Pemacu: - + Source: Sumber: @@ -5476,363 +5476,363 @@ Download size: %3 Bahasa - + Library: Perpustakaan: - + List view Pandangan senarai - + Tree view Pandangan pohon - + Show when no game open Tunjuk semasa tiada permainan dibuka - + Clear cache Kosongkan cache - + Allow opposing input directions Izin tekan arah-arah input yang berlawan sekaligus - + Suspend screensaver Gantung screensaver - + Dynamically update window title Kemaskini tajuk tetingkap secara dinamik - + Show filename instead of ROM name in title bar Tunjuk nama ROM dan bukan nama fail dalam bar tajuk - + Show OSD messages Tunjuk mesej OSD - + Enable Discord Rich Presence Dayakan Discord Rich Presence - + Automatically save state Simpan keadaan secara automatik - + Automatically load state Muat keadaan secara automatik - + Automatically save cheats Simpan tipuan secara automatik - + Automatically load cheats Muat tipuan secara automatik - + Show FPS in title bar Tunjuk FPS dalam bar tajuk - + Fast forward speed: Kelajuan mundar laju: - - + + Unbounded Tidak terbatas - + Fast forward (held) speed: Kelajuan mundar laju (pegang): - + Autofire interval: - + Enable rewind Dayakan putar balik - + Rewind history: Sejarah putar balik: - + Idle loops: - + Run all Jalan semua - + Remove known Buang yg diketahui - + Detect and remove Kesan dan buang - + Preload entire ROM into memory Pra-muat selurus ROM ke dalam ingatan - + Save state extra data: Data ekstra keadaan tersimpan: - - + + Save game Simpanan permainan - + Load state extra data: Data ekstra keadaan muat: - + Models Model - + GB only: GB sahaja: - + SGB compatible: SGB serasi: - + GBC only: GBC sahaja: - + GBC compatible: GBC serasi: - + SGB and GBC compatible: SGB dan GBC serasi: - + Game Boy palette Palet Game Boy - + Preset: Praset: - - + + Screenshot Cekupan skrin - - + + Cheat codes Kod tipu - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software Perisian - + OpenGL OpenGL - + OpenGL enhancements - + High-resolution scale: - + (240×160) (240×160) - + XQ GBA audio (experimental) - + GB BIOS file: Fail BIOS GB: - - - - - - - - - + + + + + + + + + Browse Pilih fail - + Use BIOS file if found Guna fail BIOS jika ada - + Skip BIOS intro Langkau pendahuluan BIOS - + GBA BIOS file: Fail BIOS GBA: - + GBC BIOS file: Fail BIOS GBC: - + SGB BIOS file: Fail BIOS SGB: - + Save games Simpanan permainan - - - - - + + + + + Same directory as the ROM Direktori sama dengan ROM - + Save states Keadaan tersimpan - + Screenshots Cekupan skrin - + Patches - + Cheats Tipuan - + Log to file Log dalam fail - + Log to console Log dalam konsol - + Select Log File Pilih fail log - + Default BG colors: Warna LB piawai: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders diff --git a/src/platform/qt/ts/mgba-nb_NO.ts b/src/platform/qt/ts/mgba-nb_NO.ts index b569281c2..60b58bb0c 100644 --- a/src/platform/qt/ts/mgba-nb_NO.ts +++ b/src/platform/qt/ts/mgba-nb_NO.ts @@ -3930,48 +3930,48 @@ Download size: %3 Kontrollere - + Shortcuts Snarveier - - + + Shaders Skyggeleggere - + Select BIOS Velg BIOS - + Select directory Velg mappe - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3979,7 +3979,7 @@ Download size: %3 - + %n day(s) ago @@ -5279,8 +5279,8 @@ Download size: %3 - - + + Mute @@ -5326,7 +5326,7 @@ Download size: %3 - + frames @@ -5371,93 +5371,93 @@ Download size: %3 - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5477,363 +5477,363 @@ Download size: %3 - + Library: - + List view - + Tree view - + Show when no game open - + Clear cache - + Allow opposing input directions - + Suspend screensaver - + Dynamically update window title - + Show filename instead of ROM name in title bar - + Show OSD messages - + Enable Discord Rich Presence - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show FPS in title bar - + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory - + Save state extra data: - - + + Save game - + Load state extra data: - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: - - + + Screenshot - - + + Cheat codes - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL OpenGL - + OpenGL enhancements - + High-resolution scale: - + (240×160) - + XQ GBA audio (experimental) - + GB BIOS file: - - - - - - - - - + + + + + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats Juks - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders diff --git a/src/platform/qt/ts/mgba-nl.ts b/src/platform/qt/ts/mgba-nl.ts index 3cf679d6b..f86106cf0 100644 --- a/src/platform/qt/ts/mgba-nl.ts +++ b/src/platform/qt/ts/mgba-nl.ts @@ -3929,48 +3929,48 @@ Download size: %3 - + Shortcuts - - + + Shaders - + Select BIOS - + Select directory - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3978,7 +3978,7 @@ Download size: %3 - + %n day(s) ago @@ -5278,8 +5278,8 @@ Download size: %3 - - + + Mute @@ -5325,7 +5325,7 @@ Download size: %3 - + frames @@ -5370,128 +5370,128 @@ Download size: %3 - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5511,328 +5511,328 @@ Download size: %3 - + Library: - + List view - + Tree view - + Show when no game open - + Clear cache - + Allow opposing input directions - + Suspend screensaver - + Dynamically update window title - + Show FPS in title bar - + Save state extra data: - - + + Save game - + Load state extra data: - + Enable VBA bug compatibility in ROM hacks - + Preset: - + Enable Discord Rich Presence - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show OSD messages - + Show filename instead of ROM name in title bar - + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory - - + + Screenshot - - + + Cheat codes - + Enable Game Boy Player features by default - + Video renderer: - + Software - + OpenGL - + OpenGL enhancements - + High-resolution scale: - + (240×160) - + XQ GBA audio (experimental) - + GB BIOS file: - - - - - - - - - + + + + + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats Cheats - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Super Game Boy borders - + Default sprite colors 1: - + Default sprite colors 2: diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index 146386936..e26804618 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -3929,48 +3929,48 @@ Download size: %3 - + Shortcuts - - + + Shaders - + Select BIOS - + Select directory - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3979,7 +3979,7 @@ Download size: %3 - + %n day(s) ago @@ -5280,8 +5280,8 @@ Download size: %3 - - + + Mute @@ -5327,7 +5327,7 @@ Download size: %3 - + frames @@ -5372,93 +5372,93 @@ Download size: %3 - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5478,363 +5478,363 @@ Download size: %3 - + Library: - + List view - + Tree view - + Show when no game open - + Clear cache - + Allow opposing input directions - + Suspend screensaver - + Dynamically update window title - + Show filename instead of ROM name in title bar - + Show OSD messages - + Enable Discord Rich Presence - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show FPS in title bar - + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory - + Save state extra data: - - + + Save game - + Load state extra data: - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: - - + + Screenshot - - + + Cheat codes - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL - + OpenGL enhancements - + High-resolution scale: - + (240×160) - + XQ GBA audio (experimental) - + GB BIOS file: - - - - - - - - - + + + + + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders diff --git a/src/platform/qt/ts/mgba-pt_BR.ts b/src/platform/qt/ts/mgba-pt_BR.ts index 13f744748..f1297e7c5 100644 --- a/src/platform/qt/ts/mgba-pt_BR.ts +++ b/src/platform/qt/ts/mgba-pt_BR.ts @@ -3930,48 +3930,48 @@ Download size: %3 Controles - + Shortcuts Atalhos - - + + Shaders Shaders - + Select BIOS Selecionar BIOS - + Select directory Selecione o diretório - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3979,7 +3979,7 @@ Download size: %3 - + %n day(s) ago @@ -5281,8 +5281,8 @@ Download size: %3 - - + + Mute Mudo @@ -5328,7 +5328,7 @@ Download size: %3 - + frames frames @@ -5368,93 +5368,93 @@ Download size: %3 Filtragem bilinear - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only Só a cor padrão da paleta - + SGB color palette if available Paleta das cores SGB se disponível - + GBC color palette if available Paleta das cores do GBC se disponível - + SGB (preferred) or GBC color palette if available SGB (preferido) ou paleta das cores do GBC se disponível - + Game Boy Camera Câmera do Game Boy - + Driver: Driver: - + Source: Fonte: @@ -5469,68 +5469,68 @@ Download size: %3 Mistura do interframe - + Dynamically update window title Atualizar título da janela dinamicamente - + Show OSD messages Mostrarr mensagens do OSD - + Save state extra data: Dados extras do save state: - - + + Save game Save do jogo - + Load state extra data: Carregar dados extras do state: - + Enable VBA bug compatibility in ROM hacks Ativar compatibilidade dos bugs do VBA nos hacks das ROMs - + Preset: Pré-definições: - + Show filename instead of ROM name in title bar Mostrar nome do arquivo em vez do nome da ROM na barra de título - + Fast forward (held) speed: Velocidade do avanço rápido (segurado): - + (240×160) (240×160) - + Log to file Registrar no arquivo - + Log to console Registrar no console - + Select Log File Selecionar Arquivo de Registro @@ -5545,297 +5545,297 @@ Download size: %3 Idioma - + Library: Biblioteca: - + List view Visualização em lista - + Tree view Visualização em árvore - + Show when no game open Mostrar quando nenhum jogo estiver aberto - + Clear cache Limpar cache - + Allow opposing input directions Permitir direções de entrada opostas - + Suspend screensaver Suspender proteção de tela - + Show FPS in title bar Mostrar FPS na barra de título - + Automatically save cheats Salvar trapaças automaticamente - + Automatically load cheats Carregar trapaças automaticamente - + Automatically save state Salvar o state automaticamente - + Automatically load state Carregar o state automaticamente - + Enable Discord Rich Presence Ativar Discord Rich Presence - + Fast forward speed: Velocidade de avanço rápido: - - + + Unbounded Ilimitado - + Enable rewind Ativar retrocesso - + Rewind history: Histórico do retrocesso: - + Idle loops: Loops inativos: - + Run all Executar todos - + Remove known Remover conhecidos - + Detect and remove Detectar e remover - - + + Screenshot Screenshot - - + + Cheat codes Códigos de trapaça - + Preload entire ROM into memory Pré-carregar a ROM inteira na memória - + Autofire interval: Intervalo do Auto-Disparo: - + Enable Game Boy Player features by default Ativar funções do Game Boy Player por padrão - + Video renderer: Renderizador do vídeo: - + Software Software - + OpenGL OpenGL - + OpenGL enhancements Melhorias do OpenGL - + High-resolution scale: Escala de alta-resolução: - + XQ GBA audio (experimental) Áudio do XQ GBA (experimental) - + GB BIOS file: Arquivo do GB BIOS: - - - - - - - - - + + + + + + + + + Browse Navegar - + Use BIOS file if found Usar o arquivo da BIOS se encontrado - + Skip BIOS intro Ignorar introdução da BIOS - + GBA BIOS file: Arquivo da BIOS do GBA: - + GBC BIOS file: Arquivo da BIOS do GBC: - + SGB BIOS file: Arquivo da BIOS do SGB: - + Save games Saves dos jogos - - - - - + + + + + Same directory as the ROM O mesmo diretório que a ROM - + Save states Save states - + Screenshots Screenshots - + Patches Patches - + Cheats Trapaças - + Models Modelos - + GB only: Só GB: - + SGB compatible: Compatível com SGB: - + GBC only: Só no GBC: - + GBC compatible: Compatível com GBC: - + SGB and GBC compatible: Compatível com SGB e GBC: - + Game Boy palette Paleta do Game Boy - + Default BG colors: Cores padrão do BG: - + Super Game Boy borders Bordas do Super Game Boy - + Default sprite colors 1: Cores padrão de sprite 1: - + Default sprite colors 2: Cores padrão de sprite 2: diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 806b28632..1597367d2 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -3933,48 +3933,48 @@ Download size: %3 Контроллеры - + Shortcuts Сочетания клавиш - - + + Shaders Шейдеры - + Select BIOS Выбор BIOS - + Select directory Выбор папки - + (%1×%2) - + Never Никогда - + Just now Только сейчас - + Less than an hour ago Менее часа назад - + %n hour(s) ago %n час назад @@ -3983,7 +3983,7 @@ Download size: %3 - + %n day(s) ago %n день назад @@ -5286,8 +5286,8 @@ Download size: %3 - - + + Mute @@ -5333,7 +5333,7 @@ Download size: %3 - + frames @@ -5378,128 +5378,128 @@ Download size: %3 - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5519,328 +5519,328 @@ Download size: %3 - + Library: - + List view - + Tree view - + Show when no game open - + Clear cache - + Allow opposing input directions - + Suspend screensaver - + Dynamically update window title - + Show FPS in title bar - + Save state extra data: - - + + Save game - + Load state extra data: - + Enable VBA bug compatibility in ROM hacks - + Preset: - + Enable Discord Rich Presence Вкл. расширенный статус в Discord - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show OSD messages - + Show filename instead of ROM name in title bar - + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory - - + + Screenshot - - + + Cheat codes - + Enable Game Boy Player features by default - + Video renderer: - + Software - + OpenGL - + OpenGL enhancements - + High-resolution scale: - + (240×160) - + XQ GBA audio (experimental) - + GB BIOS file: - - - - - - - - - + + + + + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats Читы - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Super Game Boy borders - + Default sprite colors 1: - + Default sprite colors 2: diff --git a/src/platform/qt/ts/mgba-template.ts b/src/platform/qt/ts/mgba-template.ts index 0c6898d9a..8a22b6254 100644 --- a/src/platform/qt/ts/mgba-template.ts +++ b/src/platform/qt/ts/mgba-template.ts @@ -3929,55 +3929,55 @@ Download size: %3 - + Shortcuts - - + + Shaders - + Select BIOS - + Select directory - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -5276,8 +5276,8 @@ Download size: %3 - - + + Mute @@ -5323,7 +5323,7 @@ Download size: %3 - + frames @@ -5368,93 +5368,93 @@ Download size: %3 - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5474,363 +5474,363 @@ Download size: %3 - + Library: - + List view - + Tree view - + Show when no game open - + Clear cache - + Allow opposing input directions - + Suspend screensaver - + Dynamically update window title - + Show filename instead of ROM name in title bar - + Show OSD messages - + Enable Discord Rich Presence - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show FPS in title bar - + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory - + Save state extra data: - - + + Save game - + Load state extra data: - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: - - + + Screenshot - - + + Cheat codes - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL - + OpenGL enhancements - + High-resolution scale: - + (240×160) - + XQ GBA audio (experimental) - + GB BIOS file: - - - - - - - - - + + + + + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts index 8f2b83467..28295e2d7 100644 --- a/src/platform/qt/ts/mgba-tr.ts +++ b/src/platform/qt/ts/mgba-tr.ts @@ -3930,55 +3930,55 @@ Download size: %3 - + Shortcuts Kısayollar - - + + Shaders Gölgelendiricler - + Select BIOS BIOS seç - + Select directory Yolu seç - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -5279,8 +5279,8 @@ Download size: %3 - - + + Mute Sessiz @@ -5326,7 +5326,7 @@ Download size: %3 - + frames Kare @@ -5371,128 +5371,128 @@ Download size: %3 Bilinear filtreleme - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Models Modeller - + GB only: Sadece GB: - + SGB compatible: SGB uyumlu: - + GBC only: Sadece GBC: - + GBC compatible: Uyumlu GBC: - + SGB and GBC compatible: Uyumlu SGB ve GBC: - + Game Boy palette Game Boy paleti - + Default color palette only Sadece varsayılan renk paleti - + SGB color palette if available Mevcutsa SGB renk paketi - + GBC color palette if available Mevcutsa GBC renk paketi - + SGB (preferred) or GBC color palette if available Mevcutsa SGB (tercih edilen) ya da GBC renk paketi - + Game Boy Camera Game Boy Kamera - + Driver: Sürücü: - + Source: Kaynak: @@ -5512,328 +5512,328 @@ Download size: %3 Dil - + Library: Kütüphane: - + List view Liste görünümü - + Tree view Sıralı görünüm - + Show when no game open Oyun açılmadığında göster - + Clear cache Ön belleği temizle - + Allow opposing input directions Karşıt giriş yönlerine izin ver - + Suspend screensaver Ekran koruyucuyu askıya alın - + Dynamically update window title Pencere boyutuna göre dinamik olarak güncelle - + Show FPS in title bar FPS'i başlık çubuğunda göster - + Save state extra data: Durum ekstra veriyi kaydet: - - + + Save game Oyunu kaydet - + Load state extra data: Durum ekstra veriyi yükle: - + Enable VBA bug compatibility in ROM hacks ROM hacklerinde VBA hata uyumluluğunu etkinleştir - + Preset: Ön ayar: - + Automatically save cheats Otomatik hile kaydedici - + Automatically load cheats Otomatik hile yükleyici - + Automatically save state Otomatik konum kaydedici - + Automatically load state Otomatik konum yükleyici - + Enable Discord Rich Presence Discord etkinliğini etkinleştir - + Show OSD messages OSD mesajlarını göster - + Show filename instead of ROM name in title bar Başlık çubuğunda ROM adı yerine dosya adını göster - + Fast forward speed: Hızlı sarma hızı: - - + + Unbounded Sınırsız - + Fast forward (held) speed: İleri sarma (tutulan) hızı: - + Autofire interval: Otomatik ateşleme aralığı: - + Enable rewind Geri sarmayı etkinleştir - + Rewind history: Geri alma tarihi: - + Idle loops: - + Run all Hepsini çalıştır - + Remove known Bilinenleri kaldır - + Detect and remove Algıla ve kaldır - + Preload entire ROM into memory Tüm ROM'u belleğe önceden yükle - - + + Screenshot Ekran görüntüsü - - + + Cheat codes Hile kodları - + Enable Game Boy Player features by default Game Boy Player özelliklerini varsayılan olarak etkinleştir - + Video renderer: Video oluşturucu: - + Software Yazılım - + OpenGL OpenGL - + OpenGL enhancements OpenGL geliştirmeleri - + High-resolution scale: Yüksek kalite ölçeği: - + (240×160) (240×160) - + XQ GBA audio (experimental) XQ GBA ses (deneysel) - + GB BIOS file: GB BIOS dosyası: - - - - - - - - - + + + + + + + + + Browse Gözat - + Use BIOS file if found Varsa BIOS dosyasını kullan - + Skip BIOS intro BIOS girişini atla - + GBA BIOS file: GBA BIOS dosyası: - + GBC BIOS file: GBC BIOS dosyası: - + SGB BIOS file: SGB BIOS dosyası: - + Save games Oyunları kaydet - - - - - + + + + + Same directory as the ROM ROM ile aynı dizin - + Save states Konum kaydedici - + Screenshots Ekran Görüntüleri - + Patches Yamalar - + Cheats Hileler - + Log to file Dosyaya günlüğünü gir - + Log to console Konsola günlüğünü gir - + Select Log File Günlük Dosyasını Seç - + Default BG colors: - + Super Game Boy borders Super Game Boy sınırları - + Default sprite colors 1: Varsayılan sprite renkleri 1: - + Default sprite colors 2: Varsayılan sprite renkleri 2: diff --git a/src/platform/qt/ts/mgba-zh_CN.ts b/src/platform/qt/ts/mgba-zh_CN.ts index a7a4a0c4d..f8c225dda 100644 --- a/src/platform/qt/ts/mgba-zh_CN.ts +++ b/src/platform/qt/ts/mgba-zh_CN.ts @@ -3933,55 +3933,55 @@ Download size: %3 控制器 - + Shortcuts 快捷键 - - + + Shaders 着色器 - + Select BIOS 选择 BIOS - + Select directory 选择目录 - + (%1×%2) (%1×%2) - + Never 从不 - + Just now 刚刚 - + Less than an hour ago 不到一小时前 - + %n hour(s) ago %n 小时前 - + %n day(s) ago %n 天前 @@ -5282,8 +5282,8 @@ Download size: %3 - - + + Mute 静音 @@ -5329,7 +5329,7 @@ Download size: %3 - + frames @@ -5374,93 +5374,93 @@ Download size: %3 双线性过滤 - - + + Pause 暂停 - + When inactive: 不活跃时: - + When minimized: 最小化时: - + Current channel: 当前通道: - + Current version: 当前版本: - + Update channel: 更新通道: - + Available version: 可用版本: - + (Unknown) (未知) - + Last checked: 上次检查更新时间: - + Automatically check on start 启动时自动检查 - + Check now 立即检查更新 - + Default color palette only 只使用默认调色板 - + SGB color palette if available 可用时使用 SGB 调色板 - + GBC color palette if available 可用时使用 GBC 调色板 - + SGB (preferred) or GBC color palette if available 可用时使用 SGB(首选)或 GBC 调色板 - + Game Boy Camera Game Boy Camera - + Driver: 驱动: - + Source: 来源: @@ -5480,363 +5480,363 @@ Download size: %3 语言 - + Library: 库: - + List view 列表视图 - + Tree view 树状视图 - + Show when no game open 未打开游戏时显示 - + Clear cache 清除缓存 - + Allow opposing input directions 允许相对方向输入 - + Suspend screensaver 停用屏幕保护程序 - + Dynamically update window title 动态更新窗口标题 - + Show filename instead of ROM name in title bar 标题栏显示文件名而不显示 ROM 名称 - + Show OSD messages 显示 OSD 信息 - + Enable Discord Rich Presence 启用 Discord Rich Presence - + Automatically save state 自动存档 - + Automatically load state 自动读档 - + Automatically save cheats 自动保存作弊码 - + Automatically load cheats 自动载入作弊码 - + Show FPS in title bar 在标题栏显示 FPS - + Fast forward speed: 快进速度: - - + + Unbounded 不限制 - + Fast forward (held) speed: 快进 (按住) 速度: - + Autofire interval: 连发间隔: - + Enable rewind 启用倒带 - + Rewind history: 倒带历史: - + Idle loops: 空循环: - + Run all 全部运行 - + Remove known 移除已知 - + Detect and remove 检测并移除 - + Preload entire ROM into memory 将整个 ROM 预载到内存中 - + Save state extra data: 保存存档附加数据: - - + + Save game 保存游戏 - + Load state extra data: 载入存档附加数据: - + Models 型号 - + GB only: 仅 GB: - + SGB compatible: 兼容 SGB: - + GBC only: 仅 GBC: - + GBC compatible: 兼容 GBC: - + SGB and GBC compatible: 兼容 SGB 和 GBC: - + Game Boy palette Game Boy 调色板 - + Preset: 预设: - - + + Screenshot 截图 - - + + Cheat codes 作弊码 - + Enable Game Boy Player features by default 默认启用 Game Boy Player 功能 - + Enable VBA bug compatibility in ROM hacks 启用用于改版的 VBA 漏洞兼容模式 - + Video renderer: 视频渲染器: - + Software 软件 - + OpenGL OpenGL - + OpenGL enhancements OpenGL 增强 - + High-resolution scale: 高分辨率比例: - + (240×160) (240×160) - + XQ GBA audio (experimental) XQ GBA 音频 (实验性) - + GB BIOS file: GB BIOS 文件: - - - - - - - - - + + + + + + + + + Browse 浏览 - + Use BIOS file if found 当可用时使用 BIOS 文件 - + Skip BIOS intro 跳过 BIOS 启动画面 - + GBA BIOS file: GBA BIOS 文件: - + GBC BIOS file: GBC BIOS 文件: - + SGB BIOS file: SGB BIOS 文件: - + Save games 游戏存档 - - - - - + + + + + Same directory as the ROM 与 ROM 所在目录相同 - + Save states 即时存档 - + Screenshots 截图 - + Patches 补丁 - + Cheats 作弊码 - + Log to file 记录日志到文件 - + Log to console 记录日志到控制台 - + Select Log File 选择日志文件 - + Default BG colors: 默认背景色: - + Default sprite colors 1: 默认精灵图颜色 1: - + Default sprite colors 2: 默认精灵图颜色 2: - + Super Game Boy borders Super Game Boy 边框 From 48fe88ce362011506e4d5d2e799787ef93a45151 Mon Sep 17 00:00:00 2001 From: Akatsuki Date: Wed, 29 Sep 2021 10:38:40 +0000 Subject: [PATCH 02/59] Qt: Update translation (Japanese) Translation: mGBA/Qt Translate-URL: https://hosted.weblate.org/projects/mgba/mgba-qt/ja/ --- src/platform/qt/ts/mgba-ja.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index 0b131ea3e..905f1ab70 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -958,7 +958,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Gyroscope - 回転センサー + ジャイロセンサー @@ -3219,7 +3219,7 @@ Download size: %3 Comparison Y coordinate - 比較Y座標 + 比較対象のY座標 @@ -3907,7 +3907,7 @@ Download size: %3 OpenGL (force version 1.x) - OpenGL(強制バージョン1.x) + OpenGL(バージョン1.xを強制) @@ -4261,7 +4261,7 @@ Download size: %3 Add folder to library... - ライブリーにフォルダを追加... + ライブラリーにフォルダを追加... @@ -4538,7 +4538,7 @@ Download size: %3 Step backwards - 後退 + 1フレーム巻き戻す @@ -4989,12 +4989,12 @@ Download size: %3 little endian - + リトルエンディアン big endian - + ビッグエンディアン @@ -5167,7 +5167,7 @@ Download size: %3 Enhancements - 機能強化 + 機能拡張 @@ -5287,7 +5287,7 @@ Download size: %3 Fast forward volume: - 早送り音量: + 早送り時の音量: @@ -5540,7 +5540,7 @@ Download size: %3 Enable Game Boy Player features by default - ゲームボーイプレーヤーの機能をデフォルトで有効 + ゲームボーイプレーヤーの機能をデフォルトで有効化 @@ -5575,7 +5575,7 @@ Download size: %3 Library: - ライブラリー: + ライブラリ: @@ -5600,7 +5600,7 @@ Download size: %3 Allow opposing input directions - 反対の入力方向を有効 + 反対方向(上下、右左)の同時入力を許可 @@ -5848,7 +5848,7 @@ Download size: %3 Active Shader: - アクティブシェーダー: + 適用中のシェーダー: From d2bf28b8717138862a57795f5da868d2883c7a9a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 9 Nov 2021 21:59:10 -0800 Subject: [PATCH 03/59] Qt: Fix focus mute an fast-forward mute interfering --- src/platform/qt/CoreController.cpp | 10 +++++++--- src/platform/qt/ts/mgba-de.ts | 10 +++++----- src/platform/qt/ts/mgba-en.ts | 10 +++++----- src/platform/qt/ts/mgba-es.ts | 10 +++++----- src/platform/qt/ts/mgba-fi.ts | 10 +++++----- src/platform/qt/ts/mgba-fr.ts | 10 +++++----- src/platform/qt/ts/mgba-hu.ts | 10 +++++----- src/platform/qt/ts/mgba-it.ts | 10 +++++----- src/platform/qt/ts/mgba-ja.ts | 10 +++++----- src/platform/qt/ts/mgba-ko.ts | 10 +++++----- src/platform/qt/ts/mgba-ms.ts | 10 +++++----- src/platform/qt/ts/mgba-nb_NO.ts | 10 +++++----- src/platform/qt/ts/mgba-nl.ts | 10 +++++----- src/platform/qt/ts/mgba-pl.ts | 10 +++++----- src/platform/qt/ts/mgba-pt_BR.ts | 10 +++++----- src/platform/qt/ts/mgba-ru.ts | 10 +++++----- src/platform/qt/ts/mgba-template.ts | 10 +++++----- src/platform/qt/ts/mgba-tr.ts | 10 +++++----- src/platform/qt/ts/mgba-zh_CN.ts | 10 +++++----- 19 files changed, 97 insertions(+), 93 deletions(-) diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index b71b611ea..408e1078a 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -535,9 +535,13 @@ void CoreController::overrideMute(bool override) { if (m_mute) { core->opts.mute = true; } else { - int fakeBool = 0; - mCoreConfigGetIntValue(&core->config, "mute", &fakeBool); - core->opts.mute = fakeBool; + if (m_fastForward || m_fastForwardForced) { + core->opts.mute = m_fastForwardMute >= 0; + } else { + int fakeBool = 0; + mCoreConfigGetIntValue(&core->config, "mute", &fakeBool); + core->opts.mute = fakeBool; + } } core->reloadConfigOption(core, NULL, NULL); } diff --git a/src/platform/qt/ts/mgba-de.ts b/src/platform/qt/ts/mgba-de.ts index 3160b4750..f4445a375 100644 --- a/src/platform/qt/ts/mgba-de.ts +++ b/src/platform/qt/ts/mgba-de.ts @@ -1296,27 +1296,27 @@ Download-Größe: %3 QGBA::CoreController - + Failed to open save file: %1 Fehler beim Öffnen der Speicherdatei: %1 - + Failed to open game file: %1 Fehler beim Öffnen der Spieldatei: %1 - + Can't yank pack in unexpected platform! Das GamePak kann nur auf unterstützten Plattformen herausgezogen werden! - + Failed to open snapshot file for reading: %1 Konnte Snapshot-Datei %1 nicht zum Lesen öffnen - + Failed to open snapshot file for writing: %1 Konnte Snapshot-Datei %1 nicht zum Schreiben öffnen diff --git a/src/platform/qt/ts/mgba-en.ts b/src/platform/qt/ts/mgba-en.ts index 2df942fa8..86d41d2a8 100644 --- a/src/platform/qt/ts/mgba-en.ts +++ b/src/platform/qt/ts/mgba-en.ts @@ -1292,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 diff --git a/src/platform/qt/ts/mgba-es.ts b/src/platform/qt/ts/mgba-es.ts index 0f1775af7..b6cc3dc95 100644 --- a/src/platform/qt/ts/mgba-es.ts +++ b/src/platform/qt/ts/mgba-es.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Error al abrir el archivo de guardado: %1 - + Failed to open game file: %1 Error al abrir el archivo del juego: %1 - + Can't yank pack in unexpected platform! ¡No se puede remover el cartucho en esta plataforma! - + Failed to open snapshot file for reading: %1 Error al leer del archivo de captura: %1 - + Failed to open snapshot file for writing: %1 Error al escribir al archivo de captura: %1 diff --git a/src/platform/qt/ts/mgba-fi.ts b/src/platform/qt/ts/mgba-fi.ts index d48cdd4e7..b4b69e759 100644 --- a/src/platform/qt/ts/mgba-fi.ts +++ b/src/platform/qt/ts/mgba-fi.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index a95ad8595..9679b2bc9 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -1294,27 +1294,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Échec de l'ouverture du fichier de sauvegarde : %1 - + Failed to open game file: %1 Échec de l'ouverture du fichier de jeu : %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 Échec de l'ouverture de l'instantané pour lire : %1 - + Failed to open snapshot file for writing: %1 Échec de l'ouverture de l'instantané pour écrire : %1 diff --git a/src/platform/qt/ts/mgba-hu.ts b/src/platform/qt/ts/mgba-hu.ts index 466a4572b..9f63f36a9 100644 --- a/src/platform/qt/ts/mgba-hu.ts +++ b/src/platform/qt/ts/mgba-hu.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Nem sikerült a mentésfájl megnyitása: %1 - + Failed to open game file: %1 Nem sikerült a játékfájl megnyitása: %1 - + Can't yank pack in unexpected platform! A játékkazettát nem lehet kirántani ismeretlen platformon! - + Failed to open snapshot file for reading: %1 A pillanatkép fájljának olvasásra való megnyitása sikertelen: %1 - + Failed to open snapshot file for writing: %1 A pillanatkép fájljának írásra való megnyitása sikertelen: %1 diff --git a/src/platform/qt/ts/mgba-it.ts b/src/platform/qt/ts/mgba-it.ts index de5fc78e8..172340855 100644 --- a/src/platform/qt/ts/mgba-it.ts +++ b/src/platform/qt/ts/mgba-it.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Impossibile aprire il file di salvataggio: %1 - + Failed to open game file: %1 Impossibile aprire il file di gioco: %1 - + Can't yank pack in unexpected platform! Non riesco a strappare il pacchetto in una piattaforma inaspettata! - + Failed to open snapshot file for reading: %1 Impossibile aprire il file snapshot per la lettura: %1 - + Failed to open snapshot file for writing: %1 Impossibile aprire il file snapshot per la scrittura: %1 diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index 905f1ab70..04de1273a 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 セーブファイルを開けませんでした: %1 - + Failed to open game file: %1 ゲームファイルを開けませんでした: %1 - + Can't yank pack in unexpected platform! 予期しないプラットフォームでパックをヤンクすることはできません! - + Failed to open snapshot file for reading: %1 読み取り用のスナップショットファイルを開けませんでした: %1 - + Failed to open snapshot file for writing: %1 書き込み用のスナップショットファイルを開けませんでした: %1 diff --git a/src/platform/qt/ts/mgba-ko.ts b/src/platform/qt/ts/mgba-ko.ts index 999e47159..883e1f4a8 100644 --- a/src/platform/qt/ts/mgba-ko.ts +++ b/src/platform/qt/ts/mgba-ko.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 저장 파일을 열지 못했습니다: %1 - + Failed to open game file: %1 게임 파일을 열지 못했습니다: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 읽기 용 스냅샷 파일을 열지 못했습니다: %1 - + Failed to open snapshot file for writing: %1 쓰기 용 스냅샷 파일을 열지 못했습니다: %1 diff --git a/src/platform/qt/ts/mgba-ms.ts b/src/platform/qt/ts/mgba-ms.ts index 5dce03287..d9a1bb9db 100644 --- a/src/platform/qt/ts/mgba-ms.ts +++ b/src/platform/qt/ts/mgba-ms.ts @@ -1292,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Gagal membuka fail tersimpan: %1 - + Failed to open game file: %1 Gagal membuka fail permainan: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 Gagal membuka fail snapshot untuk baca: %1 - + Failed to open snapshot file for writing: %1 Gagal membuka fail snapshot untuk menulis: %1 diff --git a/src/platform/qt/ts/mgba-nb_NO.ts b/src/platform/qt/ts/mgba-nb_NO.ts index 60b58bb0c..fd2a3c03a 100644 --- a/src/platform/qt/ts/mgba-nb_NO.ts +++ b/src/platform/qt/ts/mgba-nb_NO.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 Klarte ikke å åpne spillfil: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 diff --git a/src/platform/qt/ts/mgba-nl.ts b/src/platform/qt/ts/mgba-nl.ts index f86106cf0..5fb62eb12 100644 --- a/src/platform/qt/ts/mgba-nl.ts +++ b/src/platform/qt/ts/mgba-nl.ts @@ -1292,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index e26804618..e307eac3e 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -1292,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 diff --git a/src/platform/qt/ts/mgba-pt_BR.ts b/src/platform/qt/ts/mgba-pt_BR.ts index f1297e7c5..1faa0e005 100644 --- a/src/platform/qt/ts/mgba-pt_BR.ts +++ b/src/platform/qt/ts/mgba-pt_BR.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Falhou em abrir o arquivo do save: %1 - + Failed to open game file: %1 Falhou em abrir o arquivo do jogo: %1 - + Can't yank pack in unexpected platform! Não pode arrancar o pacote numa plataforma inesperada! - + Failed to open snapshot file for reading: %1 Falhou em abrir o arquivo do snapshot pra leitura: %1 - + Failed to open snapshot file for writing: %1 Falhou em abrir o arquivo do snapshot pra gravação: %1 diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 1597367d2..67f332099 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -1296,27 +1296,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Не удалось открыть файл сохранения: %1 - + Failed to open game file: %1 Не удалось открыть файл игры: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 Не удалось открыть файл изображения для считывания: %1 - + Failed to open snapshot file for writing: %1 Не удалось открыть файл изображения для записи: %1 diff --git a/src/platform/qt/ts/mgba-template.ts b/src/platform/qt/ts/mgba-template.ts index 8a22b6254..6ec6eb304 100644 --- a/src/platform/qt/ts/mgba-template.ts +++ b/src/platform/qt/ts/mgba-template.ts @@ -1292,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts index 28295e2d7..1aed94c88 100644 --- a/src/platform/qt/ts/mgba-tr.ts +++ b/src/platform/qt/ts/mgba-tr.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Kayıt dosyası açılamadı: %1 - + Failed to open game file: %1 Oyun dosyası açılamadı: %1 - + Can't yank pack in unexpected platform! Beklenmedik bir platformda kartı çıkaramazsın! - + Failed to open snapshot file for reading: %1 Anlık görüntü dosyası okuma için açılamadı: %1 - + Failed to open snapshot file for writing: %1 Anlık görüntü dosyası yazma için açılamadı: %1 diff --git a/src/platform/qt/ts/mgba-zh_CN.ts b/src/platform/qt/ts/mgba-zh_CN.ts index f8c225dda..a6eeb6719 100644 --- a/src/platform/qt/ts/mgba-zh_CN.ts +++ b/src/platform/qt/ts/mgba-zh_CN.ts @@ -1296,27 +1296,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 打开存档失败: %1 - + Failed to open game file: %1 打开游戏文件失败: %1 - + Can't yank pack in unexpected platform! 无法在意外平台上抽出卡带! - + Failed to open snapshot file for reading: %1 读取快照文件失败: %1 - + Failed to open snapshot file for writing: %1 写入快照文件失败: %1 From 858267da3f9eb675b7acb0c1b7b869c0d43d078a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 10 Nov 2021 13:12:55 -0800 Subject: [PATCH 04/59] GBA: Add flag to allow opposing inputs in key callbacks (fixes #2334) --- include/mgba/core/interface.h | 1 + include/mgba/internal/gba/sio/gbp.h | 2 ++ src/gba/io.c | 6 +++++- src/gba/sio/gbp.c | 6 +++--- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/mgba/core/interface.h b/include/mgba/core/interface.h index 177483597..7ba97e1eb 100644 --- a/include/mgba/core/interface.h +++ b/include/mgba/core/interface.h @@ -195,6 +195,7 @@ struct mAVStream { struct mKeyCallback { uint16_t (*readKeys)(struct mKeyCallback*); + bool requireOpposingDirections; }; enum mPeripheral { diff --git a/include/mgba/internal/gba/sio/gbp.h b/include/mgba/internal/gba/sio/gbp.h index f9ab6beaf..6713cdcaf 100644 --- a/include/mgba/internal/gba/sio/gbp.h +++ b/include/mgba/internal/gba/sio/gbp.h @@ -23,6 +23,8 @@ struct GBASIOPlayer { int txPosition; struct mTimingEvent event; struct GBASIOPlayerKeyCallback callback; + bool oldOpposingDirections; + struct mKeyCallback* oldCallback; }; void GBASIOPlayerInit(struct GBASIOPlayer* gbp); diff --git a/src/gba/io.c b/src/gba/io.c index ec16c6b93..5c90f946a 100644 --- a/src/gba/io.c +++ b/src/gba/io.c @@ -743,11 +743,15 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) { callbacks->keysRead(callbacks->context); } } + bool allowOpposingDirections = gba->allowOpposingDirections; if (gba->keyCallback) { gba->keysActive = gba->keyCallback->readKeys(gba->keyCallback); + if (!allowOpposingDirections) { + allowOpposingDirections = gba->keyCallback->requireOpposingDirections; + } } uint16_t input = gba->keysActive; - if (!gba->allowOpposingDirections) { + if (!allowOpposingDirections) { unsigned rl = input & 0x030; unsigned ud = input & 0x0C0; input &= 0x30F; diff --git a/src/gba/sio/gbp.c b/src/gba/sio/gbp.c index 8ffafd1c8..9faf99e35 100644 --- a/src/gba/sio/gbp.c +++ b/src/gba/sio/gbp.c @@ -41,6 +41,7 @@ static const uint32_t _gbpTxData[] = { void GBASIOPlayerInit(struct GBASIOPlayer* gbp) { gbp->callback.d.readKeys = _gbpRead; + gbp->callback.d.requireOpposingDirections = true; gbp->callback.p = gbp; gbp->d.init = 0; gbp->d.deinit = 0; @@ -72,10 +73,8 @@ void GBASIOPlayerUpdate(struct GBA* gba) { if (GBASIOPlayerCheckScreen(&gba->video)) { ++gba->sio.gbp.inputsPosted; gba->sio.gbp.inputsPosted %= 3; - gba->keyCallback = &gba->sio.gbp.callback.d; } else { - // TODO: Save and restore - gba->keyCallback = 0; + gba->keyCallback = gba->sio.gbp.oldCallback; } gba->sio.gbp.txPosition = 0; return; @@ -86,6 +85,7 @@ void GBASIOPlayerUpdate(struct GBA* gba) { if (GBASIOPlayerCheckScreen(&gba->video)) { gba->memory.hw.devices |= HW_GB_PLAYER; gba->sio.gbp.inputsPosted = 0; + gba->sio.gbp.oldCallback = gba->keyCallback; gba->keyCallback = &gba->sio.gbp.callback.d; // TODO: Check if the SIO driver is actually used first GBASIOSetDriver(&gba->sio, &gba->sio.gbp.d, SIO_NORMAL_32); From e60f0660a46779dcf93813ed7af8f82560fbfaec Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 13 Nov 2021 20:44:07 -0800 Subject: [PATCH 05/59] GB Timer: Fix priorties on events --- src/gb/timer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gb/timer.c b/src/gb/timer.c index 26d115a05..7660eecac 100644 --- a/src/gb/timer.c +++ b/src/gb/timer.c @@ -61,11 +61,11 @@ void GBTimerReset(struct GBTimer* timer) { timer->event.context = timer; timer->event.name = "GB Timer"; timer->event.callback = _GBTimerUpdate; - timer->event.priority = 0x20; + timer->event.priority = 0x21; timer->irq.context = timer; timer->irq.name = "GB Timer IRQ"; timer->irq.callback = _GBTimerIRQ; - timer->event.priority = 0x21; + timer->irq.priority = 0x20; timer->nextDiv = GB_DMG_DIV_PERIOD * 2; timer->timaPeriod = 1024 >> 4; From e8f3db4b3eff1206b58343143cf3a0a76bca5eb1 Mon Sep 17 00:00:00 2001 From: Lothar Serra Mari Date: Mon, 15 Nov 2021 01:59:46 +0100 Subject: [PATCH 06/59] Win32: Add Inno Setup target for the ARM64 platform --- src/platform/windows/setup/setup.iss.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/windows/setup/setup.iss.in b/src/platform/windows/setup/setup.iss.in index 82af9187d..2dc423d92 100644 --- a/src/platform/windows/setup/setup.iss.in +++ b/src/platform/windows/setup/setup.iss.in @@ -60,8 +60,8 @@ SolidCompression=True VersionInfoTextVersion={#VersionString} VersionInfoProductVersion={#AppVer} VersionInfoProductTextVersion={#VersionString} -ArchitecturesInstallIn64BitMode=x64 -ArchitecturesAllowed=x86 x64 +ArchitecturesInstallIn64BitMode=x64 arm64 +ArchitecturesAllowed=x86 x64 arm64 [Languages] Name: "german"; MessagesFile: "compiler:Languages\German.isl" From 4b4eef373f7cd8e36f4a3503f9d8555213e36004 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 16 Nov 2021 18:53:11 -0800 Subject: [PATCH 07/59] SDL: Use SDL_JoystickRumble where available --- CHANGES | 1 + src/platform/sdl/sdl-events.c | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index d43eb4931..326290587 100644 --- a/CHANGES +++ b/CHANGES @@ -39,6 +39,7 @@ Misc: - Qt: Rearrange menus some - Qt: Clean up cheats dialog - Qt: Only set default controller bindings if loading fails (fixes mgba.io/i/799) + - SDL: Use SDL_JoystickRumble where available - Wii: Add adjustable gyroscope settings (closes mgba.io/i/2245) 0.9.2: (2021-07-10) diff --git a/src/platform/sdl/sdl-events.c b/src/platform/sdl/sdl-events.c index 2367e1c12..b7e8b002b 100644 --- a/src/platform/sdl/sdl-events.c +++ b/src/platform/sdl/sdl-events.c @@ -47,7 +47,9 @@ static struct SDL_JoystickCombo* _mSDLOpenJoystick(struct mSDLEvents* events, in joystick->joystick = sdlJoystick; #if SDL_VERSION_ATLEAST(2, 0, 0) joystick->id = SDL_JoystickInstanceID(joystick->joystick); +#if !SDL_VERSION_ATLEAST(2, 0, 9) joystick->haptic = SDL_HapticOpenFromJoystick(joystick->joystick); +#endif joystick->controller = SDL_GameControllerOpen(i); #if SDL_VERSION_ATLEAST(2, 0, 14) if (joystick->controller) { @@ -75,9 +77,11 @@ bool mSDLInitEvents(struct mSDLEvents* context) { #if SDL_VERSION_ATLEAST(2, 0, 0) SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1"); +#if !SDL_VERSION_ATLEAST(2, 0, 9) if (SDL_InitSubSystem(SDL_INIT_HAPTIC) < 0) { mLOG(SDL_EVENTS, ERROR, "SDL haptic initialization failed: %s", SDL_GetError()); } +#endif if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER) < 0) { mLOG(SDL_EVENTS, ERROR, "SDL game controller initialization failed: %s", SDL_GetError()); } @@ -121,7 +125,9 @@ void mSDLDeinitEvents(struct mSDLEvents* context) { struct SDL_JoystickCombo* joystick = SDL_JoystickListGetPointer(&context->joysticks, i); #if SDL_VERSION_ATLEAST(2, 0, 0) SDL_GameControllerClose(joystick->controller); +#if !SDL_VERSION_ATLEAST(2, 0, 9) SDL_HapticClose(joystick->haptic); +#endif #endif SDL_JoystickClose(joystick->joystick); } @@ -243,7 +249,7 @@ bool mSDLAttachPlayer(struct mSDLEvents* events, struct mSDLPlayer* player) { if (index != SIZE_MAX) { player->joystick = SDL_JoystickListGetPointer(&events->joysticks, index); -#if SDL_VERSION_ATLEAST(2, 0, 0) +#if SDL_VERSION_ATLEAST(2, 0, 0) && !SDL_VERSION_ATLEAST(2, 0, 9) if (player->joystick->haptic) { SDL_HapticRumbleInit(player->joystick->haptic); } @@ -649,7 +655,11 @@ void mSDLHandleEvent(struct mCoreThread* context, struct mSDLPlayer* sdlContext, #if SDL_VERSION_ATLEAST(2, 0, 0) static void _mSDLSetRumble(struct mRumble* rumble, int enable) { struct mSDLRumble* sdlRumble = (struct mSDLRumble*) rumble; - if (!sdlRumble->p->joystick || !sdlRumble->p->joystick->haptic || !SDL_HapticRumbleSupported(sdlRumble->p->joystick->haptic)) { + if (!sdlRumble->p->joystick +#if !SDL_VERSION_ATLEAST(2, 0, 9) + || !sdlRumble->p->joystick->haptic || !SDL_HapticRumbleSupported(sdlRumble->p->joystick->haptic) +#endif + ) { return; } int8_t originalLevel = sdlRumble->level; @@ -668,12 +678,16 @@ static void _mSDLSetRumble(struct mRumble* rumble, int enable) { return; } sdlRumble->activeLevel = activeLevel; +#if SDL_VERSION_ATLEAST(2, 0, 9) + SDL_JoystickRumble(sdlRumble->p->joystick->joystick, activeLevel * 0xFFFF, activeLevel * 0xFFFF, 500); +#else if (sdlRumble->activeLevel > 0.5 / RUMBLE_STEPS) { SDL_HapticRumbleStop(sdlRumble->p->joystick->haptic); SDL_HapticRumblePlay(sdlRumble->p->joystick->haptic, activeLevel, 500); } else { SDL_HapticRumbleStop(sdlRumble->p->joystick->haptic); } +#endif } #endif From fdd03e505e7eb3e2475320d1c6854b1f4106c829 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 17 Nov 2021 17:33:18 -0800 Subject: [PATCH 08/59] GBA Video: Fix cache updating with proxy and GL renderers --- CHANGES | 1 + src/gba/extra/proxy.c | 4 ++++ src/gba/renderers/gl.c | 8 ++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 326290587..40be45656 100644 --- a/CHANGES +++ b/CHANGES @@ -29,6 +29,7 @@ Other fixes: - GB Video: Fix memory leak when reseting SGB games - GBA: Fix out of bounds ROM accesses on patched ROMs smaller than 32 MiB - GBA: Fix maximum tile ID in caching for 256-color modes + - GBA Video: Fix cache updating with proxy and GL renderers - Libretro: Fix crash when using Game Boy codes (fixes mgba.io/i/2281) - Qt: Fix corrupted savestate and fatal error text - Qt: Fix sprite compositing when sprite tiles go out of bounds (fixes mgba.io/i/2348) diff --git a/src/gba/extra/proxy.c b/src/gba/extra/proxy.c index 1a2c57028..a7f28d153 100644 --- a/src/gba/extra/proxy.c +++ b/src/gba/extra/proxy.c @@ -8,6 +8,7 @@ #include #include #include +#include static void GBAVideoProxyRendererInit(struct GBAVideoRenderer* renderer); static void GBAVideoProxyRendererReset(struct GBAVideoRenderer* renderer); @@ -267,6 +268,9 @@ uint16_t GBAVideoProxyRendererWriteVideoRegister(struct GBAVideoRenderer* render if (address > REG_BLDY) { return value; } + if (renderer->cache) { + GBAVideoCacheWriteVideoRegister(renderer->cache, address, value); + } mVideoLoggerRendererWriteVideoRegister(proxyRenderer->logger, address, value); if (!proxyRenderer->logger->block) { diff --git a/src/gba/renderers/gl.c b/src/gba/renderers/gl.c index 7ab07c2be..2c16943d5 100644 --- a/src/gba/renderers/gl.c +++ b/src/gba/renderers/gl.c @@ -948,6 +948,9 @@ void GBAVideoGLRendererReset(struct GBAVideoRenderer* renderer) { void GBAVideoGLRendererWriteVRAM(struct GBAVideoRenderer* renderer, uint32_t address) { struct GBAVideoGLRenderer* glRenderer = (struct GBAVideoGLRenderer*) renderer; + if (renderer->cache) { + mCacheSetWriteVRAM(renderer->cache, address); + } glRenderer->vramDirty |= 1 << (address >> 12); } @@ -959,8 +962,9 @@ void GBAVideoGLRendererWriteOAM(struct GBAVideoRenderer* renderer, uint32_t oam) void GBAVideoGLRendererWritePalette(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) { struct GBAVideoGLRenderer* glRenderer = (struct GBAVideoGLRenderer*) renderer; - UNUSED(address); - UNUSED(value); + if (renderer->cache) { + mCacheSetWritePalette(renderer->cache, address >> 1, mColorFrom555(value)); + } glRenderer->paletteDirty = true; int r = M_R5(value); int g = M_G5(value) << 1; From dfd44b280fce15540f9ed0208a02faf5ba36de25 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 17 Nov 2021 17:52:25 -0800 Subject: [PATCH 09/59] Qt: Pay down technical debt with map caches --- include/mgba/core/map-cache.h | 2 ++ src/core/map-cache.c | 6 +++--- src/platform/qt/AssetView.cpp | 8 ++++++-- src/platform/qt/AssetView.h | 2 +- src/platform/qt/FrameView.cpp | 2 +- src/platform/qt/FrameView.h | 2 +- src/platform/qt/MapView.cpp | 10 ++++++++-- src/platform/qt/MapView.h | 4 ++-- 8 files changed, 24 insertions(+), 12 deletions(-) diff --git a/include/mgba/core/map-cache.h b/include/mgba/core/map-cache.h index 6dc9e72f6..2bd5934e8 100644 --- a/include/mgba/core/map-cache.h +++ b/include/mgba/core/map-cache.h @@ -31,6 +31,8 @@ DECL_BIT(mMapCacheEntryFlags, HMirror, 5); DECL_BIT(mMapCacheEntryFlags, VMirror, 6); DECL_BITS(mMapCacheEntryFlags, Mirror, 5, 2); +#define mMapCacheTileCount(C) (1 << mMapCacheSystemInfoGetTilesWide((C)->sysConfig)) * (1 << mMapCacheSystemInfoGetTilesHigh((C)->sysConfig)) + struct mMapCacheEntry { uint32_t vramVersion; uint16_t tileId; diff --git a/src/core/map-cache.c b/src/core/map-cache.c index 470f72b89..17df206dd 100644 --- a/src/core/map-cache.c +++ b/src/core/map-cache.c @@ -32,7 +32,7 @@ static void _redoCacheSize(struct mMapCache* cache) { return; } - size_t tiles = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * (1 << mMapCacheSystemInfoGetTilesHigh(cache->sysConfig)); + size_t tiles = mMapCacheTileCount(cache); cache->cache = anonymousMemoryMap(8 * 8 * sizeof(color_t) * tiles); cache->status = anonymousMemoryMap(tiles * sizeof(*cache->status)); } @@ -54,12 +54,12 @@ void mMapCacheConfigureSystem(struct mMapCache* cache, mMapCacheSystemInfo confi cache->sysConfig = config; _redoCacheSize(cache); - size_t mapSize = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * (1 << mMapCacheSystemInfoGetTilesHigh(cache->sysConfig)); + size_t mapSize = mMapCacheTileCount(cache); cache->mapSize = mapSize << mMapCacheSystemInfoGetMapAlign(cache->sysConfig); } void mMapCacheConfigureMap(struct mMapCache* cache, uint32_t mapStart) { - size_t tiles = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * (1 << mMapCacheSystemInfoGetTilesHigh(cache->sysConfig)); + size_t tiles = mMapCacheTileCount(cache); memset(cache->status, 0, tiles * sizeof(*cache->status)); cache->mapStart = mapStart; } diff --git a/src/platform/qt/AssetView.cpp b/src/platform/qt/AssetView.cpp index 66574b0df..034b0b420 100644 --- a/src/platform/qt/AssetView.cpp +++ b/src/platform/qt/AssetView.cpp @@ -112,15 +112,19 @@ void AssetView::compositeTile(const void* tBuffer, void* buffer, size_t stride, } } -QImage AssetView::compositeMap(int map, mMapCacheEntry* mapStatus) { +QImage AssetView::compositeMap(int map, QVector* mapStatus) { mMapCache* mapCache = mMapCacheSetGetPointer(&m_cacheSet->maps, map); int tilesW = 1 << mMapCacheSystemInfoGetTilesWide(mapCache->sysConfig); int tilesH = 1 << mMapCacheSystemInfoGetTilesHigh(mapCache->sysConfig); + if (mapStatus->size() != tilesW * tilesH) { + mapStatus->resize(tilesW * tilesH); + mapStatus->fill({}); + } QImage rawMap = QImage(QSize(tilesW * 8, tilesH * 8), QImage::Format_ARGB32); uchar* bgBits = rawMap.bits(); for (int j = 0; j < tilesH; ++j) { for (int i = 0; i < tilesW; ++i) { - mMapCacheCleanTile(mapCache, mapStatus, i, j); + mMapCacheCleanTile(mapCache, mapStatus->data(), i, j); } for (int i = 0; i < 8; ++i) { memcpy(static_cast(&bgBits[tilesW * 32 * (i + j * 8)]), mMapCacheGetRow(mapCache, i + j * 8), tilesW * 32); diff --git a/src/platform/qt/AssetView.h b/src/platform/qt/AssetView.h index 96039866f..49c275e60 100644 --- a/src/platform/qt/AssetView.h +++ b/src/platform/qt/AssetView.h @@ -54,7 +54,7 @@ protected: }; static void compositeTile(const void* tile, void* image, size_t stride, size_t x, size_t y, int depth = 8); - QImage compositeMap(int map, mMapCacheEntry*); + QImage compositeMap(int map, QVector*); QImage compositeObj(const ObjInfo&); bool lookupObj(int id, struct ObjInfo*); diff --git a/src/platform/qt/FrameView.cpp b/src/platform/qt/FrameView.cpp index 530e8a2e5..d09e477ba 100644 --- a/src/platform/qt/FrameView.cpp +++ b/src/platform/qt/FrameView.cpp @@ -245,7 +245,7 @@ void FrameView::updateTilesGBA(bool) { m_queue.append({ { LayerId::BACKGROUND, bg }, !m_disabled.contains({ LayerId::BACKGROUND, bg }), - QPixmap::fromImage(compositeMap(bg, m_mapStatus[bg])), + QPixmap::fromImage(compositeMap(bg, &m_mapStatus[bg])), {}, offset, true, false }); if (m_queue.back().image.hasAlpha()) { diff --git a/src/platform/qt/FrameView.h b/src/platform/qt/FrameView.h index c3054b2a7..02844d7ed 100644 --- a/src/platform/qt/FrameView.h +++ b/src/platform/qt/FrameView.h @@ -108,7 +108,7 @@ private: QSet m_disabled; QPixmap m_composited; QPixmap m_rendered; - mMapCacheEntry m_mapStatus[4][128 * 128] = {}; // TODO: Correct size + QVector m_mapStatus[4]; ColorPicker m_backdropPicker; QColor m_overrideBackdrop; diff --git a/src/platform/qt/MapView.cpp b/src/platform/qt/MapView.cpp index be709a8f9..61347d501 100644 --- a/src/platform/qt/MapView.cpp +++ b/src/platform/qt/MapView.cpp @@ -116,12 +116,18 @@ void MapView::selectMap(int map) { return; } m_map = map; + m_mapStatus.fill({}); updateTiles(true); } void MapView::selectTile(int x, int y) { CoreController::Interrupter interrupter(m_controller); mMapCache* mapCache = mMapCacheSetGetPointer(&m_cacheSet->maps, m_map); + int tiles = mMapCacheTileCount(mapCache); + if (m_mapStatus.size() != tiles) { + m_mapStatus.resize(tiles); + m_mapStatus.fill({}); + } size_t tileCache = mTileCacheSetIndex(&m_cacheSet->tiles, mapCache->tileCache); m_ui.tile->setBoundary(m_boundary, tileCache, tileCache); uint32_t location = mMapCacheTileId(mapCache, x, y); @@ -221,7 +227,7 @@ void MapView::updateTilesGBA(bool) { m_rawMap = QImage(QSize(width, height), QImage::Format_ARGB32); uchar* bgBits = m_rawMap.bits(); for (int j = 0; j < height; ++j) { - mBitmapCacheCleanRow(bitmapCache, m_bitmapStatus, j); + mBitmapCacheCleanRow(bitmapCache, m_bitmapStatus.data(), j); memcpy(static_cast(&bgBits[width * j * 4]), mBitmapCacheGetRow(bitmapCache, j), width * 4); } m_rawMap = m_rawMap.convertToFormat(QImage::Format_RGB32).rgbSwapped(); @@ -239,7 +245,7 @@ void MapView::updateTilesGBA(bool) { m_ui.bgInfo->setCustomProperty("priority", priority); m_ui.bgInfo->setCustomProperty("offset", offset); m_ui.bgInfo->setCustomProperty("transform", transform); - m_rawMap = compositeMap(m_map, m_mapStatus); + m_rawMap = compositeMap(m_map, &m_mapStatus); } } QPixmap map = QPixmap::fromImage(m_rawMap.convertToFormat(QImage::Format_RGB32)); diff --git a/src/platform/qt/MapView.h b/src/platform/qt/MapView.h index 89c09259b..1a3ca1b91 100644 --- a/src/platform/qt/MapView.h +++ b/src/platform/qt/MapView.h @@ -43,8 +43,8 @@ private: Ui::MapView m_ui; std::shared_ptr m_controller; - mMapCacheEntry m_mapStatus[128 * 128] = {}; // TODO: Correct size - mBitmapCacheEntry m_bitmapStatus[512 * 2] = {}; // TODO: Correct size + QVector m_mapStatus; + QVector m_bitmapStatus{512 * 2}; // TODO: Correct size int m_map = 0; QImage m_rawMap; int m_boundary; From 00865992909e17bc69e2a13e98877340a8d0903b Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 18 Nov 2021 23:21:04 -0800 Subject: [PATCH 10/59] Qt: Do some basic filtering on too-minimal OpenGL 1.x implementations --- src/platform/qt/DisplayGL.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/platform/qt/DisplayGL.cpp b/src/platform/qt/DisplayGL.cpp index d949eb016..3736e34e0 100644 --- a/src/platform/qt/DisplayGL.cpp +++ b/src/platform/qt/DisplayGL.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -125,7 +126,22 @@ bool DisplayGL::supportsFormat(const QSurfaceFormat& format) { context.format().profile() == QSurfaceFormat::CompatibilityProfile || context.format().testOption(QSurfaceFormat::DeprecatedFunctions))) { // Supports the old stuff - s_supports[format] = true; + QOffscreenSurface surface; + surface.create(); + if (!context.makeCurrent(&surface)) { + s_supports[format] = false; + return false; + } +#ifdef Q_OS_WIN + QLatin1String renderer(reinterpret_cast(context.functions()->glGetString(GL_RENDERER))); + if (renderer == "GDI Generic") { + // Windows' software OpenGL 1.1 implementation is not sufficient + s_supports[format] = false; + return false; + } +#endif + s_supports[format] = context,hasExtension("GL_EXT_blend_color"); // Core as of 1.2 + context.doneCurrent(); } else if (!context.isOpenGLES() && format.version() >= qMakePair(2, 1) && foundVersion < qMakePair(3, 0) && foundVersion >= qMakePair(2, 1)) { // Weird edge case we support if ARB_framebuffer_object is present QOffscreenSurface surface; From cf5d85ac05f7681faadc39dabc93f7faf5c918dc Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 18 Nov 2021 23:25:11 -0800 Subject: [PATCH 11/59] Qt: Fix build --- src/platform/qt/DisplayGL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/qt/DisplayGL.cpp b/src/platform/qt/DisplayGL.cpp index 3736e34e0..7d30765d5 100644 --- a/src/platform/qt/DisplayGL.cpp +++ b/src/platform/qt/DisplayGL.cpp @@ -140,7 +140,7 @@ bool DisplayGL::supportsFormat(const QSurfaceFormat& format) { return false; } #endif - s_supports[format] = context,hasExtension("GL_EXT_blend_color"); // Core as of 1.2 + s_supports[format] = context.hasExtension("GL_EXT_blend_color"); // Core as of 1.2 context.doneCurrent(); } else if (!context.isOpenGLES() && format.version() >= qMakePair(2, 1) && foundVersion < qMakePair(3, 0) && foundVersion >= qMakePair(2, 1)) { // Weird edge case we support if ARB_framebuffer_object is present From c3746d629f11aa2555637c0766a2008e453aab55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Berder?= <18538310+francois-berder@users.noreply.github.com> Date: Wed, 24 Nov 2021 22:29:26 +0100 Subject: [PATCH 12/59] Debugger: Fix buffer overflow in _doTrace (#2361) --- src/debugger/cli-debugger.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debugger/cli-debugger.c b/src/debugger/cli-debugger.c index 2a71d0857..3bac2c8ab 100644 --- a/src/debugger/cli-debugger.c +++ b/src/debugger/cli-debugger.c @@ -744,7 +744,7 @@ static bool _doTrace(struct CLIDebugger* debugger) { trace[sizeof(trace) - 1] = '\0'; size_t traceSize = sizeof(trace) - 2; debugger->d.platform->trace(debugger->d.platform, trace, &traceSize); - if (traceSize + 1 <= sizeof(trace)) { + if (traceSize + 2 <= sizeof(trace)) { trace[traceSize] = '\n'; trace[traceSize + 1] = '\0'; } From eeeefa4532e36107e8fac69d88ad6b0091a84f96 Mon Sep 17 00:00:00 2001 From: nia <29542929+alarixnia@users.noreply.github.com> Date: Mon, 29 Nov 2021 10:53:18 +0100 Subject: [PATCH 13/59] NetBSD build fixes (#2366) --- CMakeLists.txt | 4 +++- include/mgba-util/math.h | 2 ++ include/mgba-util/platform/posix/threading.h | 2 ++ src/core/flags.h.in | 6 ++++++ src/util/formatting.c | 4 ++-- 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6998ef3a6..2945a754f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -320,6 +320,8 @@ find_function(setlocale) find_function(snprintf_l) find_function(uselocale) +find_function(popcount32) + find_function(futimens) find_function(futimes) @@ -368,7 +370,7 @@ if(USE_PTHREADS) endif() endif() -if(HAVE_NEWLOCALE AND HAVE_FREELOCALE AND HAVE_USELOCALE OR APPLE) +if(HAVE_NEWLOCALE AND HAVE_FREELOCALE OR APPLE) list(APPEND FUNCTION_DEFINES HAVE_LOCALE) if (HAVE_SNPRINTF_L) list(APPEND FUNCTION_DEFINES HAVE_SNPRINTF_L) diff --git a/include/mgba-util/math.h b/include/mgba-util/math.h index 05a5c1bb9..8402da3db 100644 --- a/include/mgba-util/math.h +++ b/include/mgba-util/math.h @@ -10,11 +10,13 @@ CXX_GUARD_START +#ifndef HAVE_POPCOUNT32 static inline uint32_t popcount32(unsigned bits) { bits = bits - ((bits >> 1) & 0x55555555); bits = (bits & 0x33333333) + ((bits >> 2) & 0x33333333); return (((bits + (bits >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24; } +#endif static inline unsigned clz32(uint32_t bits) { #if defined(__GNUC__) || __clang__ diff --git a/include/mgba-util/platform/posix/threading.h b/include/mgba-util/platform/posix/threading.h index 32d2ea4b1..b27d6f1fd 100644 --- a/include/mgba-util/platform/posix/threading.h +++ b/include/mgba-util/platform/posix/threading.h @@ -94,6 +94,8 @@ static inline int ThreadSetName(const char* name) { #elif defined(__HAIKU__) rename_thread(find_thread(NULL), name); return 0; +#elif defined(__NetBSD__) + return pthread_setname_np(pthread_self(), "%s", (void *) name); #elif defined(HAVE_PTHREAD_SETNAME_NP) return pthread_setname_np(pthread_self(), name); #else diff --git a/src/core/flags.h.in b/src/core/flags.h.in index 273e2c708..71ea562ef 100644 --- a/src/core/flags.h.in +++ b/src/core/flags.h.in @@ -119,4 +119,10 @@ #cmakedefine USE_ZLIB #endif +// HAVE flags + +#ifndef HAVE_POPCOUNT32 +#cmakedefine HAVE_POPCOUNT32 +#endif + #endif diff --git a/src/util/formatting.c b/src/util/formatting.c index f4ec707e2..e1e1c0bf0 100644 --- a/src/util/formatting.c +++ b/src/util/formatting.c @@ -10,7 +10,7 @@ int ftostr_l(char* restrict str, size_t size, float f, locale_t locale) { #ifdef HAVE_SNPRINTF_L return snprintf_l(str, size, locale, "%.*g", FLT_DIG, f); -#elif defined(HAVE_LOCALE) +#elif defined(HAVE_USELOCALE) locale_t old = uselocale(locale); int res = snprintf(str, size, "%.*g", FLT_DIG, f); uselocale(old); @@ -28,7 +28,7 @@ int ftostr_l(char* restrict str, size_t size, float f, locale_t locale) { #ifndef HAVE_STRTOF_L float strtof_l(const char* restrict str, char** restrict end, locale_t locale) { -#ifdef HAVE_LOCALE +#ifdef HAVE_USELOCALE locale_t old = uselocale(locale); float res = strtof(str, end); uselocale(old); From d42a13c4b627cf1535f014ce7d41600aaf0d6f03 Mon Sep 17 00:00:00 2001 From: Lorenzooone Date: Mon, 29 Nov 2021 10:55:01 +0100 Subject: [PATCH 14/59] [SDL]: Add logFile support (#2345) --- src/platform/sdl/main.c | 79 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/src/platform/sdl/main.c b/src/platform/sdl/main.c index fdf88703e..2e3b18514 100644 --- a/src/platform/sdl/main.c +++ b/src/platform/sdl/main.c @@ -38,11 +38,20 @@ #include #define PORT "sdl" +#define MAX_LOG_BUF 1024 static void mSDLDeinit(struct mSDLRenderer* renderer); static int mSDLRun(struct mSDLRenderer* renderer, struct mArguments* args); +static void _setLogger(struct mCore* core); +static void _mCoreLog(struct mLogger* logger, int category, enum mLogLevel level, const char* format, va_list args); + +static bool _logToStdout = true; +static struct VFile* _logFile = NULL; +static struct mLogFilter _filter; +static struct mLogger _logger; + static struct VFile* _state = NULL; static void _loadState(struct mCoreThread* thread) { @@ -60,6 +69,7 @@ int main(int argc, char** argv) { .videoSync = false, .audioSync = true, .volume = 0x100, + .logLevel = mLOG_WARN | mLOG_ERROR | mLOG_FATAL, }; struct mArguments args; @@ -175,6 +185,7 @@ int main(int argc, char** argv) { int ret; // TODO: Use opts and config + _setLogger(renderer.core); ret = mSDLRun(&renderer, &args); mSDLDetachPlayer(&renderer.events, &renderer.player); mInputMapDeinit(&renderer.core->inputMap); @@ -258,8 +269,14 @@ int mSDLRun(struct mSDLRenderer* renderer, struct mArguments* args) { renderer->audio.samples = renderer->core->opts.audioBuffers; renderer->audio.sampleRate = 44100; - + + struct mThreadLogger threadLogger; + threadLogger.d = _logger; + threadLogger.p = &thread; + thread.logger = threadLogger; + bool didFail = !mCoreThreadStart(&thread); + if (!didFail) { #if SDL_VERSION_ATLEAST(2, 0, 0) renderer->core->desiredVideoDimensions(renderer->core, &renderer->width, &renderer->height); @@ -321,3 +338,63 @@ static void mSDLDeinit(struct mSDLRenderer* renderer) { SDL_Quit(); } + +static void _setLogger(struct mCore* core) { + int fakeBool = 0; + bool logToFile = false; + + if (mCoreConfigGetIntValue(&core->config, "logToStdout", &fakeBool)) { + _logToStdout = fakeBool; + } + if (mCoreConfigGetIntValue(&core->config, "logToFile", &fakeBool)) { + logToFile = fakeBool; + } + const char* logFile = mCoreConfigGetValue(&core->config, "logFile"); + + if (logToFile && logFile) { + _logFile = VFileOpen(logFile, O_WRONLY | O_CREAT | O_APPEND); + } + + // Create the filter + mLogFilterInit(&_filter); + mLogFilterLoad(&_filter, &core->config); + + // Fill the logger + _logger.log = _mCoreLog; + _logger.filter = &_filter; +} + +static void _mCoreLog(struct mLogger* logger, int category, enum mLogLevel level, const char* format, va_list args) { + struct mCoreThread* thread = mCoreThreadGet(); + if (thread && level == mLOG_FATAL) { + mCoreThreadMarkCrashed(thread); + } + + if (!mLogFilterTest(logger->filter, category, level)) { + return; + } + + char buffer[MAX_LOG_BUF]; + + // Prepare the string + size_t length = snprintf(buffer, sizeof(buffer), "%s: ", mLogCategoryName(category)); + if (length < sizeof(buffer)) { + length += vsnprintf(buffer + length, sizeof(buffer) - length, format, args); + } + if (length < sizeof(buffer)) { + length += snprintf(buffer + length, sizeof(buffer) - length, "\n"); + } + + // Make sure the length doesn't exceed the size of the buffer when actually writing + if (length > sizeof(buffer)) { + length = sizeof(buffer); + } + + if (_logToStdout) { + printf("%s", buffer); + } + + if (_logFile) { + _logFile->write(_logFile, buffer, length); + } +} From 283196ceb3f392c7ced7e554300e7f6093a2e4d7 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 25 Nov 2021 18:02:54 -0800 Subject: [PATCH 15/59] Qt: Save converter now supports importing SharkPort saves --- CHANGES | 1 + include/mgba/internal/gba/sharkport.h | 2 + src/gba/sharkport.c | 136 ++++++++++++++++---------- src/platform/qt/SaveConverter.cpp | 65 +++++++++--- src/platform/qt/SaveConverter.h | 13 ++- 5 files changed, 148 insertions(+), 69 deletions(-) diff --git a/CHANGES b/CHANGES index 40be45656..c42b72859 100644 --- a/CHANGES +++ b/CHANGES @@ -40,6 +40,7 @@ Misc: - Qt: Rearrange menus some - Qt: Clean up cheats dialog - Qt: Only set default controller bindings if loading fails (fixes mgba.io/i/799) + - Qt: Save converter now supports importing SharkPort saves - SDL: Use SDL_JoystickRumble where available - Wii: Add adjustable gyroscope settings (closes mgba.io/i/2245) diff --git a/include/mgba/internal/gba/sharkport.h b/include/mgba/internal/gba/sharkport.h index 361d4eb44..7c689d7b7 100644 --- a/include/mgba/internal/gba/sharkport.h +++ b/include/mgba/internal/gba/sharkport.h @@ -13,6 +13,8 @@ CXX_GUARD_START struct GBA; struct VFile; +int GBASavedataSharkPortPayloadSize(struct VFile* vf); +void* GBASavedataSharkPortGetPayload(struct VFile* vf, size_t* size, uint8_t* header, bool testChecksum); bool GBASavedataImportSharkPort(struct GBA* gba, struct VFile* vf, bool testChecksum); bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf); diff --git a/src/gba/sharkport.c b/src/gba/sharkport.c index de8ccd4d4..3de45e1c5 100644 --- a/src/gba/sharkport.c +++ b/src/gba/sharkport.c @@ -11,118 +11,155 @@ static const char* const SHARKPORT_HEADER = "SharkPortSave"; -bool GBASavedataImportSharkPort(struct GBA* gba, struct VFile* vf, bool testChecksum) { +int GBASavedataSharkPortPayloadSize(struct VFile* vf) { union { char c[0x1C]; int32_t i; } buffer; + vf->seek(vf, 0, SEEK_SET); if (vf->read(vf, &buffer.i, 4) < 4) { - return false; + return 0; } int32_t size; LOAD_32(size, 0, &buffer.i); if (size != (int32_t) strlen(SHARKPORT_HEADER)) { - return false; + return 0; } if (vf->read(vf, buffer.c, size) < size) { - return false; + return 0; } if (memcmp(SHARKPORT_HEADER, buffer.c, size) != 0) { - return false; + return 0; } if (vf->read(vf, &buffer.i, 4) < 4) { - return false; + return 0; } LOAD_32(size, 0, &buffer.i); if (size != 0x000F0000) { // What is this value? - return false; + return 0; } // Skip first three fields if (vf->read(vf, &buffer.i, 4) < 4) { - return false; + return 0; } LOAD_32(size, 0, &buffer.i); if (vf->seek(vf, size, SEEK_CUR) < 0) { - return false; + return 0; } if (vf->read(vf, &buffer.i, 4) < 4) { - return false; + return 0; } LOAD_32(size, 0, &buffer.i); if (vf->seek(vf, size, SEEK_CUR) < 0) { - return false; + return 0; } if (vf->read(vf, &buffer.i, 4) < 4) { - return false; + return 0; } LOAD_32(size, 0, &buffer.i); if (vf->seek(vf, size, SEEK_CUR) < 0) { - return false; + return 0; } // Read payload if (vf->read(vf, &buffer.i, 4) < 4) { - return false; + return 0; } LOAD_32(size, 0, &buffer.i); + return size; +} + +void* GBASavedataSharkPortGetPayload(struct VFile* vf, size_t* osize, uint8_t* oheader, bool testChecksum) { + int32_t size = GBASavedataSharkPortPayloadSize(vf); if (size < 0x1C || size > SIZE_CART_FLASH1M + 0x1C) { - return false; + return NULL; + } + size -= 0x1C; + uint8_t header[0x1C]; + int8_t* payload = malloc(size); + + if (vf->read(vf, header, sizeof(header)) < (int) sizeof(header)) { + goto cleanup; } - char* payload = malloc(size); if (vf->read(vf, payload, size) < size) { goto cleanup; } - struct GBACartridge* cart = (struct GBACartridge*) gba->memory.rom; - memcpy(buffer.c, &cart->title, 16); - buffer.c[0x10] = 0; - buffer.c[0x11] = 0; - buffer.c[0x12] = cart->checksum; - buffer.c[0x13] = cart->maker; - buffer.c[0x14] = 1; - buffer.c[0x15] = 0; - buffer.c[0x16] = 0; - buffer.c[0x17] = 0; - buffer.c[0x18] = 0; - buffer.c[0x19] = 0; - buffer.c[0x1A] = 0; - buffer.c[0x1B] = 0; - if (memcmp(buffer.c, payload, testChecksum ? 0x1C : 0xF) != 0) { - goto cleanup; - } - + uint32_t buffer; uint32_t checksum; - if (vf->read(vf, &buffer.i, 4) < 4) { + if (vf->read(vf, &buffer, 4) < 4) { goto cleanup; } - LOAD_32(checksum, 0, &buffer.i); + LOAD_32(checksum, 0, &buffer); if (testChecksum) { uint32_t calcChecksum = 0; int i; + for (i = 0; i < (int) sizeof(header); ++i) { + calcChecksum += ((int32_t) header[i]) << (calcChecksum % 24); + } for (i = 0; i < size; ++i) { calcChecksum += ((int32_t) payload[i]) << (calcChecksum % 24); } if (calcChecksum != checksum) { - goto cleanup; + return NULL; } } + *osize = size; + if (oheader) { + memcpy(oheader, header, sizeof(header)); + } + return payload; + +cleanup: + free(payload); + return NULL; +} + + +bool GBASavedataImportSharkPort(struct GBA* gba, struct VFile* vf, bool testChecksum) { + uint8_t buffer[0x1C]; + uint8_t header[0x1C]; + + size_t size; + void* payload = GBASavedataSharkPortGetPayload(vf, &size, header, testChecksum); + if (!payload) { + return false; + } + + bool success = false; + struct GBACartridge* cart = (struct GBACartridge*) gba->memory.rom; + memcpy(buffer, &cart->title, 16); + buffer[0x10] = 0; + buffer[0x11] = 0; + buffer[0x12] = cart->checksum; + buffer[0x13] = cart->maker; + buffer[0x14] = 1; + buffer[0x15] = 0; + buffer[0x16] = 0; + buffer[0x17] = 0; + buffer[0x18] = 0; + buffer[0x19] = 0; + buffer[0x1A] = 0; + buffer[0x1B] = 0; + if (memcmp(buffer, header, testChecksum ? 0x1C : 0xF) != 0) { + goto cleanup; + } - uint32_t copySize = size - 0x1C; switch (gba->memory.savedata.type) { case SAVEDATA_FLASH512: - if (copySize > SIZE_CART_FLASH512) { + if (size > SIZE_CART_FLASH512) { GBASavedataForceType(&gba->memory.savedata, SAVEDATA_FLASH1M); } // Fall through default: - if (copySize > GBASavedataSize(&gba->memory.savedata)) { - copySize = GBASavedataSize(&gba->memory.savedata); + if (size > GBASavedataSize(&gba->memory.savedata)) { + size = GBASavedataSize(&gba->memory.savedata); } break; case SAVEDATA_FORCE_NONE: @@ -130,28 +167,27 @@ bool GBASavedataImportSharkPort(struct GBA* gba, struct VFile* vf, bool testChec goto cleanup; } - if (gba->memory.savedata.type == SAVEDATA_EEPROM) { + + if (size == SIZE_CART_EEPROM || size == SIZE_CART_EEPROM512) { size_t i; - for (i = 0; i < copySize; i += 8) { + for (i = 0; i < size; i += 8) { uint32_t lo, hi; - LOAD_32BE(lo, i + 0x1C, payload); - LOAD_32BE(hi, i + 0x20, payload); + LOAD_32BE(lo, i, payload); + LOAD_32BE(hi, i + 4, payload); STORE_32LE(hi, i, gba->memory.savedata.data); STORE_32LE(lo, i + 4, gba->memory.savedata.data); } } else { - memcpy(gba->memory.savedata.data, &payload[0x1C], copySize); + memcpy(gba->memory.savedata.data, payload, size); } if (gba->memory.savedata.vf) { gba->memory.savedata.vf->sync(gba->memory.savedata.vf, gba->memory.savedata.data, size); } - - free(payload); - return true; + success = true; cleanup: free(payload); - return false; + return success; } bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf) { diff --git a/src/platform/qt/SaveConverter.cpp b/src/platform/qt/SaveConverter.cpp index 3ccc952d6..050da9be9 100644 --- a/src/platform/qt/SaveConverter.cpp +++ b/src/platform/qt/SaveConverter.cpp @@ -15,6 +15,7 @@ #ifdef M_CORE_GBA #include #include +#include #endif #ifdef M_CORE_GB #include @@ -34,8 +35,7 @@ SaveConverter::SaveConverter(std::shared_ptr controller, QWidget connect(m_ui.inputFile, &QLineEdit::textEdited, this, &SaveConverter::refreshInputTypes); connect(m_ui.inputBrowse, &QAbstractButton::clicked, this, [this]() { - // TODO: Add gameshark saves here too - QStringList formats{"*.sav", "*.sgm", "*.ss0", "*.ss1", "*.ss2", "*.ss3", "*.ss4", "*.ss5", "*.ss6", "*.ss7", "*.ss8", "*.ss9"}; + QStringList formats{"*.sav", "*.sgm", "*.sps", "*.ss0", "*.ss1", "*.ss2", "*.ss3", "*.ss4", "*.ss5", "*.ss6", "*.ss7", "*.ss8", "*.ss9", "*.xps"}; QString filter = tr("Save games and save states (%1)").arg(formats.join(QChar(' '))); QString filename = GBAApp::app()->getOpenFileName(this, tr("Select save game or save state"), filter); if (!filename.isEmpty()) { @@ -101,6 +101,7 @@ void SaveConverter::refreshInputTypes() { detectFromSavestate(*vf); detectFromSize(vf); + detectFromHeaders(vf); for (const auto& save : m_validSaves) { m_ui.inputType->addItem(save); @@ -166,7 +167,7 @@ void SaveConverter::detectFromSavestate(VFile* vf) { } QByteArray state = getState(vf, platform); - AnnotatedSave save{platform, std::make_shared(extSavedata)}; + AnnotatedSave save{platform, std::make_shared(extSavedata), Endian::NONE, Container::SAVESTATE}; switch (platform) { #ifdef M_CORE_GBA case mPLATFORM_GBA: @@ -253,6 +254,31 @@ void SaveConverter::detectFromSize(std::shared_ptr vf) { #endif } +void SaveConverter::detectFromHeaders(std::shared_ptr vf) { + const QByteArray sharkport("\xd\0\0\0SharkPortSave", 0x11); + QByteArray buffer; + + vf->seek(0); + buffer = vf->read(sharkport.size()); + if (buffer == sharkport) { + size_t size; + void* data = GBASavedataSharkPortGetPayload(*vf, &size, nullptr, false); + if (data) { + QByteArray bytes = QByteArray::fromRawData(static_cast(data), size); + bytes.data(); // Trigger a deep copy before we delete the backing + if (size == SIZE_CART_FLASH1M) { + m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH1M, std::make_shared(bytes), Endian::NONE, Container::SHARKPORT}); + } else { + m_validSaves.append(AnnotatedSave{SAVEDATA_SRAM, std::make_shared(bytes.left(SIZE_CART_SRAM)), Endian::NONE, Container::SHARKPORT}); + m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH512, std::make_shared(bytes.left(SIZE_CART_FLASH512)), Endian::NONE, Container::SHARKPORT}); + m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM, std::make_shared(bytes.left(SIZE_CART_EEPROM)), Endian::BIG, Container::SHARKPORT}); + m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM512, std::make_shared(bytes.left(SIZE_CART_EEPROM512)), Endian::BIG, Container::SHARKPORT}); + } + free(data); + } + } +} + mPlatform SaveConverter::getStatePlatform(VFile* vf) { uint32_t magic; void* state = nullptr; @@ -326,7 +352,7 @@ QByteArray SaveConverter::getExtdata(VFile* vf, mPlatform platform, mStateExtdat } SaveConverter::AnnotatedSave::AnnotatedSave() - : savestate(false) + : container(Container::NONE) , platform(mPLATFORM_NONE) , size(0) , backing() @@ -334,8 +360,8 @@ SaveConverter::AnnotatedSave::AnnotatedSave() { } -SaveConverter::AnnotatedSave::AnnotatedSave(mPlatform platform, std::shared_ptr vf, Endian endianness) - : savestate(true) +SaveConverter::AnnotatedSave::AnnotatedSave(mPlatform platform, std::shared_ptr vf, Endian endianness, Container container) + : container(container) , platform(platform) , size(vf->size()) , backing(vf) @@ -344,8 +370,8 @@ SaveConverter::AnnotatedSave::AnnotatedSave(mPlatform platform, std::shared_ptr< } #ifdef M_CORE_GBA -SaveConverter::AnnotatedSave::AnnotatedSave(SavedataType type, std::shared_ptr vf, Endian endianness) - : savestate(false) +SaveConverter::AnnotatedSave::AnnotatedSave(SavedataType type, std::shared_ptr vf, Endian endianness, Container container) + : container(container) , platform(mPLATFORM_GBA) , size(vf->size()) , backing(vf) @@ -356,8 +382,8 @@ SaveConverter::AnnotatedSave::AnnotatedSave(SavedataType type, std::shared_ptr vf, Endian endianness) - : savestate(false) +SaveConverter::AnnotatedSave::AnnotatedSave(GBMemoryBankControllerType type, std::shared_ptr vf, Endian endianness, Container container) + : container(container) , platform(mPLATFORM_GB) , size(vf->size()) , backing(vf) @@ -468,14 +494,21 @@ SaveConverter::AnnotatedSave::operator QString() const { if (!endianStr.isEmpty()) { saveType = QCoreApplication::translate("SaveConverter", "%1 (%2)").arg(saveType).arg(endianStr); } - if (savestate) { + switch (container) { + case Container::SAVESTATE: format = QCoreApplication::translate("SaveConverter", "%1 save state with embedded %2 save game"); + break; + case Container::SHARKPORT: + format = QCoreApplication::translate("SaveConverter", "%1 SharkPort %2 save game"); + break; + case Container::NONE: + break; } return format.arg(nicePlatformFormat(platform)).arg(saveType); } bool SaveConverter::AnnotatedSave::operator==(const AnnotatedSave& other) const { - if (other.savestate != savestate || other.platform != platform || other.size != size || other.endianness != endianness) { + if (other.container != container || other.platform != platform || other.size != size || other.endianness != endianness) { return false; } switch (platform) { @@ -503,13 +536,12 @@ QList SaveConverter::AnnotatedSave::possibleConver QList possible; AnnotatedSave same = asRaw(); same.backing.reset(); - same.savestate = false; + same.container = Container::NONE; - if (savestate) { + if (container != Container::NONE) { possible.append(same); } - AnnotatedSave endianSwapped = same; switch (endianness) { case Endian::LITTLE: @@ -583,6 +615,9 @@ QByteArray SaveConverter::AnnotatedSave::convertTo(const SaveConverter::Annotate switch (gba.type) { case SAVEDATA_EEPROM: case SAVEDATA_EEPROM512: + if (endianness == target.endianness) { + break; + } converted.resize(target.size); buffer = backing->readAll(); for (int i = 0; i < size; i += 8) { diff --git a/src/platform/qt/SaveConverter.h b/src/platform/qt/SaveConverter.h index a9da27952..5a94c4804 100644 --- a/src/platform/qt/SaveConverter.h +++ b/src/platform/qt/SaveConverter.h @@ -56,14 +56,19 @@ private: GBMemoryBankControllerType type; }; #endif + enum class Container { + NONE = 0, + SAVESTATE, + SHARKPORT + }; struct AnnotatedSave { AnnotatedSave(); - AnnotatedSave(mPlatform, std::shared_ptr, Endian = Endian::NONE); + AnnotatedSave(mPlatform, std::shared_ptr, Endian = Endian::NONE, Container = Container::NONE); #ifdef M_CORE_GBA - AnnotatedSave(SavedataType, std::shared_ptr, Endian = Endian::NONE); + AnnotatedSave(SavedataType, std::shared_ptr, Endian = Endian::NONE, Container = Container::NONE); #endif #ifdef M_CORE_GB - AnnotatedSave(GBMemoryBankControllerType, std::shared_ptr, Endian = Endian::NONE); + AnnotatedSave(GBMemoryBankControllerType, std::shared_ptr, Endian = Endian::NONE, Container = Container::NONE); #endif AnnotatedSave asRaw() const; @@ -73,7 +78,7 @@ private: QList possibleConversions() const; QByteArray convertTo(const AnnotatedSave&) const; - bool savestate; + Container container; mPlatform platform; ssize_t size; std::shared_ptr backing; From c9e1b78426b9774447dc3a611b078b8670542b36 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 29 Nov 2021 14:03:21 -0800 Subject: [PATCH 16/59] mGUI: Fix crash if autosave file can't be opened (fixes #2268) --- CHANGES | 1 + src/feature/gui/gui-runner.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index c42b72859..6440ef013 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,7 @@ Other fixes: - GBA: Fix maximum tile ID in caching for 256-color modes - GBA Video: Fix cache updating with proxy and GL renderers - Libretro: Fix crash when using Game Boy codes (fixes mgba.io/i/2281) + - mGUI: Fix crash if autosave file can't be opened (fixes mgba.io/i/2268) - Qt: Fix corrupted savestate and fatal error text - Qt: Fix sprite compositing when sprite tiles go out of bounds (fixes mgba.io/i/2348) Misc: diff --git a/src/feature/gui/gui-runner.c b/src/feature/gui/gui-runner.c index 1d245819f..dc203e158 100644 --- a/src/feature/gui/gui-runner.c +++ b/src/feature/gui/gui-runner.c @@ -186,10 +186,10 @@ static void _tryAutosave(struct mGUIRunner* runner) { #ifdef DISABLE_THREADING mCoreSaveState(runner->core, 0, SAVESTATE_SAVEDATA | SAVESTATE_RTC | SAVESTATE_METADATA); #else + MutexLock(&runner->autosave.mutex); if (!runner->autosave.buffer) { runner->autosave.buffer = VFileMemChunk(NULL, 0); } - MutexLock(&runner->autosave.mutex); runner->autosave.core = runner->core; mCoreSaveStateNamed(runner->core, runner->autosave.buffer, SAVESTATE_SAVEDATA | SAVESTATE_RTC | SAVESTATE_METADATA); ConditionWake(&runner->autosave.cond); @@ -775,7 +775,13 @@ THREAD_ENTRY mGUIAutosaveThread(void* context) { while (autosave->running) { ConditionWait(&autosave->cond, &autosave->mutex); if (autosave->running && autosave->core) { + if (!autosave->buffer) { + continue; + } struct VFile* vf = mCoreGetState(autosave->core, 0, true); + if (!vf) { + continue; + } void* mem = autosave->buffer->map(autosave->buffer, autosave->buffer->size(autosave->buffer), MAP_READ); vf->write(vf, mem, autosave->buffer->size(autosave->buffer)); autosave->buffer->unmap(autosave->buffer, mem, autosave->buffer->size(autosave->buffer)); From 603de394d8bb58dac250cc90f5aa1db74b42155d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 29 Nov 2021 23:11:17 -0800 Subject: [PATCH 17/59] mGUI: Refactor menu code into separate functions --- include/mgba-util/gui/menu.h | 24 +++ src/util/gui/menu.c | 369 +++++++++++++++++++++-------------- 2 files changed, 242 insertions(+), 151 deletions(-) diff --git a/include/mgba-util/gui/menu.h b/include/mgba-util/gui/menu.h index 8ac9d6846..55cbad5d3 100644 --- a/include/mgba-util/gui/menu.h +++ b/include/mgba-util/gui/menu.h @@ -10,6 +10,7 @@ CXX_GUARD_START +#include #include #define GUI_V_V (struct GUIVariant) { .type = GUI_VARIANT_VOID } @@ -73,10 +74,29 @@ struct GUIMenu { struct GUIBackground* background; }; +struct GUIMenuSavedState { + struct GUIMenu* menu; + size_t start; +}; + +DECLARE_VECTOR(GUIMenuSavedList, struct GUIMenuSavedState); + +struct GUIMenuState { + size_t start; + int cursorOverItem; + enum GUICursorState cursor; + unsigned cx, cy; + struct GUIMenuSavedList stack; + + struct GUIMenuItem* resultItem; +}; + enum GUIMenuExitReason { + GUI_MENU_CONTINUE = 0, GUI_MENU_EXIT_ACCEPT, GUI_MENU_EXIT_BACK, GUI_MENU_EXIT_CANCEL, + GUI_MENU_ENTER, }; enum GUIMessageBoxButtons { @@ -85,7 +105,11 @@ enum GUIMessageBoxButtons { }; struct GUIParams; +void GUIMenuStateInit(struct GUIMenuState*); +void GUIMenuStateDeinit(struct GUIMenuState*); + enum GUIMenuExitReason GUIShowMenu(struct GUIParams* params, struct GUIMenu* menu, struct GUIMenuItem** item); +enum GUIMenuExitReason GUIMenuRun(struct GUIParams* params, struct GUIMenu* menu, struct GUIMenuState* state); ATTRIBUTE_FORMAT(printf, 4, 5) enum GUIMenuExitReason GUIShowMessageBox(struct GUIParams* params, int buttons, int frames, const char* format, ...); diff --git a/src/util/gui/menu.c b/src/util/gui/menu.c index 13fcbd9c9..9e9227540 100644 --- a/src/util/gui/menu.c +++ b/src/util/gui/menu.c @@ -15,6 +15,7 @@ #endif DEFINE_VECTOR(GUIMenuItemList, struct GUIMenuItem); +DEFINE_VECTOR(GUIMenuSavedList, struct GUIMenuSavedState); void _itemNext(struct GUIMenuItem* item, bool wrap) { if (item->state < item->nStates - 1) { @@ -44,17 +45,21 @@ void _itemPrev(struct GUIMenuItem* item, bool wrap) { } } -enum GUIMenuExitReason GUIShowMenu(struct GUIParams* params, struct GUIMenu* menu, struct GUIMenuItem** item) { - size_t start = 0; - size_t lineHeight = GUIFontHeight(params->font); - size_t pageSize = params->height / lineHeight; - if (pageSize > 4) { - pageSize -= 4; - } else { - pageSize = 1; - } - int cursorOverItem = 0; +void GUIMenuStateInit(struct GUIMenuState* state) { + state->start = 0; + state->cursorOverItem = 0; + state->cursor = GUI_CURSOR_NOT_PRESENT; + state->resultItem = NULL; + GUIMenuSavedListInit(&state->stack, 0); +} +void GUIMenuStateDeinit(struct GUIMenuState* state) { + GUIMenuSavedListDeinit(&state->stack); +} + +enum GUIMenuExitReason GUIShowMenu(struct GUIParams* params, struct GUIMenu* menu, struct GUIMenuItem** item) { + struct GUIMenuState state; + GUIMenuStateInit(&state); GUIInvalidateKeys(params); while (true) { #ifdef _3DS @@ -66,151 +71,213 @@ enum GUIMenuExitReason GUIShowMenu(struct GUIParams* params, struct GUIMenu* men return GUI_MENU_EXIT_CANCEL; } #endif - uint32_t newInput = 0; - GUIPollInput(params, &newInput, 0); - unsigned cx, cy; - enum GUICursorState cursor = GUIPollCursor(params, &cx, &cy); - - if (newInput & (1 << GUI_INPUT_UP) && menu->index > 0) { - --menu->index; - } - if (newInput & (1 << GUI_INPUT_DOWN) && menu->index < GUIMenuItemListSize(&menu->items) - 1) { - ++menu->index; - } - if (newInput & (1 << GUI_INPUT_LEFT)) { - struct GUIMenuItem* item = GUIMenuItemListGetPointer(&menu->items, menu->index); - if (item->validStates) { - _itemPrev(item, false); - } else if (menu->index >= pageSize) { - menu->index -= pageSize; - } else { - menu->index = 0; - } - } - if (newInput & (1 << GUI_INPUT_RIGHT)) { - struct GUIMenuItem* item = GUIMenuItemListGetPointer(&menu->items, menu->index); - if (item->validStates) { - _itemNext(item, false); - } else if (menu->index + pageSize < GUIMenuItemListSize(&menu->items)) { - menu->index += pageSize; - } else { - menu->index = GUIMenuItemListSize(&menu->items) - 1; - } - } - if (cursor != GUI_CURSOR_NOT_PRESENT) { - if (cx < params->width - 16) { - int index = (cy / lineHeight) - 2; - if (index >= 0 && index + start < GUIMenuItemListSize(&menu->items)) { - if (menu->index != index + start || !cursorOverItem) { - cursorOverItem = 1; - } - menu->index = index + start; - } else { - cursorOverItem = 0; - } - } else if (cursor == GUI_CURSOR_DOWN || cursor == GUI_CURSOR_DRAGGING) { - if (cy <= 2 * lineHeight && cy > lineHeight && menu->index > 0) { - --menu->index; - } else if (cy <= params->height && cy > params->height - lineHeight && menu->index < GUIMenuItemListSize(&menu->items) - 1) { - ++menu->index; - } else if (cy <= params->height - lineHeight && cy > 2 * lineHeight) { - size_t location = cy - 2 * lineHeight; - location *= GUIMenuItemListSize(&menu->items) - 1; - menu->index = location / (params->height - 3 * lineHeight); - } - } - } - - if (menu->index < start) { - start = menu->index; - } - while ((menu->index - start + 4) * lineHeight > params->height) { - ++start; - } - if (newInput & (1 << GUI_INPUT_CANCEL)) { - break; - } - if (newInput & (1 << GUI_INPUT_SELECT) || (cursorOverItem == 2 && cursor == GUI_CURSOR_CLICKED)) { - *item = GUIMenuItemListGetPointer(&menu->items, menu->index); - if ((*item)->submenu) { - enum GUIMenuExitReason reason = GUIShowMenu(params, (*item)->submenu, item); - if (reason != GUI_MENU_EXIT_BACK) { - return reason; - } - } else if ((*item)->validStates && GUIVariantIsString((*item)->data)) { - _itemNext(*item, true); - } else { - return GUI_MENU_EXIT_ACCEPT; - } - } - if (cursorOverItem == 1 && (cursor == GUI_CURSOR_UP || cursor == GUI_CURSOR_NOT_PRESENT)) { - cursorOverItem = 2; - } - if (newInput & (1 << GUI_INPUT_BACK)) { - return GUI_MENU_EXIT_BACK; - } - - params->drawStart(); - if (menu->background) { - menu->background->draw(menu->background, GUIMenuItemListGetPointer(&menu->items, menu->index)->data.v.p); - } - if (params->guiPrepare) { - params->guiPrepare(); - } - unsigned y = lineHeight; - GUIFontPrint(params->font, 0, y, GUI_ALIGN_LEFT, 0xFFFFFFFF, menu->title); - if (menu->subtitle) { - GUIFontPrint(params->font, 0, y * 2, GUI_ALIGN_LEFT, 0xFFFFFFFF, menu->subtitle); - } - y += 2 * lineHeight; - unsigned right; - GUIFontIconMetrics(params->font, GUI_ICON_SCROLLBAR_BUTTON, &right, 0); - size_t itemsPerScreen = (params->height - y) / lineHeight; - size_t i; - for (i = start; i < GUIMenuItemListSize(&menu->items); ++i) { - int color = 0xE0A0A0A0; - if (i == menu->index) { - color = 0xFFFFFFFF; - GUIFontDrawIcon(params->font, lineHeight * 0.8f, y, GUI_ALIGN_BOTTOM | GUI_ALIGN_RIGHT, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_POINTER); - } - struct GUIMenuItem* item = GUIMenuItemListGetPointer(&menu->items, i); - GUIFontPrint(params->font, lineHeight, y, GUI_ALIGN_LEFT, color, item->title); - if (item->validStates && item->validStates[item->state]) { - GUIFontPrintf(params->font, params->width - right - 8, y, GUI_ALIGN_RIGHT, color, "%s ", item->validStates[item->state]); - } - y += lineHeight; - if (y + lineHeight > params->height) { + enum GUIMenuExitReason reason = GUIMenuRun(params, menu, &state); + switch (reason) { + case GUI_MENU_EXIT_BACK: + if (GUIMenuSavedListSize(&state.stack) > 0) { + struct GUIMenuSavedState* last = GUIMenuSavedListGetPointer(&state.stack, GUIMenuSavedListSize(&state.stack) - 1); + state.start = last->start; + menu = last->menu; + GUIMenuSavedListResize(&state.stack, -1); break; } + // Fall through + case GUI_MENU_EXIT_CANCEL: + case GUI_MENU_EXIT_ACCEPT: + *item = state.resultItem; + GUIMenuStateDeinit(&state); + return reason; + case GUI_MENU_ENTER: + *GUIMenuSavedListAppend(&state.stack) = (struct GUIMenuSavedState) { + .start = state.start, + .menu = menu + }; + menu = state.resultItem->submenu; + state.start = 0; + break; + case GUI_MENU_CONTINUE: + break; } - - if (itemsPerScreen < GUIMenuItemListSize(&menu->items)) { - size_t top = 2 * lineHeight; - size_t bottom = params->height - 8; - unsigned w; - GUIFontIconMetrics(params->font, GUI_ICON_SCROLLBAR_TRACK, &w, 0); - right = (right - w) / 2; - GUIFontDrawIconSize(params->font, params->width - right - 8, top, 0, bottom - top, 0xA0FFFFFF, GUI_ICON_SCROLLBAR_TRACK); - GUIFontDrawIcon(params->font, params->width - 8, top, GUI_ALIGN_HCENTER | GUI_ALIGN_BOTTOM, GUI_ORIENT_VMIRROR, 0xFFFFFFFF, GUI_ICON_SCROLLBAR_BUTTON); - GUIFontDrawIcon(params->font, params->width - 8, bottom, GUI_ALIGN_HCENTER | GUI_ALIGN_TOP, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_SCROLLBAR_BUTTON); - - y = menu->index * (bottom - top - 16) / GUIMenuItemListSize(&menu->items); - GUIFontDrawIcon(params->font, params->width - 8, top + y, GUI_ALIGN_HCENTER | GUI_ALIGN_TOP, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_SCROLLBAR_THUMB); - } - - GUIDrawBattery(params); - GUIDrawClock(params); - - if (cursor != GUI_CURSOR_NOT_PRESENT) { - GUIFontDrawIcon(params->font, cx, cy, GUI_ALIGN_HCENTER | GUI_ALIGN_TOP, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_CURSOR); - } - - if (params->guiFinish) { - params->guiFinish(); - } - params->drawEnd(); } - return GUI_MENU_EXIT_CANCEL; +} + +static enum GUIMenuExitReason GUIMenuPollInput(struct GUIParams* params, struct GUIMenu* menu, struct GUIMenuState* state) { + size_t lineHeight = GUIFontHeight(params->font); + size_t pageSize = params->height / lineHeight; + if (pageSize > 4) { + pageSize -= 4; + } else { + pageSize = 1; + } + uint32_t newInput = 0; + GUIPollInput(params, &newInput, NULL); + state->cursor = GUIPollCursor(params, &state->cx, &state->cy); + + // Check for new direction presses + if (newInput & (1 << GUI_INPUT_UP) && menu->index > 0) { + --menu->index; + } + if (newInput & (1 << GUI_INPUT_DOWN) && menu->index < GUIMenuItemListSize(&menu->items) - 1) { + ++menu->index; + } + if (newInput & (1 << GUI_INPUT_LEFT)) { + struct GUIMenuItem* item = GUIMenuItemListGetPointer(&menu->items, menu->index); + if (item->validStates) { + _itemPrev(item, false); + } else if (menu->index >= pageSize) { + menu->index -= pageSize; + } else { + menu->index = 0; + } + } + if (newInput & (1 << GUI_INPUT_RIGHT)) { + struct GUIMenuItem* item = GUIMenuItemListGetPointer(&menu->items, menu->index); + if (item->validStates) { + _itemNext(item, false); + } else if (menu->index + pageSize < GUIMenuItemListSize(&menu->items)) { + menu->index += pageSize; + } else { + menu->index = GUIMenuItemListSize(&menu->items) - 1; + } + } + + // Handle cursor movement + if (state->cursor != GUI_CURSOR_NOT_PRESENT) { + unsigned cx = state->cx; + unsigned cy = state->cy; + if (cx < params->width - 16) { + int index = (cy / lineHeight) - 2; + if (index >= 0 && index + state->start < GUIMenuItemListSize(&menu->items)) { + if (menu->index != index + state->start || !state->cursorOverItem) { + state->cursorOverItem = 1; + } + menu->index = index + state->start; + } else { + state->cursorOverItem = 0; + } + } else if (state->cursor == GUI_CURSOR_DOWN || state->cursor == GUI_CURSOR_DRAGGING) { + if (cy <= 2 * lineHeight && cy > lineHeight && menu->index > 0) { + --menu->index; + } else if (cy <= params->height && cy > params->height - lineHeight && menu->index < GUIMenuItemListSize(&menu->items) - 1) { + ++menu->index; + } else if (cy <= params->height - lineHeight && cy > 2 * lineHeight) { + size_t location = cy - 2 * lineHeight; + location *= GUIMenuItemListSize(&menu->items) - 1; + menu->index = location / (params->height - 3 * lineHeight); + } + } + } + + // Move view up if the active item is before the top of the view + if (menu->index < state->start) { + state->start = menu->index; + } + // Move the view down if the active item is after the bottom of the view + while ((menu->index - state->start + 4) * lineHeight > params->height) { + // TODO: Should this loop be replaced with division? + ++state->start; + } + + // Handle action inputs + if (newInput & (1 << GUI_INPUT_CANCEL)) { + return GUI_MENU_EXIT_CANCEL; + } + if (newInput & (1 << GUI_INPUT_SELECT) || (state->cursorOverItem == 2 && state->cursor == GUI_CURSOR_CLICKED)) { + struct GUIMenuItem* item = GUIMenuItemListGetPointer(&menu->items, menu->index); + if (item->submenu) { + // Selected menus get shown inline + state->resultItem = item; + return GUI_MENU_ENTER; + } else if (item->validStates && GUIVariantIsString(item->data)) { + // Selected items with multiple (named) states get scrolled through + _itemNext(item, true); + } else { + // Otherwise tell caller item was accepted + state->resultItem = item; + return GUI_MENU_EXIT_ACCEPT; + } + } + if (state->cursorOverItem == 1 && (state->cursor == GUI_CURSOR_UP || state->cursor == GUI_CURSOR_NOT_PRESENT)) { + state->cursorOverItem = 2; + } + if (newInput & (1 << GUI_INPUT_BACK)) { + return GUI_MENU_EXIT_BACK; + } + + // No action taken + return GUI_MENU_CONTINUE; +} + +static void GUIMenuDraw(struct GUIParams* params, const struct GUIMenu* menu, const struct GUIMenuState* state) { + size_t lineHeight = GUIFontHeight(params->font); + params->drawStart(); + if (menu->background) { + menu->background->draw(menu->background, GUIMenuItemListGetConstPointer(&menu->items, menu->index)->data.v.p); + } + if (params->guiPrepare) { + params->guiPrepare(); + } + unsigned y = lineHeight; + GUIFontPrint(params->font, 0, y, GUI_ALIGN_LEFT, 0xFFFFFFFF, menu->title); + if (menu->subtitle) { + GUIFontPrint(params->font, 0, y * 2, GUI_ALIGN_LEFT, 0xFFFFFFFF, menu->subtitle); + } + y += 2 * lineHeight; + unsigned right; + GUIFontIconMetrics(params->font, GUI_ICON_SCROLLBAR_BUTTON, &right, 0); + size_t itemsPerScreen = (params->height - y) / lineHeight; + size_t i; + for (i = state->start; i < GUIMenuItemListSize(&menu->items); ++i) { + int color = 0xE0A0A0A0; + if (i == menu->index) { + color = 0xFFFFFFFF; + GUIFontDrawIcon(params->font, lineHeight * 0.8f, y, GUI_ALIGN_BOTTOM | GUI_ALIGN_RIGHT, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_POINTER); + } + const struct GUIMenuItem* item = GUIMenuItemListGetConstPointer(&menu->items, i); + GUIFontPrint(params->font, lineHeight, y, GUI_ALIGN_LEFT, color, item->title); + if (item->validStates && item->validStates[item->state]) { + GUIFontPrintf(params->font, params->width - right - 8, y, GUI_ALIGN_RIGHT, color, "%s ", item->validStates[item->state]); + } + y += lineHeight; + if (y + lineHeight > params->height) { + break; + } + } + + if (itemsPerScreen < GUIMenuItemListSize(&menu->items)) { + size_t top = 2 * lineHeight; + size_t bottom = params->height - 8; + unsigned w; + GUIFontIconMetrics(params->font, GUI_ICON_SCROLLBAR_TRACK, &w, 0); + right = (right - w) / 2; + GUIFontDrawIconSize(params->font, params->width - right - 8, top, 0, bottom - top, 0xA0FFFFFF, GUI_ICON_SCROLLBAR_TRACK); + GUIFontDrawIcon(params->font, params->width - 8, top, GUI_ALIGN_HCENTER | GUI_ALIGN_BOTTOM, GUI_ORIENT_VMIRROR, 0xFFFFFFFF, GUI_ICON_SCROLLBAR_BUTTON); + GUIFontDrawIcon(params->font, params->width - 8, bottom, GUI_ALIGN_HCENTER | GUI_ALIGN_TOP, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_SCROLLBAR_BUTTON); + + y = menu->index * (bottom - top - 16) / GUIMenuItemListSize(&menu->items); + GUIFontDrawIcon(params->font, params->width - 8, top + y, GUI_ALIGN_HCENTER | GUI_ALIGN_TOP, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_SCROLLBAR_THUMB); + } + + GUIDrawBattery(params); + GUIDrawClock(params); + + if (state->cursor != GUI_CURSOR_NOT_PRESENT) { + GUIFontDrawIcon(params->font, state->cx, state->cy, GUI_ALIGN_HCENTER | GUI_ALIGN_TOP, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_CURSOR); + } + + if (params->guiFinish) { + params->guiFinish(); + } + params->drawEnd(); +} + +enum GUIMenuExitReason GUIMenuRun(struct GUIParams* params, struct GUIMenu* menu, struct GUIMenuState* state) { + enum GUIMenuExitReason reason = GUIMenuPollInput(params, menu, state); + if (reason != GUI_MENU_CONTINUE) { + return reason; + } + GUIMenuDraw(params, menu, state); + return GUI_MENU_CONTINUE; } enum GUIMenuExitReason GUIShowMessageBox(struct GUIParams* params, int buttons, int frames, const char* format, ...) { From 58ddecb8308e4190f5b284be6208ee535f7ee76d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 2 Dec 2021 17:55:02 -0800 Subject: [PATCH 18/59] Core: Add mCoreConfigGetBoolValue --- include/mgba/core/config.h | 1 + src/core/config.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/mgba/core/config.h b/include/mgba/core/config.h index 063b14e02..80184876b 100644 --- a/include/mgba/core/config.h +++ b/include/mgba/core/config.h @@ -78,6 +78,7 @@ bool mCoreConfigIsPortable(void); #endif const char* mCoreConfigGetValue(const struct mCoreConfig*, const char* key); +bool mCoreConfigGetBoolValue(const struct mCoreConfig*, const char* key, bool* value); bool mCoreConfigGetIntValue(const struct mCoreConfig*, const char* key, int* value); bool mCoreConfigGetUIntValue(const struct mCoreConfig*, const char* key, unsigned* value); bool mCoreConfigGetFloatValue(const struct mCoreConfig*, const char* key, float* value); diff --git a/src/core/config.c b/src/core/config.c index 9f54aca26..e12b58fe1 100644 --- a/src/core/config.c +++ b/src/core/config.c @@ -89,6 +89,20 @@ static bool _lookupCharValue(const struct mCoreConfig* config, const char* key, return true; } +static bool _lookupBoolValue(const struct mCoreConfig* config, const char* key, bool* out) { + const char* charValue = _lookupValue(config, key); + if (!charValue) { + return false; + } + char* end; + long value = strtol(charValue, &end, 10); + if (*end) { + return false; + } + *out = value; + return true; +} + static bool _lookupIntValue(const struct mCoreConfig* config, const char* key, int* out) { const char* charValue = _lookupValue(config, key); if (!charValue) { @@ -314,6 +328,10 @@ const char* mCoreConfigGetValue(const struct mCoreConfig* config, const char* ke return _lookupValue(config, key); } +bool mCoreConfigGetBoolValue(const struct mCoreConfig* config, const char* key, bool* value) { + return _lookupBoolValue(config, key, value); +} + bool mCoreConfigGetIntValue(const struct mCoreConfig* config, const char* key, int* value) { return _lookupIntValue(config, key, value); } From c39f2ccb788eaaad67976199aeb43213eb665964 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 2 Dec 2021 18:07:49 -0800 Subject: [PATCH 19/59] All: Use mCoreConfigGetBoolValue --- src/core/config.c | 48 +++++++++--------------------- src/gb/core.c | 23 +++++--------- src/gba/core.c | 34 ++++++++------------- src/platform/qt/CoreController.cpp | 8 ++--- 4 files changed, 36 insertions(+), 77 deletions(-) diff --git a/src/core/config.c b/src/core/config.c index e12b58fe1..5d23f0d8d 100644 --- a/src/core/config.c +++ b/src/core/config.c @@ -414,40 +414,20 @@ void mCoreConfigMap(const struct mCoreConfig* config, struct mCoreOptions* opts) } _lookupUIntValue(config, "sampleRate", &opts->sampleRate); - int fakeBool; - if (_lookupIntValue(config, "useBios", &fakeBool)) { - opts->useBios = fakeBool; - } - if (_lookupIntValue(config, "audioSync", &fakeBool)) { - opts->audioSync = fakeBool; - } - if (_lookupIntValue(config, "videoSync", &fakeBool)) { - opts->videoSync = fakeBool; - } - if (_lookupIntValue(config, "lockAspectRatio", &fakeBool)) { - opts->lockAspectRatio = fakeBool; - } - if (_lookupIntValue(config, "lockIntegerScaling", &fakeBool)) { - opts->lockIntegerScaling = fakeBool; - } - if (_lookupIntValue(config, "interframeBlending", &fakeBool)) { - opts->interframeBlending = fakeBool; - } - if (_lookupIntValue(config, "resampleVideo", &fakeBool)) { - opts->resampleVideo = fakeBool; - } - if (_lookupIntValue(config, "suspendScreensaver", &fakeBool)) { - opts->suspendScreensaver = fakeBool; - } - if (_lookupIntValue(config, "mute", &fakeBool)) { - opts->mute = fakeBool; - } - if (_lookupIntValue(config, "skipBios", &fakeBool)) { - opts->skipBios = fakeBool; - } - if (_lookupIntValue(config, "rewindEnable", &fakeBool)) { - opts->rewindEnable = fakeBool; - } + _lookupBoolValue(config, "audioSync", &opts->audioSync); + _lookupBoolValue(config, "videoSync", &opts->videoSync); + + _lookupBoolValue(config, "lockAspectRatio", &opts->lockAspectRatio); + _lookupBoolValue(config, "lockIntegerScaling", &opts->lockIntegerScaling); + _lookupBoolValue(config, "interframeBlending", &opts->interframeBlending); + _lookupBoolValue(config, "resampleVideo", &opts->resampleVideo); + + _lookupBoolValue(config, "useBios", &opts->useBios); + _lookupBoolValue(config, "skipBios", &opts->skipBios); + + _lookupBoolValue(config, "suspendScreensaver", &opts->suspendScreensaver); + _lookupBoolValue(config, "mute", &opts->mute); + _lookupBoolValue(config, "rewindEnable", &opts->rewindEnable); _lookupIntValue(config, "fullscreen", &opts->fullscreen); _lookupIntValue(config, "width", &opts->width); diff --git a/src/gb/core.c b/src/gb/core.c index 51599eb82..809419813 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -228,13 +228,10 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf mCoreConfigCopyValue(&core->config, config, "useCgbColors"); mCoreConfigCopyValue(&core->config, config, "allowOpposingDirections"); - int fakeBool = 0; - mCoreConfigGetIntValue(config, "allowOpposingDirections", &fakeBool); - gb->allowOpposingDirections = fakeBool; + mCoreConfigGetBoolValue(config, "allowOpposingDirections", &gb->allowOpposingDirections); - if (mCoreConfigGetIntValue(config, "sgb.borders", &fakeBool)) { - gb->video.sgbBorders = fakeBool; - gb->video.renderer->enableSGBBorder(gb->video.renderer, fakeBool); + if (mCoreConfigGetBoolValue(config, "sgb.borders", &gb->video.sgbBorders)) { + gb->video.renderer->enableSGBBorder(gb->video.renderer, gb->video.sgbBorders); } #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 @@ -260,11 +257,8 @@ static void _GBCoreReloadConfigOption(struct mCore* core, const char* option, co return; } - int fakeBool; if (strcmp("mute", option) == 0) { - if (mCoreConfigGetIntValue(config, "mute", &fakeBool)) { - core->opts.mute = fakeBool; - + if (mCoreConfigGetBoolValue(config, "mute", &core->opts.mute)) { if (core->opts.mute) { gb->audio.masterVolume = 0; } else { @@ -289,15 +283,12 @@ static void _GBCoreReloadConfigOption(struct mCore* core, const char* option, co if (config != &core->config) { mCoreConfigCopyValue(&core->config, config, "allowOpposingDirections"); } - if (mCoreConfigGetIntValue(config, "allowOpposingDirections", &fakeBool)) { - gb->allowOpposingDirections = fakeBool; - } + mCoreConfigGetBoolValue(config, "allowOpposingDirections", &gb->allowOpposingDirections); return; } if (strcmp("sgb.borders", option) == 0) { - if (mCoreConfigGetIntValue(config, "sgb.borders", &fakeBool)) { - gb->video.sgbBorders = fakeBool; - gb->video.renderer->enableSGBBorder(gb->video.renderer, fakeBool); + if (mCoreConfigGetBoolValue(config, "sgb.borders", &gb->video.sgbBorders)) { + gb->video.renderer->enableSGBBorder(gb->video.renderer, gb->video.sgbBorders); } } diff --git a/src/gba/core.c b/src/gba/core.c index 112e34618..f186d130a 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -288,9 +288,7 @@ static void _GBACoreLoadConfig(struct mCore* core, const struct mCoreConfig* con } } - int fakeBool = 0; - mCoreConfigGetIntValue(config, "allowOpposingDirections", &fakeBool); - gba->allowOpposingDirections = fakeBool; + mCoreConfigGetBoolValue(config, "allowOpposingDirections", &gba->allowOpposingDirections); mCoreConfigCopyValue(&core->config, config, "allowOpposingDirections"); mCoreConfigCopyValue(&core->config, config, "gba.bios"); @@ -322,11 +320,8 @@ static void _GBACoreReloadConfigOption(struct mCore* core, const char* option, c return; } - int fakeBool; if (strcmp("mute", option) == 0) { - if (mCoreConfigGetIntValue(config, "mute", &fakeBool)) { - core->opts.mute = fakeBool; - + if (mCoreConfigGetBoolValue(config, "mute", &core->opts.mute)) { if (core->opts.mute) { gba->audio.masterVolume = 0; } else { @@ -351,9 +346,7 @@ static void _GBACoreReloadConfigOption(struct mCore* core, const char* option, c if (config != &core->config) { mCoreConfigCopyValue(&core->config, config, "allowOpposingDirections"); } - if (mCoreConfigGetIntValue(config, "allowOpposingDirections", &fakeBool)) { - gba->allowOpposingDirections = fakeBool; - } + mCoreConfigGetBoolValue(config, "allowOpposingDirections", &gba->allowOpposingDirections); return; } @@ -363,7 +356,8 @@ static void _GBACoreReloadConfigOption(struct mCore* core, const char* option, c if (config != &core->config) { mCoreConfigCopyValue(&core->config, config, "videoScale"); } - if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) { + bool value; + if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetBoolValue(&core->config, "hwaccelVideo", &value) && value) { int scale; mCoreConfigGetIntValue(config, "videoScale", &scale); GBAVideoGLRendererSetScale(&gbacore->glRenderer, scale); @@ -377,7 +371,8 @@ static void _GBACoreReloadConfigOption(struct mCore* core, const char* option, c renderer = &gbacore->renderer.d; } #ifdef BUILD_GLES3 - if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) { + bool value; + if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetBoolValue(&core->config, "hwaccelVideo", &value) && value) { mCoreConfigGetIntValue(&core->config, "videoScale", &gbacore->glRenderer.scale); renderer = &gbacore->glRenderer.d; } else { @@ -556,7 +551,8 @@ static void _GBACoreChecksum(const struct mCore* core, void* data, enum mCoreChe static void _GBACoreReset(struct mCore* core) { struct GBACore* gbacore = (struct GBACore*) core; struct GBA* gba = (struct GBA*) core->board; - int fakeBool; + bool value; + UNUSED(value); if (gbacore->renderer.outputBuffer #ifdef BUILD_GLES3 || gbacore->glRenderer.outputTex != (unsigned) -1 @@ -567,7 +563,7 @@ static void _GBACoreReset(struct mCore* core) { renderer = &gbacore->renderer.d; } #ifdef BUILD_GLES3 - if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) { + if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetBoolValue(&core->config, "hwaccelVideo", &value) && value) { mCoreConfigGetIntValue(&core->config, "videoScale", &gbacore->glRenderer.scale); renderer = &gbacore->glRenderer.d; } else { @@ -575,7 +571,7 @@ static void _GBACoreReset(struct mCore* core) { } #endif #ifndef DISABLE_THREADING - if (mCoreConfigGetIntValue(&core->config, "threadedVideo", &fakeBool) && fakeBool) { + if (mCoreConfigGetBoolValue(&core->config, "threadedVideo", &value) && value) { if (!core->videoLogger) { core->videoLogger = &gbacore->threadProxy.d; } @@ -604,13 +600,9 @@ static void _GBACoreReset(struct mCore* core) { #endif bool forceGbp = false; - if (mCoreConfigGetIntValue(&core->config, "gba.forceGbp", &fakeBool)) { - forceGbp = fakeBool; - } bool vbaBugCompat = true; - if (mCoreConfigGetIntValue(&core->config, "vbaBugCompat", &fakeBool)) { - vbaBugCompat = fakeBool; - } + mCoreConfigGetBoolValue(&core->config, "gba.forceGbp", &forceGbp); + mCoreConfigGetBoolValue(&core->config, "vbaBugCompat", &vbaBugCompat); if (!forceGbp) { gba->memory.hw.devices &= ~HW_GB_PLAYER_DETECTION; } diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 408e1078a..fd99cf4ee 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -538,9 +538,7 @@ void CoreController::overrideMute(bool override) { if (m_fastForward || m_fastForwardForced) { core->opts.mute = m_fastForwardMute >= 0; } else { - int fakeBool = 0; - mCoreConfigGetIntValue(&core->config, "mute", &fakeBool); - core->opts.mute = fakeBool; + mCoreConfigGetBoolValue(&core->config, "mute", &core->opts.mute); } } core->reloadConfigOption(core, NULL, NULL); @@ -1122,9 +1120,7 @@ void CoreController::updateFastForward() { if (!mCoreConfigGetIntValue(&m_threadContext.core->config, "volume", &m_threadContext.core->opts.volume)) { m_threadContext.core->opts.volume = 0x100; } - int fakeBool = 0; - mCoreConfigGetIntValue(&m_threadContext.core->config, "mute", &fakeBool); - m_threadContext.core->opts.mute = fakeBool; + mCoreConfigGetBoolValue(&m_threadContext.core->config, "mute", &m_threadContext.core->opts.mute); m_threadContext.impl->sync.fpsTarget = m_fpsTarget; setSync(true); } From 10458aea67156b19b18923bd18b12d482f633cae Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 5 Dec 2021 14:32:18 -0800 Subject: [PATCH 20/59] GB Video: Fix writing to SGBC transparent BG colors (fixes #2367) --- src/gb/renderers/software.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index b8c997255..f6489388b 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -472,12 +472,14 @@ static void GBVideoSoftwareRendererWritePalette(struct GBVideoRenderer* renderer struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; color_t color = mColorFrom555(value); if (softwareRenderer->model & GB_MODEL_SGB) { - if (index < 0x10 && index && !(index & 3)) { + if (index >= PAL_SGB_BORDER && !(index & 0xF)) { color = softwareRenderer->palette[0]; - } else if (index >= PAL_SGB_BORDER && !(index & 0xF)) { - color = softwareRenderer->palette[0]; - } else if (index > PAL_HIGHLIGHT && index < PAL_HIGHLIGHT_OBJ && !(index & 3)) { - color = softwareRenderer->palette[PAL_HIGHLIGHT_BG]; + } else if (!(softwareRenderer->model & GB_MODEL_CGB)) { + if (index < 0x10 && index && !(index & 3)) { + color = softwareRenderer->palette[0]; + } else if (index > PAL_HIGHLIGHT && index < PAL_HIGHLIGHT_OBJ && !(index & 3)) { + color = softwareRenderer->palette[PAL_HIGHLIGHT_BG]; + } } } if (renderer->cache) { @@ -511,13 +513,15 @@ static void GBVideoSoftwareRendererWritePalette(struct GBVideoRenderer* renderer } if (softwareRenderer->model & GB_MODEL_SGB && !index && GBRegisterLCDCIsEnable(softwareRenderer->lcdc)) { - renderer->writePalette(renderer, 0x04, value); - renderer->writePalette(renderer, 0x08, value); - renderer->writePalette(renderer, 0x0C, value); - renderer->writePalette(renderer, 0x40, value); - renderer->writePalette(renderer, 0x50, value); - renderer->writePalette(renderer, 0x60, value); - renderer->writePalette(renderer, 0x70, value); + if (!(softwareRenderer->model & GB_MODEL_CGB)) { + renderer->writePalette(renderer, 0x04, value); + renderer->writePalette(renderer, 0x08, value); + renderer->writePalette(renderer, 0x0C, value); + renderer->writePalette(renderer, 0x40, value); + renderer->writePalette(renderer, 0x50, value); + renderer->writePalette(renderer, 0x60, value); + renderer->writePalette(renderer, 0x70, value); + } if (softwareRenderer->sgbBorders && !renderer->sgbRenderMode) { _regenerateSGBBorder(softwareRenderer); } From e224b455761b32263deeb36821f8091fadc63399 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 6 Dec 2021 03:27:35 -0800 Subject: [PATCH 21/59] GBA: Correct key IRQ edge behavior --- src/gba/core.c | 1 + src/gba/gba.c | 25 ++++++++++++------------- src/gba/io.c | 3 +++ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/gba/core.c b/src/gba/core.c index f186d130a..1d0292f4a 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -709,6 +709,7 @@ static void _GBACoreAddKeys(struct mCore* core, uint32_t keys) { static void _GBACoreClearKeys(struct mCore* core, uint32_t keys) { struct GBA* gba = core->board; gba->keysActive &= ~keys; + GBATestKeypadIRQ(gba); } static int32_t _GBACoreFrameCounter(const struct mCore* core) { diff --git a/src/gba/gba.c b/src/gba/gba.c index 6df5086a1..16d02fd2c 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -91,7 +91,7 @@ static void GBAInit(void* cpu, struct mCPUComponent* component) { GBAHardwareInit(&gba->memory.hw, NULL); gba->keysActive = 0; - gba->keysLast = 0; + gba->keysLast = 0x400; gba->rotationSource = 0; gba->luminanceSource = 0; gba->rtcSource = 0; @@ -878,27 +878,26 @@ void GBAFrameEnded(struct GBA* gba) { } void GBATestKeypadIRQ(struct GBA* gba) { - if (gba->keysActive == gba->keysLast) { - return; - } + uint16_t keysLast = gba->keysLast; + uint16_t keysActive = gba->keysActive; + uint16_t keycnt = gba->memory.io[REG_KEYCNT >> 1]; if (!(keycnt & 0x4000)) { return; } + gba->keysLast = keysActive; int isAnd = keycnt & 0x8000; keycnt &= 0x3FF; - uint16_t keyInput = gba->keysActive & keycnt; - uint16_t lastInput = gba->keysLast & keycnt; - gba->keysLast = gba->keysActive; - if (keyInput == lastInput) { - return; - } - - if (isAnd && keycnt == keyInput) { + if (isAnd && keycnt == (keysActive & keycnt)) { + if (keysLast == keysActive) { + return; + } GBARaiseIRQ(gba, IRQ_KEYPAD, 0); - } else if (!isAnd && keyInput) { + } else if (!isAnd && (keysActive & keycnt)) { GBARaiseIRQ(gba, IRQ_KEYPAD, 0); + } else { + gba->keysLast = 0x400; } } diff --git a/src/gba/io.c b/src/gba/io.c index 5c90f946a..8c6bbb5ad 100644 --- a/src/gba/io.c +++ b/src/gba/io.c @@ -547,6 +547,9 @@ void GBAIOWrite(struct GBA* gba, uint32_t address, uint16_t value) { // Interrupts and misc case REG_KEYCNT: value &= 0xC3FF; + if (gba->keysLast < 0x400) { + gba->keysLast &= gba->memory.io[address >> 1] | ~value; + } gba->memory.io[address >> 1] = value; GBATestKeypadIRQ(gba); return; From fa2975a4abe6e385bd73832fdc125b10dce6494c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 6 Dec 2021 12:38:08 -0800 Subject: [PATCH 22/59] GBA Serialization: Serials key IRQ state, update docs --- include/mgba/internal/gba/serialize.h | 19 ++++++++++++++----- src/gba/serialize.c | 2 ++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/mgba/internal/gba/serialize.h b/include/mgba/internal/gba/serialize.h index bf6a93774..b9bdcbea7 100644 --- a/include/mgba/internal/gba/serialize.h +++ b/include/mgba/internal/gba/serialize.h @@ -184,7 +184,11 @@ mLOG_DECLARE_CATEGORY(GBA_STATE); * 0x002C4 - 0x002C7: Game Boy Player next event * 0x002C8 - 0x002CB: Current DMA transfer word * 0x002CC - 0x002CF: Last DMA transfer PC - * 0x002D0 - 0x002DF: Reserved (leave zero) + * 0x002D0 - 0x002DF: Matrix memory command buffer + * | 0x002D0 - 0x002D3: Command + * | 0x002D4 - 0x002D7: Physical address + * | 0x002D8 - 0x002DB: Virtual address + * | 0x002DC - 0x002DF: Size * 0x002E0 - 0x002EF: Savedata state * | 0x002E0 - 0x002E0: Savedata type * | 0x002E1 - 0x002E1: Savedata command (see savedata.h) @@ -208,12 +212,16 @@ mLOG_DECLARE_CATEGORY(GBA_STATE); * 0x00310 - 0x00317: Global cycle counter * 0x00318 - 0x0031B: Last prefetched program counter * 0x0031C - 0x0031F: Miscellaneous flags - * | bit 0: Is CPU halted? - * | bit 1: POSTFLG - * | bit 2: Is IRQ pending? + * | bit 0: Is CPU halted? + * | bit 1: POSTFLG + * | bit 2: Is IRQ pending? + * | bit 3: Is CPU blocked? + * | bits 4 - 14: Active key IRQ keys + * | bits 15 - 31: Reserved * 0x00320 - 0x00323: Next IRQ event * 0x00324 - 0x00327: Interruptable BIOS stall cycles - * 0x00328 - 0x003FF: Reserved (leave zero) + * 0x00328 - 0x00367: Matrix memory mapping table + * 0x00368 - 0x003FF: Reserved (leave zero) * 0x00400 - 0x007FF: I/O memory * 0x00800 - 0x00BFF: Palette * 0x00C00 - 0x00FFF: OAM @@ -255,6 +263,7 @@ DECL_BIT(GBASerializedMiscFlags, Halted, 0); DECL_BIT(GBASerializedMiscFlags, POSTFLG, 1); DECL_BIT(GBASerializedMiscFlags, IrqPending, 2); DECL_BIT(GBASerializedMiscFlags, Blocked, 3); +DECL_BITS(GBASerializedMiscFlags, KeyIRQKeys, 4, 11); struct GBASerializedState { uint32_t versionMagic; diff --git a/src/gba/serialize.c b/src/gba/serialize.c index d3ce97d1c..a7294b6b5 100644 --- a/src/gba/serialize.c +++ b/src/gba/serialize.c @@ -68,6 +68,7 @@ void GBASerialize(struct GBA* gba, struct GBASerializedState* state) { STORE_32(gba->irqEvent.when - mTimingCurrentTime(&gba->timing), 0, &state->nextIrq); } miscFlags = GBASerializedMiscFlagsSetBlocked(miscFlags, gba->cpuBlocked); + miscFlags = GBASerializedMiscFlagsSetKeyIRQKeys(miscFlags, gba->keysLast); STORE_32(miscFlags, 0, &state->miscFlags); STORE_32(gba->biosStall, 0, &state->biosStall); @@ -197,6 +198,7 @@ bool GBADeserialize(struct GBA* gba, const struct GBASerializedState* state) { mTimingSchedule(&gba->timing, &gba->irqEvent, when); } gba->cpuBlocked = GBASerializedMiscFlagsGetBlocked(miscFlags); + gba->keysLast = GBASerializedMiscFlagsGetKeyIRQKeys(miscFlags); LOAD_32(gba->biosStall, 0, &state->biosStall); GBAVideoDeserialize(&gba->video, state); From 2f8526a0b1f9cb4732e7c8ae8bb1772c4fe895eb Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 6 Dec 2021 12:52:47 -0800 Subject: [PATCH 23/59] CInema: Add keyirq test --- cinema/gba/irq/keyirq/baseline_0000.png | Bin 0 -> 1469 bytes cinema/gba/irq/keyirq/baseline_0001.png | Bin 0 -> 1531 bytes cinema/gba/irq/keyirq/baseline_0002.png | Bin 0 -> 1548 bytes cinema/gba/irq/keyirq/baseline_0003.png | Bin 0 -> 1538 bytes cinema/gba/irq/keyirq/baseline_0004.png | Bin 0 -> 1559 bytes cinema/gba/irq/keyirq/baseline_0005.png | Bin 0 -> 1558 bytes cinema/gba/irq/keyirq/baseline_0006.png | Bin 0 -> 1751 bytes cinema/gba/irq/keyirq/baseline_0007.png | Bin 0 -> 1796 bytes cinema/gba/irq/keyirq/baseline_0008.png | Bin 0 -> 1803 bytes cinema/gba/irq/keyirq/baseline_0009.png | Bin 0 -> 1819 bytes cinema/gba/irq/keyirq/baseline_0010.png | Bin 0 -> 1825 bytes cinema/gba/irq/keyirq/baseline_0011.png | Bin 0 -> 1871 bytes cinema/gba/irq/keyirq/baseline_0012.png | Bin 0 -> 2097 bytes cinema/gba/irq/keyirq/baseline_0013.png | Bin 0 -> 2214 bytes cinema/gba/irq/keyirq/config.ini | 4 ++++ cinema/gba/irq/keyirq/test.gba | Bin 0 -> 69160 bytes 16 files changed, 4 insertions(+) create mode 100644 cinema/gba/irq/keyirq/baseline_0000.png create mode 100644 cinema/gba/irq/keyirq/baseline_0001.png create mode 100644 cinema/gba/irq/keyirq/baseline_0002.png create mode 100644 cinema/gba/irq/keyirq/baseline_0003.png create mode 100644 cinema/gba/irq/keyirq/baseline_0004.png create mode 100644 cinema/gba/irq/keyirq/baseline_0005.png create mode 100644 cinema/gba/irq/keyirq/baseline_0006.png create mode 100644 cinema/gba/irq/keyirq/baseline_0007.png create mode 100644 cinema/gba/irq/keyirq/baseline_0008.png create mode 100644 cinema/gba/irq/keyirq/baseline_0009.png create mode 100644 cinema/gba/irq/keyirq/baseline_0010.png create mode 100644 cinema/gba/irq/keyirq/baseline_0011.png create mode 100644 cinema/gba/irq/keyirq/baseline_0012.png create mode 100644 cinema/gba/irq/keyirq/baseline_0013.png create mode 100644 cinema/gba/irq/keyirq/config.ini create mode 100755 cinema/gba/irq/keyirq/test.gba diff --git a/cinema/gba/irq/keyirq/baseline_0000.png b/cinema/gba/irq/keyirq/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..d066de1eee20211cb227a243fe1e2711407da836 GIT binary patch literal 1469 zcmeHH{ZkSK0425Nbw|`{bMph%X_mH?Q~YX7m#Em;w4p}YnD$}j7m9_71Z1VOWwUlB zrUJT}E;GF3_*wzeoH`Nk66Hb^8we^Q8X^HA^Pkvn`{BL!!+Uq{?)~t7Je7g~?)2UX z004j|lH!qDy0V2fPq!@=@XJF1fbF+V#2-(uY&EKknHt#cnscub(oT(V0CQt*4RL6P zf4Abyqt&_qvUWu!TE}UhYg+@>173n;J&c~{LUexlWl~-a??#uC>7!Vz*UkLHaXvBToQZ?g5O0^PpL*sU*CgzJF!Al}Dn7OOm zM|1K>FFl=@R(x%PrwfzAAgqQk2$`_RlR}aDao9uMucOT`=-k}nuD@0+oBHS7U=(3G zPlB^2)6UEBQTJUt`2T?J#MbwjIipXbNe>xA6PQaD{^`;PU1c8g3A)3sL?$HWM}bGuV+xiYqMVQ}~0q5Y-ex!*l?t4Q$F2f?W(wpm?w2A;sMx-#aDE(k5|mG$5AdJVSW%Z4br^cjzVl1lwF>So~-aaD6kzgPWb z8Q8ApM*~^BScY~*@y5aZvQdo% zG>u`LGRVG4LOMZLyG%_+N3#_QB#te?3KO3_eJ0H8B%`007r3u`4P6p-wgLNVbFLamxh*4i!Rj3gcI@lSWkCr#jKdJ* zvlztsKip_W$1%arvwK)hWrTG~Mo)gYP-kTk2@D1pE#ioO$Zmwxn3vz2lo8nIvH{R{ z7)XXX`m*+y&(D&(dJF{?f-mv!w<`a{+r$`Yx&rr-8FTg9F4K#m`R0U?uj-UAgr%jB zsg?;pGvmMi8hZC^DDiUADhVXuvtmQfsQhT0L4yev-vn@mYbWB+gXhsx)4PWp+qZZQlY1&L9B*;UJA~Wk;~nG; z0)c!I_s8Q`_0uZq*RNS+ne+k_1X}lZV*H-ei?!1uC(;{!^1pmyo|f{YVyHMwv2y}X z(7UeoY$g&@^Wh$)1}7z~=p(0gE&maMu64xrWDvB;h>h1-Ol zU9IB>!rCxRj>m5tvovJ^pN>8Q$waTrX*yLfykZb_*Mz$lSrB`!zj)=!m<3RuN{baP zNY&Mr`6^^DfBgJr_lBJ3q@62h&s)P#k;&2TLJ6ZHn$_as_Feh{Q}vtE0_!os%O89c zCvxd1|3w1{p>`RK@z7@gn%qSoBi=u;@ln|z^Ikkcb@~xnj@tnW34aF-u=XPp-^(x>8&2Mx2(1smdQ6^+_jxn=C z7Y>6Dxwi1NBBk=)K`gVq6ycug6eEo}a_xks>1I~9ykVg^)Q>9(M+7k*&Z09U>`8X* zds}uh*dUrhr6?LD#VHCfLku2a?D5!(2N2b-%b_X2^N7n*FB=>Q(OCMd@7Z zd@{WoK5`w&?A0cTjc3UToB+6`q*_i=d{wYFq5u;2)fW%H3zj-4akkH!q zjvi7hZch@c0L$Q&7t*}@O)FkVZNcjWrt(rX2c31{e&lMd*6y@MwtRJP>Z6Rs<|sB> zz7QQcjA?-_22;tD$Bxn(FIh`DcZ?78=?o%k3}D$VD$CT7d@F*!MZ25k&@+veFSWpNb<6}}k!pd-J-+XJ@2_%+GT%9r3yI*)vLsaN_+W!2yKBmxLElyjSD#_L z6-<|XhmMyPrZO`JUVfh@SxGgB+O<}iHObc;vMX-N6`e9Fa#}uO^*l#+KS!9xd)mWS z=BCP}CKoXE1=OI>CJlBHAN%=0-r5FgzIIYPEmMH_I?4D>GAcNnzZ44c8`#br?=?5W=ha7 zo@)ZDj;hN%`|~*@nZR$OdRJkN`lijqkO>o$%)-1jM!+SEs8G`xEw@s#%(Ej}Pg7D) zIAS3rP{3NtupOlIQ!IP*Br)zgYdjC1Za&9WNi?BJ&fm{wLf&=kGT5K%e%4OMVx^DjsI9lAF0Ca V!vtkjc&wf}C@}#SFO2)8_+P*~?lAxW literal 0 HcmV?d00001 diff --git a/cinema/gba/irq/keyirq/baseline_0002.png b/cinema/gba/irq/keyirq/baseline_0002.png new file mode 100644 index 0000000000000000000000000000000000000000..13a00714eeb2861d7f54bf8cd63ad79c69740b89 GIT binary patch literal 1548 zcmeHH|5FkM9QAUo@d-v|$y?gh5_!RvZauMJF zayPDlQY{=`nebUZu=O`-hT=<QmSy3cqpPie#CgiLUZ;_$ORr=3Rs+xdO`H1y6>;Vi%t*+d zK?p;~p{exEVbq0wq8_@aazZg_v-(+7R*a*rM${&L{URn?Q0ASZyYjuFz`~8?7|GU6 zQe+17??e}T<|7qq3_7MSEluV759_>we06J_`hMbzN3iOJAqY^!&RNb;9NbXurN&Tu z%f?hGS|ht7gxctKfk`Ve0S6CLIUm)ZpCKrE=|+N1*G8ga$*&GnKIjs7%Vl9t4Xt(e zi$`vP9XSK`YbMoZt+fJkEuvA^`60sS9$UShfWUzRwjXB2HA*Hm;t9?<3AYwfxr<6t zG?Ko-OFNtR>#PM+??)0;;`Xia8RX{sd{3WerzRrf2ftV`kPkz)urRED5}M(gM)!b(nT4>7K>{`+9KAAib;We+2CN)r^^48cLJQN(@;j`)~Un8t_>#(Z& z)Ql1LZ0%Kfu?Ft~Tfr+sBWv2pvGwxLzVuSGq-7~7`Y2H_zPDNfH<~uyN2QhX`0fG+ zc|G2nhiK9~K7t7BB8QXl(!pccP74Ov+%%?LTM2Sp1bg|f7&Gc}aT56$tr@jR<^ZDG zFXhle8H){+tl>@Lg!46iNe}I51})eHgz4Rs($M;?z2m;d!~@l$cb(JCp+08tp={@< zS%C#^X$1tYxk@{#qD;;R>tccxdsbk!mM4lXvu6mDiun;F8EV~MgjRngwMfkKb;5M& z?9lsw01*wbv3%1nweR*QJA)bezSnvP<6P-zPu{K8Tqk@>WR;I+v(^ln#8&l? z3bv)IK_%@2g)f2m2-7G%v%0U4u;!9b8|>83DuRC*MIpP4}| zG;x9%;>iPd>mQsG9P-&u1We=52;!Ct?8X$(CYLJKgevY zEfa$z+kXPW?1ntwmwd@p`q00|weW0!L;hW-9RRogjsG@Dncyw>My+s)+F<+gcBu0q KfzAGL1^)ohcnkLc literal 0 HcmV?d00001 diff --git a/cinema/gba/irq/keyirq/baseline_0003.png b/cinema/gba/irq/keyirq/baseline_0003.png new file mode 100644 index 0000000000000000000000000000000000000000..df52d49724c4f582c76f64be0059c61f839e7a17 GIT binary patch literal 1538 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 Q|Gi7Zfv9kH*iXOw3y=sEIsgCw literal 0 HcmV?d00001 diff --git a/cinema/gba/irq/keyirq/baseline_0006.png b/cinema/gba/irq/keyirq/baseline_0006.png new file mode 100644 index 0000000000000000000000000000000000000000..52a118b11de6c092af2cffb8968fe4ad143ea22a GIT binary patch literal 1751 zcmeH||3A|S9LIMml|r3vx~`F{Xyr@gyJGp)sD1IRx>X`80D7dc99vu(} zr0ebF;kWKz*Y#wJ*7{|3;Esbp+K;_GTmuqH#HGQM5{K=c-b8Ky2Fi77F1clL@ywX5 z{=2J(0>Qr>Bhud{vUi)j5o)!?Ac-pqfpRKjiW-@;wq}hSu|W!nE{S$dinD@GP`y^- z2=&Vp;`q1YP4rtFB7^Z$kMcUXg_KHnm}IX={j2q67)Ba=WAk%2QP6JR`T^1WB8=iha*j+G+bl}Q@8Ck#Iw&~S)A&QKY$wQx)_pL z9SAe-ipQf|n>kPKmT!)$xxU(eIm5($*l2Y{G(n21HT*`lNt%*$m4{Jg^$iLQV8@Q@ zO)dr@UtuM)Bgb>{Q!ybS&M1^A~6QHWwza4NY?lp%!Hq0c@7Xmc;*%0Q5hl3SAM6H zC>n~fu}<`>5t^g7ajARK{gh@p0UhFxBA_GzXL9QWwqMsqafC zFGx2&K)h*IQ*qr5LgF?!+OfnobYqiJa39m16X6ee;aMwTn180AMBkl0!ts?0!Q+h) zAv+eGz@)0!;3_>`zXYKC0$O2_PEZi)S%I-}+=fE|rCp~p83q&6FwF_|du@jdLsvQm zBeP0T&xUHue-`I!LUR1Wo06v1rp+x?Ul_pI1DzH}(iAY|xc@zt(e#yS_w-#>@t=Qx zr>cjDO(S|XotyXkuyE(oLtGhcCe0|2PDY)75Gqx%BYHCC79B~rwpp-Q5h)YxsL0t? z+qor4PPJ_v6!p@VNk#hwX@^Vw^=9d249T4H5ldbM%9Sn}N!B35_3bf+|5n*g>ho2T z76}HHOyd{wt))rUEmvSRUa^0vh6W0fL~c=fmx8dcrRE+-_9RGW9dgRq^CM_F3 zFCd7l^uo{7aiV8+xyprA?>k@$%tIO9Xgi5nAGFdPVX zcG!5C$cx=T8+HBm-FT?wn!anxo~NgV_H9bjhOTFKpSbG$AN|)i)Eh9>3KMi<@#y+s OfxJCY9u00+(*6Opb6jiy literal 0 HcmV?d00001 diff --git a/cinema/gba/irq/keyirq/baseline_0007.png b/cinema/gba/irq/keyirq/baseline_0007.png new file mode 100644 index 0000000000000000000000000000000000000000..0db456d7d8ec77a774e5a1c5e294040ef129fe98 GIT binary patch literal 1796 zcmd^=?OW1^8po+Q=R?Rg%}mROYn@W_VHJv{W`bzUrpsDd*=%Z!QuO$Q!4#WLX(D2o zM=u2wY?&4|^8q+owByjsP^^^;LWbm1K!^zV6OcpK`7_Ro`@XNw{rz6w7x$a{mv0i{ zzz*&XAP@+QIvSH?oy*p0v)gR#54qU=Adu}iDkl2m6{?CR;ZhH6L5=~>Pu{-SS9i1C z^+rr=Cq?5;?q-t4Ef%i*JG(fcSySZlNkdDBt;hNd=0xl=zvpc>SVZ9E7$XTA zsDRxQ^wOHYBjon4gOe0$!&y^Rv)r$F|7?#KK_Gt#*Pf<6n{BHOh0xfnXk+G@QDKbB zktC{yC=WzSup;~Rc^O>km{~3nSRxNCVD3(*TUdm{H-@WUC7+!@SDVQx2x5S)r?RGo z`MoDrY%UKg8yZ+`^}#V61Y!{j8<++Gd>D)QE$THK@F#T8SWd25Xx3jpzM+*y z!?Ka&i1d}?tcT?0>pmkSY%D)lyw9}z2Ig9vH?o&sRGE{K@1maW*VXsLC=6MBke(=i z!f=A`M%9%Zd`7^m0AY|G%i=N?%dhyy^2@li&UxMf*1+}49_Ot)ZwoPE2<Mz*dOmkaI7wQ@RU;y{Qn&Wqf28 zW=vLmolSX=8>R~wW9l2%ITw4S!>{9=GAN7D$_)AIU46Kt@m{))4*dS@G4tXefZ8<_7+yZ$Wmt$O-HLiVR%ea< zZbi6vPcHM+kibop|B8(OAtN)?|{knrcrF)tTR02RM!efp*wuw)v3O-n? zckCLn!y7t6aIKR6z$_I_2h8REl)QZU$o!1KyCJN|6y^TdnOOP)$VpWp5#*22xuW9J~} z1~ck%tK2^%z*xi)^+Ceq0!zWr{8%eJ!0>eEy#Q3Qum8td+zUL~M3);%?pTd61mg$Y z8Bh@;phtUJiJ?t;Xryz-(&?7%^QtiHitwK{1-pl!VFR9``uE!#JpJ`BtR}XMM>G9` z*mp~!VCNCD2XT)AgOe9adb~>aXRelozACIs?Xz9SEUMYPlEAqn(u_t4Xi}~=?pY=e%WR`X3KWnu4U~++**I48?RJ6k++NB96^bX zP<>_dj-kC2*uA&fTyL6tDthsx7~ee@Yx(11i@AAc2AYnh(N5>D`9M^2UE^m93rzD$ zmpy?x`<)FmklPa%oerAXpqN>(3>xqvEl)p zk+F%nOhDJAKQ|yg>f5(uWl__*S=itF3>`iMIl=RC_jbTp^>_dHi4P v#m@cK5ux|T<+gsGLXZB`7VYqVCTYCPY8pIhDmT;m-9RX0LQFUOeEEL?s7rp- literal 0 HcmV?d00001 diff --git a/cinema/gba/irq/keyirq/baseline_0008.png b/cinema/gba/irq/keyirq/baseline_0008.png new file mode 100644 index 0000000000000000000000000000000000000000..c45194384cc3baaaabba8a484d82cb8455c04da5 GIT binary patch literal 1803 zcmds2>sQhT7^dc&mym6mnU~0MJ<59YCy>#RCoWUeR4I>gXbWN(m^g9kMtALvI_K+& ziIXLbjsXe}ub0+OX+5+L$=5Q*th4CyVnCJKY{r$HrUm~p>hZ= zuXV&=qK+7eGrF3H%Puidn!mD&;+vKWo!+Z&4zhMzpF$sxSrT-<&H{_^{A@!wego;Z zdz4mE{a2X6_GMtAa#4TASlOiTY1%*CDS_ijA4h3UQJzk>Rs}<-9CoB3W6hv6#AZtq z)cxf9;ssctEpt{LrLxZ`lM2n@hvv|CCezGp{Nd{ZRWFjxjH0Scq+~e3Pup2hUCsE) z9V0Q7g_QR9uC{n#8FoU6n2qsIg#g}o3fas2*d=-Xbf0=hI2dQFv6xl5-u6((fr}DW zp!xQx2oKESY$GN59`c>DkPOy2@m0J%JpSfKtD5Jk#VQ|})f%i{DM!wo?jy-^pzh}H zXxMpjKCGIN8%jI<^_WB8vgG|GZ`0cXi=Z}FE&}~gbG%1kna5RijU!{@ryu@&`SF|j z)(d>+<_{9eO$=(9@fbfS6x&C=1XcYJ=FFEJQ(O|k_ZZ@8Dk--k61EFd#cg#Fv|z(V zE<&+In7}UoY6w&EihIfAHeE0+cB&D-xjWz;FxesQ(jV}}w^7*+&KhXupWnWsmPEp` z5TvlQm1FD&q^4_LgG5Y>AV;##xcfT#YOE)sOHf#mot)>iIN77E>x@?FGrJ+35x)3= zc<+tM%h|YeziA;{FFTsaqtBOJ_Kgvg@~G{z{5g!C=aV(UUw7OVWI*GY)#A?$Lt7Eg zM*-b1d?2M@s(oWyf%l?|(BQ0xg0UhLB`Ah;M~EMfH*=#j7uzNn3YH*;ti0-$2mJbJ z{?sy({k8WZH*|qVMSag4+}cx`GF1dLB*ouI>gE?Z<;lsV?ZxDw@h>O^TZ_idOu96W zO`V6el*ImGwNq$t2 zFS^Dd-_Hrr`VBL54eQ(sU9y3faSrL^`AF3UmvN{=v+x8yX){y8v6V8e6%&pT^G`hF z4H^NJtq-0&96Q4Gsv}tY+{MjH%hj~_(Ad`aLyD319 z5cN=+%(g8i?w^P4T3c2h>}a@~rlkSDesR<^-v=Of_4|jG^?K;%;)pjR9u3!8V!vDw z?d{Xv1*;JqEB34#unNggJzR{o5ZvmITNP)Y}@P;=D$d!QyYjpOk zejA*=EeP8p{S9U=Z#-Zs^CiVOC^&lvFSK9IY?Q3nloOkX(FynR+3f>{xLW0k+V9~#o@F0OmCz24nd2g5AKl=7*@AK?3L zN|l^kLRKI4p?_e~d~v5o$^MMh(%=^bwJF`!>*)DKPM6ewCXqO`tOAykuQcpkWv&)k zHLThFp7UD1ap$BE-)vygL$3!MbiY@+8He7oUAt>ZGa9?rliKWF^nSy-dtjcMR zzt(nVJr(5g*hwn_F}df%p`Vb5O8Tb3yxef;qvY(95b(MDE*uKvwj%Nr2&XLcfYw0Y z#8|?kYSSk4@OQfREm*j?aor^9X?ltZ?S~xad$@YqVNtcy(-ytD0*9(C`!86^+^1#c zT=BMXz4?jA^W8FQpZB3hzH5!NvjQi2qG~rsmOK3)rRfOAQ6s9tpUJX3IS>*NAKejk GuIwL7eu=RF literal 0 HcmV?d00001 diff --git a/cinema/gba/irq/keyirq/baseline_0009.png b/cinema/gba/irq/keyirq/baseline_0009.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c88d04d723cca242c40db3e04b4c3158ef0642 GIT binary patch literal 1819 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 literal 0 HcmV?d00001 diff --git a/cinema/gba/irq/keyirq/baseline_0011.png b/cinema/gba/irq/keyirq/baseline_0011.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd1f016603dc725dc206d8ec337b40febd9b08e GIT binary patch literal 1871 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 C(>ag; literal 0 HcmV?d00001 diff --git a/cinema/gba/irq/keyirq/baseline_0013.png b/cinema/gba/irq/keyirq/baseline_0013.png new file mode 100644 index 0000000000000000000000000000000000000000..bec0dc22cc82f8db670030a659fe2459f4c2dce1 GIT binary patch literal 2214 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 kGH@UR2QqLV0|zp2AOrs=GcX2!@9G2_KXJq Date: Sun, 12 Dec 2021 21:26:33 -0800 Subject: [PATCH 24/59] Libretro: Partially resync with downstream --- src/platform/libretro/libretro.c | 168 +- src/platform/libretro/libretro.h | 805 +- src/platform/libretro/libretro_core_options.h | 565 +- .../libretro/libretro_core_options_intl.h | 15325 +++++++++++++++- 4 files changed, 16504 insertions(+), 359 deletions(-) diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index b6f326904..66e650b72 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -29,10 +29,19 @@ #include "libretro_core_options.h" -#define SAMPLES 1024 +#define GB_SAMPLES 512 +#define SAMPLE_RATE 32768 +/* An alpha factor of 1/180 is *somewhat* equivalent + * to calculating the average for the last 180 + * frames, or 3 seconds of runtime... */ +#define SAMPLES_PER_FRAME_MOVING_AVG_ALPHA (1.0f / 180.0f) #define RUMBLE_PWM 35 #define EVENT_RATE 60 +#define VIDEO_WIDTH_MAX 256 +#define VIDEO_HEIGHT_MAX 224 +#define VIDEO_BUFF_SIZE (VIDEO_WIDTH_MAX * VIDEO_HEIGHT_MAX * sizeof(color_t)) + static retro_environment_t environCallback; static retro_video_refresh_t videoCallback; static retro_audio_sample_batch_t audioCallback; @@ -60,6 +69,9 @@ static int32_t _readGyroZ(struct mRotationSource* source); static struct mCore* core; static color_t* outputBuffer = NULL; +static int16_t *audioSampleBuffer = NULL; +static size_t audioSampleBufferSize; +static float audioSamplesPerFrameAvg; static void* data; static size_t dataSize; static void* savedata; @@ -92,6 +104,10 @@ static bool envVarsUpdated; static int32_t tiltX = 0; static int32_t tiltY = 0; static int32_t gyroZ = 0; +static bool audioLowPassEnabled = false; +static int32_t audioLowPassRange = 0; +static int32_t audioLowPassLeftPrev = 0; +static int32_t audioLowPassRightPrev = 0; static const int keymap[] = { RETRO_DEVICE_ID_JOYPAD_A, @@ -106,6 +122,61 @@ static const int keymap[] = { RETRO_DEVICE_ID_JOYPAD_L, }; +/* Audio post processing */ +static void _audioLowPassFilter(int16_t* buffer, int count) { + int16_t* out = buffer; + + /* Restore previous samples */ + int32_t audioLowPassLeft = audioLowPassLeftPrev; + int32_t audioLowPassRight = audioLowPassRightPrev; + + /* Single-pole low-pass filter (6 dB/octave) */ + int32_t factorA = audioLowPassRange; + int32_t factorB = 0x10000 - factorA; + + int samples; + for (samples = 0; samples < count; ++samples) { + /* Apply low-pass filter */ + audioLowPassLeft = (audioLowPassLeft * factorA) + (out[0] * factorB); + audioLowPassRight = (audioLowPassRight * factorA) + (out[1] * factorB); + + /* 16.16 fixed point */ + audioLowPassLeft >>= 16; + audioLowPassRight >>= 16; + + /* Update sound buffer */ + out[0] = (int16_t) audioLowPassLeft; + out[1] = (int16_t) audioLowPassRight; + out += 2; + }; + + /* Save last samples for next frame */ + audioLowPassLeftPrev = audioLowPassLeft; + audioLowPassRightPrev = audioLowPassRight; +} + +static void _loadAudioLowPassFilterSettings(void) { + struct retro_variable var; + audioLowPassEnabled = false; + audioLowPassRange = (60 * 0x10000) / 100; + + var.key = "mgba_audio_low_pass_filter"; + var.value = 0; + + if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { + if (strcmp(var.value, "enabled") == 0) { + audioLowPassEnabled = true; + } + } + + var.key = "mgba_audio_low_pass_range"; + var.value = 0; + + if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { + audioLowPassRange = (strtol(var.value, NULL, 10) * 0x10000) / 100; + } +} + static void _initSensors(void) { if (sensorsInitDone) { return; @@ -238,6 +309,8 @@ static void _reloadSettings(void) { opts.frameskip = strtol(var.value, NULL, 10); } + _loadAudioLowPassFilterSettings(); + var.key = "mgba_idle_optimization"; var.value = 0; if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { @@ -297,7 +370,8 @@ void retro_set_environment(retro_environment_t env) { } #endif - libretro_set_core_options(environCallback); + bool categoriesSupported; + libretro_set_core_options(environCallback, &categoriesSupported); } void retro_set_video_refresh(retro_video_refresh_t video) { @@ -350,7 +424,7 @@ void retro_get_system_av_info(struct retro_system_av_info* info) { info->geometry.aspect_ratio = width / (double) height; info->timing.fps = core->frequency(core) / (float) core->frameCycles(core); - info->timing.sample_rate = 32768; + info->timing.sample_rate = SAMPLE_RATE; } void retro_init(void) { @@ -435,6 +509,13 @@ void retro_init(void) { void retro_deinit(void) { free(outputBuffer); + if (audioSampleBuffer) { + free(audioSampleBuffer); + audioSampleBuffer = NULL; + } + audioSampleBufferSize = 0; + audioSamplesPerFrameAvg = 0.0f; + if (sensorStateCallback) { sensorStateCallback(0, RETRO_SENSOR_ACCELEROMETER_DISABLE, EVENT_RATE); sensorStateCallback(0, RETRO_SENSOR_GYROSCOPE_DISABLE, EVENT_RATE); @@ -448,6 +529,11 @@ void retro_deinit(void) { luxSensorEnabled = false; sensorsInitDone = false; useBitmasks = false; + + audioLowPassEnabled = false; + audioLowPassRange = 0; + audioLowPassLeftPrev = 0; + audioLowPassRightPrev = 0; } void retro_run(void) { @@ -471,6 +557,7 @@ void retro_run(void) { core->reloadConfigOption(core, "allowOpposingDirections", NULL); } + _loadAudioLowPassFilterSettings(); var.key = "mgba_frameskip"; var.value = 0; if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { @@ -748,17 +835,58 @@ bool retro_load_game(const struct retro_game_info* game) { } mCoreInitConfig(core, NULL); core->init(core); - core->setAVStream(core, &stream); - size_t size = 256 * 224 * BYTES_PER_PIXEL; - outputBuffer = malloc(size); - memset(outputBuffer, 0xFF, size); - core->setVideoBuffer(core, outputBuffer, 256); + outputBuffer = malloc(VIDEO_BUFF_SIZE); + memset(outputBuffer, 0xFF, VIDEO_BUFF_SIZE); + core->setVideoBuffer(core, outputBuffer, VIDEO_WIDTH_MAX); - core->setAudioBufferSize(core, SAMPLES); + #ifdef M_CORE_GBA + /* GBA emulation produces a fairly regular number + * of audio samples per frame that is consistent + * with the set sample rate. We therefore consume + * audio samples in retro_run() to achieve the + * best possible frame pacing */ + if (core->platform(core) == mPLATFORM_GBA) { + /* Set initial output audio buffer size + * to nominal number of samples per frame. + * Buffer will be resized as required in + * retro_run(). */ + size_t audioSamplesPerFrame = (size_t)((float) SAMPLE_RATE * (float) core->frameCycles(core) / + (float)core->frequency(core)); + audioSampleBufferSize = audioSamplesPerFrame * 2; + audioSampleBuffer = malloc(audioSampleBufferSize * sizeof(int16_t)); + audioSamplesPerFrameAvg = (float) audioSamplesPerFrame; + /* Internal audio buffer size should be + * audioSamplesPerFrame, but number of samples + * actually generated varies slightly on a + * frame-by-frame basis. We therefore allow + * for some wriggle room by setting double + * what we need (accounting for the hard + * coded blip buffer limit of 0x4000). */ + size_t internalAudioBufferSize = audioSamplesPerFrame * 2; + if (internalAudioBufferSize > 0x4000) { + internalAudioBufferSize = 0x4000; + } + core->setAudioBufferSize(core, internalAudioBufferSize); + } else + #endif + { + /* GB/GBC emulation does not produce a number + * of samples per frame that is consistent with + * the set sample rate, and so it is unclear how + * best to handle this. We therefore fallback to + * using the regular stream-set _postAudioBuffer() + * callback with a fixed buffer size, which seems + * (historically) to produce adequate results */ + core->setAVStream(core, &stream); + audioSampleBufferSize = GB_SAMPLES * 2; + audioSampleBuffer = malloc(audioSampleBufferSize * sizeof(int16_t)); + audioSamplesPerFrameAvg = GB_SAMPLES; + core->setAudioBufferSize(core, GB_SAMPLES); + } - blip_set_rates(core->getAudioChannel(core, 0), core->frequency(core), 32768); - blip_set_rates(core->getAudioChannel(core, 1), core->frequency(core), 32768); + blip_set_rates(core->getAudioChannel(core, 0), core->frequency(core), SAMPLE_RATE); + blip_set_rates(core->getAudioChannel(core, 1), core->frequency(core), SAMPLE_RATE); core->setPeripheral(core, mPERIPH_RUMBLE, &rumble); core->setPeripheral(core, mPERIPH_ROTATION, &rotation); @@ -975,12 +1103,13 @@ void* retro_get_memory_data(unsigned id) { case GB_MBC3_RTC: return &((uint8_t*) savedata)[((struct GB*) core->board)->sramSize]; default: - return NULL; + break; } #endif default: - return NULL; + break; } + break; default: break; } @@ -1075,12 +1204,17 @@ void GBARetroLog(struct mLogger* logger, int category, enum mLogLevel level, con logCallback(retroLevel, "%s: %s\n", mLogCategoryName(category), message); } +/* Used only for GB/GBC content */ static void _postAudioBuffer(struct mAVStream* stream, blip_t* left, blip_t* right) { UNUSED(stream); - int16_t samples[SAMPLES * 2]; - blip_read_samples(left, samples, SAMPLES, true); - blip_read_samples(right, samples + 1, SAMPLES, true); - audioCallback(samples, SAMPLES); + int produced = blip_read_samples(left, audioSampleBuffer, GB_SAMPLES, true); + blip_read_samples(right, audioSampleBuffer + 1, GB_SAMPLES, true); + if (produced > 0) { + if (audioLowPassEnabled) { + _audioLowPassFilter(audioSampleBuffer, produced); + } + audioCallback(audioSampleBuffer, (size_t)produced); + } } static void _setRumble(struct mRumble* rumble, int enable) { diff --git a/src/platform/libretro/libretro.h b/src/platform/libretro/libretro.h index 59bd51378..2f1748370 100644 --- a/src/platform/libretro/libretro.h +++ b/src/platform/libretro/libretro.h @@ -69,7 +69,7 @@ extern "C" { # endif # endif # else -# if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__CELLOS_LV2__) +# if defined(__GNUC__) && __GNUC__ >= 4 # define RETRO_API RETRO_CALLCONV __attribute__((__visibility__("default"))) # else # define RETRO_API RETRO_CALLCONV @@ -282,6 +282,7 @@ enum retro_language RETRO_LANGUAGE_PERSIAN = 20, RETRO_LANGUAGE_HEBREW = 21, RETRO_LANGUAGE_ASTURIAN = 22, + RETRO_LANGUAGE_FINNISH = 23, RETRO_LANGUAGE_LAST, /* Ensure sizeof(enum) == sizeof(int) */ @@ -712,6 +713,9 @@ enum retro_mod * state of rumble motors in controllers. * A strong and weak motor is supported, and they can be * controlled indepedently. + * Should be called from either retro_init() or retro_load_game(). + * Should not be called from retro_set_environment(). + * Returns false if rumble functionality is unavailable. */ #define RETRO_ENVIRONMENT_GET_INPUT_DEVICE_CAPABILITIES 24 /* uint64_t * -- @@ -1127,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 @@ -1168,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. @@ -1201,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 @@ -1374,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: @@ -2777,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. */ @@ -2888,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. @@ -2934,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/src/platform/libretro/libretro_core_options.h b/src/platform/libretro/libretro_core_options.h index 5b0a62b1e..ca1b6514e 100644 --- a/src/platform/libretro/libretro_core_options.h +++ b/src/platform/libretro/libretro_core_options.h @@ -13,9 +13,10 @@ /* ******************************** - * VERSION: 1.3 + * 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 @@ -48,43 +49,43 @@ 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[] = { { - "mgba_solar_sensor_level", - "Solar Sensor Level", - "Sets ambient sunlight intensity. Can be used by games that included a solar sensor in their cartridges, e.g: the Boktai series.", - { - { "sensor", "Use device sensor if available" }, - { "0", NULL }, - { "1", NULL }, - { "2", NULL }, - { "3", NULL }, - { "4", NULL }, - { "5", NULL }, - { "6", NULL }, - { "7", NULL }, - { "8", NULL }, - { "9", NULL }, - { "10", NULL }, - { NULL, NULL }, - }, - "0" + "system", + "System", + "Configure base hardware selection / BIOS parameters." }, { - "mgba_allow_opposing_directions", - "Allow Opposing Directional Input", - "Enabling this will allow pressing / quickly alternating / holding both left and right (or up and down) directions at the same time. This may cause movement-based glitches.", - { - { "no", "disabled" }, - { "yes", "enabled" }, - { NULL, NULL }, - }, - "no" + "video", + "Video", + "Configure DMG palette / SGB borders." }, + { + "audio", + "Audio", + "Configure audio filtering." + }, + { + "input", + "Input & Auxiliary Devices", + "Configure controller / sensor input and controller rumble settings." + }, + { + "performance", + "Performance", + "Configure idle loop removal / frameskipping parameters." + }, + { NULL, NULL, NULL }, +}; + +struct retro_core_option_v2_definition option_defs_us[] = { { "mgba_gb_model", - "Game Boy Model (requires restart)", + "Game Boy Model (Restart)", + NULL, "Runs loaded content with a specific Game Boy model. 'Autodetect' will select the most appropriate model for the current game.", + NULL, + "system", { { "Autodetect", NULL }, { "Game Boy", NULL }, @@ -97,41 +98,164 @@ struct retro_core_option_definition option_defs_us[] = { }, { "mgba_use_bios", - "Use BIOS File if Found (requires restart)", + "Use BIOS File if Found (Restart)", + NULL, "Use official BIOS/bootloader for emulated hardware, if present in RetroArch's system directory.", + NULL, + "system", { - { "ON", NULL }, - { "OFF", NULL }, + { "ON", "enabled" }, + { "OFF", "disabled" }, { NULL, NULL }, }, "ON" }, { "mgba_skip_bios", - "Skip BIOS Intro (requires restart)", + "Skip BIOS Intro (Restart)", + NULL, "When using an official BIOS/bootloader, skip the start-up logo animation. This setting is ignored when 'Use BIOS File if Found' is disabled.", + NULL, + "system", { - { "OFF", NULL }, - { "ON", NULL }, + { "OFF", "disabled" }, + { "ON", "enabled" }, { NULL, NULL }, }, "OFF" }, { - "mgba_sgb_borders", - "Use Super Game Boy Borders (requires restart)", - "Display Super Game Boy borders when running Super Game Boy enhanced games.", + "mgba_gb_colors", + "Default Game Boy Palette", + NULL, + "Selects which palette is used for Game Boy games that are not Game Boy Color or Super Game Boy compatible, or if the model is forced to Game Boy.", + NULL, + "video", { - { "ON", NULL }, - { "OFF", NULL }, + /* This list is populated at runtime */ + { "Grayscale", NULL }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + "Use Super Game Boy Borders (Restart)", + NULL, + "Display Super Game Boy borders when running Super Game Boy enhanced games.", + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, { NULL, NULL }, }, "ON" }, + { + "mgba_audio_low_pass_filter", + "Audio Filter", + "Low Pass Filter", + "Enables a low pass audio filter to reduce the 'harshness' of generated audio.", + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + "Audio Filter Level", + "Filter Level", + "Specifies the cut-off frequency of the low pass audio filter. A higher value increases the perceived 'strength' of the filter, since a wider range of the high frequency spectrum is attenuated.", + NULL, + "audio", + { + { "5", "5%" }, + { "10", "10%" }, + { "15", "15%" }, + { "20", "20%" }, + { "25", "25%" }, + { "30", "30%" }, + { "35", "35%" }, + { "40", "40%" }, + { "45", "45%" }, + { "50", "50%" }, + { "55", "55%" }, + { "60", "60%" }, + { "65", "65%" }, + { "70", "70%" }, + { "75", "75%" }, + { "80", "80%" }, + { "85", "85%" }, + { "90", "90%" }, + { "95", "95%" }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + "Allow Opposing Directional Input", + NULL, + "Enabling this will allow pressing / quickly alternating / holding both left and right (or up and down) directions at the same time. This may cause movement-based glitches.", + NULL, + "input", + { + { "no", "disabled" }, + { "yes", "enabled" }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + "Solar Sensor Level", + NULL, + "Sets ambient sunlight intensity. Can be used by games that included a solar sensor in their cartridges, e.g: the Boktai series.", + NULL, + "input", + { + { "sensor", "Use device sensor if available" }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + "Game Boy Player Rumble (Restart)", + NULL, + "Enabling this will allow compatible games with the Game Boy Player boot logo to make the controller rumble. Due to how Nintendo decided this feature should work, it may cause glitches such as flickering or lag in some of these games.", + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, { "mgba_idle_optimization", "Idle Loop Removal", + NULL, "Reduce system load by optimizing so-called 'idle-loops' - sections in the code where nothing happens, but the CPU runs at full speed (like a car revving in neutral). Improves performance, and should be enabled on low-end hardware.", + NULL, + "performance", { { "Remove Known", NULL }, { "Detect and Remove", NULL }, @@ -143,7 +267,10 @@ struct retro_core_option_definition option_defs_us[] = { { "mgba_frameskip", "Frameskip", - "Skip frames to improve performance at the expense of visual smoothness. Value set here is the number of frames omitted after a frame is rendered - i.e. '0' = 60fps, '1' = 30fps, '2' = 15fps, etc.", + NULL, + "Skip frames to improve performance at the expense of visual smoothness. The value set here is the number of frames omitted after a frame is rendered - i.e. '0' = 60fps, '1' = 30fps, '2' = 15fps, etc.", + NULL, + "performance", { { "0", NULL }, { "1", NULL }, @@ -160,44 +287,12 @@ struct retro_core_option_definition option_defs_us[] = { }, "0" }, -#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) - { - "mgba_color_correction", - "Color Correction", - "Adjusts output colors to match the display of real GBA/GBC hardware.", - { - { "OFF", NULL }, - { "GBA", "Game Boy Advance" }, - { "GBC", "Game Boy Color" }, - { "Auto", NULL }, - { NULL, NULL }, - }, - "OFF" - }, -#endif - { - "mgba_force_gbp", - "Enable Game Boy Player Rumble (requires restart)", - "Enabling this will allow compatible games with the Game Boy Player boot logo to make the controller rumble. Due to how Nintendo decided this feature should work, it may cause glitches such as flickering or lag in some of these games.", - { - { "OFF", NULL }, - { "ON", NULL }, - { NULL, NULL }, - }, - "OFF" - }, - { - "mgba_gb_colors", - "Set default Game Boy palette", - "Selects which palette is used for Game Boy games that are not Game Boy Color or Super Game Boy compatible, or if the model is forced to Game Boy.", - { - // This list is populated at runtime - { "Grayscale", NULL }, - { NULL, NULL }, - }, - "Grayscale" - }, - { NULL, NULL, NULL, {{0}}, NULL }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; + +struct retro_core_options_v2 options_us = { + option_cats_us, + option_defs_us }; /* @@ -207,26 +302,31 @@ struct retro_core_option_definition option_defs_us[] = { */ #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 */ - option_defs_it, /* 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 */ +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 @@ -244,39 +344,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)) + *categories_supported = false; + + if (!environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version)) + version = 0; + + if (version >= 2) { #ifndef HAVE_NO_LANGEXTRA - struct retro_core_options_intl core_options_intl; - unsigned language = 0; + struct retro_core_options_v2_intl core_options_intl; - core_options_intl.us = option_defs_us; + 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 - environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, &option_defs_us); + *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) @@ -285,86 +407,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/src/platform/libretro/libretro_core_options_intl.h b/src/platform/libretro/libretro_core_options_intl.h index c2d23f242..f27f13b9c 100644 --- a/src/platform/libretro/libretro_core_options_intl.h +++ b/src/platform/libretro/libretro_core_options_intl.h @@ -11,9 +11,10 @@ /* ******************************** - * VERSION: 1.3 + * 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 @@ -36,112 +37,396 @@ extern "C" { * Core Option Definitions ******************************** */ +/* RETRO_LANGUAGE_AR */ -/* RETRO_LANGUAGE_JAPANESE */ +#define CATEGORY_SYSTEM_LABEL_AR NULL +#define CATEGORY_SYSTEM_INFO_0_AR NULL +#define CATEGORY_VIDEO_LABEL_AR "فيديو" +#define CATEGORY_VIDEO_INFO_0_AR NULL +#define CATEGORY_VIDEO_INFO_1_AR NULL +#define CATEGORY_AUDIO_LABEL_AR "نظام تشغيل الصوت" +#define CATEGORY_AUDIO_INFO_0_AR NULL +#define CATEGORY_INPUT_LABEL_AR NULL +#define CATEGORY_INPUT_INFO_0_AR NULL +#define CATEGORY_PERFORMANCE_LABEL_AR NULL +#define CATEGORY_PERFORMANCE_INFO_0_AR NULL +#define MGBA_GB_MODEL_LABEL_AR NULL +#define MGBA_GB_MODEL_INFO_0_AR NULL +#define OPTION_VAL_AUTODETECT_AR "الكشف التلقائي" +#define OPTION_VAL_GAME_BOY_AR NULL +#define OPTION_VAL_SUPER_GAME_BOY_AR NULL +#define OPTION_VAL_GAME_BOY_COLOR_AR NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_AR NULL +#define MGBA_USE_BIOS_LABEL_AR NULL +#define MGBA_USE_BIOS_INFO_0_AR NULL +#define MGBA_SKIP_BIOS_LABEL_AR NULL +#define MGBA_SKIP_BIOS_INFO_0_AR NULL +#define MGBA_GB_COLORS_LABEL_AR NULL +#define MGBA_GB_COLORS_INFO_0_AR NULL +#define OPTION_VAL_GRAYSCALE_AR NULL +#define MGBA_SGB_BORDERS_LABEL_AR NULL +#define MGBA_SGB_BORDERS_INFO_0_AR NULL +#define MGBA_COLOR_CORRECTION_LABEL_AR NULL +#define MGBA_COLOR_CORRECTION_INFO_0_AR NULL +#define OPTION_VAL_AUTO_AR "تلقائي" +#define MGBA_INTERFRAME_BLENDING_LABEL_AR NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_AR NULL +#define OPTION_VAL_MIX_AR NULL +#define OPTION_VAL_MIX_SMART_AR NULL +#define OPTION_VAL_LCD_GHOSTING_AR NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_AR NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_AR "تصفية الصوت" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_AR NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_AR NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_AR NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_AR NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_AR NULL +#define OPTION_VAL_5_AR NULL +#define OPTION_VAL_10_AR NULL +#define OPTION_VAL_15_AR NULL +#define OPTION_VAL_20_AR NULL +#define OPTION_VAL_25_AR NULL +#define OPTION_VAL_30_AR NULL +#define OPTION_VAL_35_AR NULL +#define OPTION_VAL_40_AR NULL +#define OPTION_VAL_45_AR NULL +#define OPTION_VAL_50_AR NULL +#define OPTION_VAL_55_AR NULL +#define OPTION_VAL_60_AR NULL +#define OPTION_VAL_65_AR NULL +#define OPTION_VAL_70_AR NULL +#define OPTION_VAL_75_AR NULL +#define OPTION_VAL_80_AR NULL +#define OPTION_VAL_85_AR NULL +#define OPTION_VAL_90_AR NULL +#define OPTION_VAL_95_AR NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_AR NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_AR NULL +#define OPTION_VAL_NO_AR "لا" +#define OPTION_VAL_YES_AR "نعم" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_AR NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_AR NULL +#define OPTION_VAL_SENSOR_AR NULL +#define MGBA_FORCE_GBP_LABEL_AR NULL +#define MGBA_FORCE_GBP_INFO_0_AR NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_AR NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_AR NULL +#define OPTION_VAL_REMOVE_KNOWN_AR NULL +#define OPTION_VAL_DETECT_AND_REMOVE_AR NULL +#define OPTION_VAL_DON_T_REMOVE_AR NULL +#define MGBA_FRAMESKIP_LABEL_AR NULL +#define MGBA_FRAMESKIP_INFO_0_AR NULL +#define OPTION_VAL_AUTO_THRESHOLD_AR NULL +#define OPTION_VAL_FIXED_INTERVAL_AR NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_AR NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_AR NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_AR NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_AR NULL -/* RETRO_LANGUAGE_FRENCH */ - -/* RETRO_LANGUAGE_SPANISH */ - -/* RETRO_LANGUAGE_GERMAN */ - -/* RETRO_LANGUAGE_ITALIAN */ - -struct retro_core_option_definition option_defs_it[] = { +struct retro_core_option_v2_category option_cats_ar[] = { { - "mgba_solar_sensor_level", - "Livello Sensore Solare", - "Imposta l'intensità solare dell'ambiente. Può essere usato dai giochi che includono un sensore solare nelle loro cartucce, es.: la serie Boktai.", - { - { "0", NULL }, - { "1", NULL }, - { "2", NULL }, - { "3", NULL }, - { "4", NULL }, - { "5", NULL }, - { "6", NULL }, - { "7", NULL }, - { "8", NULL }, - { "9", NULL }, - { "10", NULL }, - { NULL, NULL }, - }, - "0" + "system", + CATEGORY_SYSTEM_LABEL_AR, + CATEGORY_SYSTEM_INFO_0_AR }, { - "mgba_allow_opposing_directions", - "Permetti Input Direzionali Opposti", - "Attivando questa funzionalità ti permette di premere / alternare velocemente / tenere premuti entrambe le direzioni destra e sinistra (oppure su e giù) allo stesso momento. Potrebbe causare dei glitch di movimento.", - { - { "no", "Disabilitato" }, - { "yes", "Abilitato" }, - { NULL, NULL }, - }, - "no" + "video", + CATEGORY_VIDEO_LABEL_AR, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_AR +#else + CATEGORY_VIDEO_INFO_1_AR +#endif }, + { + "audio", + CATEGORY_AUDIO_LABEL_AR, + CATEGORY_AUDIO_INFO_0_AR + }, + { + "input", + CATEGORY_INPUT_LABEL_AR, + CATEGORY_INPUT_INFO_0_AR + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_AR, + CATEGORY_PERFORMANCE_INFO_0_AR + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ar[] = { { "mgba_gb_model", - "Modello Game Boy (richiede riavvio)", - "Esegue il contenuto caricato con un modello specifico di Game Boy. 'Rivela Automaticamente' selezionerà il modello più appropriato per il gioco attuale.", + MGBA_GB_MODEL_LABEL_AR, + NULL, + MGBA_GB_MODEL_INFO_0_AR, + NULL, + "system", { - { "Autodetect", "Rivela Automaticamente" }, - { "Game Boy", NULL }, - { "Super Game Boy", NULL }, - { "Game Boy Color", NULL }, - { "Game Boy Advance", NULL }, + { "Autodetect", OPTION_VAL_AUTODETECT_AR }, + { "Game Boy", OPTION_VAL_GAME_BOY_AR }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_AR }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_AR }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_AR }, { NULL, NULL }, }, "Autodetect" }, { "mgba_use_bios", - "Usa il File BIOS se Presente (richiede riavvio)", - "Usa il BIOS/bootloader ufficiale per hardware emulato, se presente nella cartella di sistema di RetroArch.", + MGBA_USE_BIOS_LABEL_AR, + NULL, + MGBA_USE_BIOS_INFO_0_AR, + NULL, + "system", { - { "ON", NULL }, - { "OFF", NULL }, + { "ON", "enabled" }, + { "OFF", "disabled" }, { NULL, NULL }, }, "ON" }, { "mgba_skip_bios", - "Salta Intro BIOS (richiede riavvio)", - "Salta il filmato del logo di avvio se si usa un BIOS/bootloader ufficiale. Questa impostazione è ignorata se 'Usa il file BIOS se presente' è disabilitato.", + MGBA_SKIP_BIOS_LABEL_AR, + NULL, + MGBA_SKIP_BIOS_INFO_0_AR, + NULL, + "system", { - { "OFF", NULL }, - { "ON", NULL }, + { "OFF", "disabled" }, + { "ON", "enabled" }, { NULL, NULL }, }, "OFF" }, { - "mgba_sgb_borders", - "Utilizza i Bordi Super Game Boy (richiede riavvio)", - "Visualizza i bordi del Super Game Boy quando apri un gioco potenziato dal Super Game Boy.", + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_AR, + NULL, + MGBA_GB_COLORS_INFO_0_AR, + NULL, + "video", { - { "ON", NULL }, - { "OFF", NULL }, + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_AR }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_AR, + NULL, + MGBA_SGB_BORDERS_INFO_0_AR, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, { NULL, NULL }, }, "ON" }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_AR, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_AR, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_AR }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_AR }, + { "Auto", OPTION_VAL_AUTO_AR }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_AR, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_AR, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_AR }, + { "mix_smart", OPTION_VAL_MIX_SMART_AR }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_AR }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_AR }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_AR, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_AR, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_AR, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_AR, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_AR, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_AR, + NULL, + "audio", + { + { "5", OPTION_VAL_5_AR }, + { "10", OPTION_VAL_10_AR }, + { "15", OPTION_VAL_15_AR }, + { "20", OPTION_VAL_20_AR }, + { "25", OPTION_VAL_25_AR }, + { "30", OPTION_VAL_30_AR }, + { "35", OPTION_VAL_35_AR }, + { "40", OPTION_VAL_40_AR }, + { "45", OPTION_VAL_45_AR }, + { "50", OPTION_VAL_50_AR }, + { "55", OPTION_VAL_55_AR }, + { "60", OPTION_VAL_60_AR }, + { "65", OPTION_VAL_65_AR }, + { "70", OPTION_VAL_70_AR }, + { "75", OPTION_VAL_75_AR }, + { "80", OPTION_VAL_80_AR }, + { "85", OPTION_VAL_85_AR }, + { "90", OPTION_VAL_90_AR }, + { "95", OPTION_VAL_95_AR }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_AR, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_AR, + NULL, + "input", + { + { "no", OPTION_VAL_NO_AR }, + { "yes", OPTION_VAL_YES_AR }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_AR, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_AR, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_AR }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_AR, + NULL, + MGBA_FORCE_GBP_INFO_0_AR, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, { "mgba_idle_optimization", - "Rimozione Idle Loop", - "Riduce il carico del sistema ottimizzando gli 'idle-loops' - sezione del codice dove non accade nulla, ma la CPU lavora a velocità massima. Migliora le prestazioni, è consigliato abilitarlo su hardware di bassa fascia.", + MGBA_IDLE_OPTIMIZATION_LABEL_AR, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_AR, + NULL, + "performance", { - { "Remove Known", "Rimuovi Conosciuti" }, - { "Detect and Remove", "Rileva e Rimuovi" }, - { "Don't Remove", "Non Rimuovere" }, + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_AR }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_AR }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_AR }, { NULL, NULL }, }, "Remove Known" }, { "mgba_frameskip", - "Salta Frame", - "Salta dei frame per migliorare le prestazioni a costo della fluidità dell'immagine. Il valore impostato qui è il numero dei frame rimosso dopo che un frame sia stato renderizzato - ovvero '0' = 60fps, '1' = 30fps, '2' = 15fps, ecc.", + MGBA_FRAMESKIP_LABEL_AR, + NULL, + MGBA_FRAMESKIP_INFO_0_AR, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_AR }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_AR }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_AR }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_AR, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_AR, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_AR, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_AR, + NULL, + "performance", { { "0", NULL }, { "1", NULL }, @@ -158,146 +443,403 @@ struct retro_core_option_definition option_defs_it[] = { }, "0" }, -#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) - { - "mgba_color_correction", - "Correzione Colore", - "Regola i colori per corrispondere lo schermo di GBA/GBC reali.", - { - { "OFF", NULL }, - { "GBA", "Game Boy Advance" }, - { "GBC", "Game Boy Color" }, - { "Auto", NULL }, - { NULL, NULL }, - }, - "OFF" - }, -#endif - { NULL, NULL, NULL, {{0}}, NULL }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_ar = { + option_cats_ar, + option_defs_ar }; -/* RETRO_LANGUAGE_DUTCH */ +/* RETRO_LANGUAGE_AST */ -/* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ +#define CATEGORY_SYSTEM_LABEL_AST "Sistema" +#define CATEGORY_SYSTEM_INFO_0_AST NULL +#define CATEGORY_VIDEO_LABEL_AST "Videu" +#define CATEGORY_VIDEO_INFO_0_AST NULL +#define CATEGORY_VIDEO_INFO_1_AST NULL +#define CATEGORY_AUDIO_LABEL_AST "Audiu" +#define CATEGORY_AUDIO_INFO_0_AST NULL +#define CATEGORY_INPUT_LABEL_AST "Preseos d'entrada y auxiliares" +#define CATEGORY_INPUT_INFO_0_AST NULL +#define CATEGORY_PERFORMANCE_LABEL_AST "Rindimientu" +#define CATEGORY_PERFORMANCE_INFO_0_AST NULL +#define MGBA_GB_MODEL_LABEL_AST NULL +#define MGBA_GB_MODEL_INFO_0_AST NULL +#define OPTION_VAL_AUTODETECT_AST NULL +#define OPTION_VAL_GAME_BOY_AST NULL +#define OPTION_VAL_SUPER_GAME_BOY_AST NULL +#define OPTION_VAL_GAME_BOY_COLOR_AST NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_AST NULL +#define MGBA_USE_BIOS_LABEL_AST NULL +#define MGBA_USE_BIOS_INFO_0_AST NULL +#define MGBA_SKIP_BIOS_LABEL_AST NULL +#define MGBA_SKIP_BIOS_INFO_0_AST NULL +#define MGBA_GB_COLORS_LABEL_AST NULL +#define MGBA_GB_COLORS_INFO_0_AST NULL +#define OPTION_VAL_GRAYSCALE_AST NULL +#define MGBA_SGB_BORDERS_LABEL_AST NULL +#define MGBA_SGB_BORDERS_INFO_0_AST NULL +#define MGBA_COLOR_CORRECTION_LABEL_AST NULL +#define MGBA_COLOR_CORRECTION_INFO_0_AST NULL +#define OPTION_VAL_AUTO_AST NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_AST NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_AST NULL +#define OPTION_VAL_MIX_AST NULL +#define OPTION_VAL_MIX_SMART_AST NULL +#define OPTION_VAL_LCD_GHOSTING_AST NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_AST NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_AST NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_AST NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_AST NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_AST NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_AST NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_AST NULL +#define OPTION_VAL_5_AST NULL +#define OPTION_VAL_10_AST NULL +#define OPTION_VAL_15_AST NULL +#define OPTION_VAL_20_AST NULL +#define OPTION_VAL_25_AST NULL +#define OPTION_VAL_30_AST NULL +#define OPTION_VAL_35_AST NULL +#define OPTION_VAL_40_AST NULL +#define OPTION_VAL_45_AST NULL +#define OPTION_VAL_50_AST NULL +#define OPTION_VAL_55_AST NULL +#define OPTION_VAL_60_AST NULL +#define OPTION_VAL_65_AST NULL +#define OPTION_VAL_70_AST NULL +#define OPTION_VAL_75_AST NULL +#define OPTION_VAL_80_AST NULL +#define OPTION_VAL_85_AST NULL +#define OPTION_VAL_90_AST NULL +#define OPTION_VAL_95_AST NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_AST NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_AST NULL +#define OPTION_VAL_NO_AST "non" +#define OPTION_VAL_YES_AST "sí" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_AST "Nivel del sensor solar" +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_AST NULL +#define OPTION_VAL_SENSOR_AST NULL +#define MGBA_FORCE_GBP_LABEL_AST NULL +#define MGBA_FORCE_GBP_INFO_0_AST NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_AST NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_AST NULL +#define OPTION_VAL_REMOVE_KNOWN_AST NULL +#define OPTION_VAL_DETECT_AND_REMOVE_AST NULL +#define OPTION_VAL_DON_T_REMOVE_AST NULL +#define MGBA_FRAMESKIP_LABEL_AST NULL +#define MGBA_FRAMESKIP_INFO_0_AST NULL +#define OPTION_VAL_AUTO_THRESHOLD_AST NULL +#define OPTION_VAL_FIXED_INTERVAL_AST NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_AST NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_AST NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_AST NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_AST NULL -/* 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[] = { +struct retro_core_option_v2_category option_cats_ast[] = { { - "mgba_solar_sensor_level", - "Güneş Sensörü Seviyesi", - "Ortam güneş ışığının yoğunluğunu ayarlar. Boktai serisi, kartuşlarına güneş sensörü içeren oyunlar tarafından kullanılabilir.", - { - { "sensor", "Sensörü" }, - { "0", NULL }, - { "1", NULL }, - { "2", NULL }, - { "3", NULL }, - { "4", NULL }, - { "5", NULL }, - { "6", NULL }, - { "7", NULL }, - { "8", NULL }, - { "9", NULL }, - { "10", NULL }, - { NULL, NULL }, - }, - "0" + "system", + CATEGORY_SYSTEM_LABEL_AST, + CATEGORY_SYSTEM_INFO_0_AST }, { - "mgba_allow_opposing_directions", - "Karşı Yönlü Girdiye Çıkmaya İzin Ver", - "Bunu etkinleştirmek aynı anda hem sola hem de sağa (veya yukarı ve aşağı) yönlere basma / hızlı değiştirme / tutma imkanı sağlar. Bu harekete dayalı hatalara neden olabilir.", - { - { "no", "Devre dışı bırak" }, - { "yes", "Etkileştir" }, - { NULL, NULL }, - }, - "no" + "video", + CATEGORY_VIDEO_LABEL_AST, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_AST +#else + CATEGORY_VIDEO_INFO_1_AST +#endif }, + { + "audio", + CATEGORY_AUDIO_LABEL_AST, + CATEGORY_AUDIO_INFO_0_AST + }, + { + "input", + CATEGORY_INPUT_LABEL_AST, + CATEGORY_INPUT_INFO_0_AST + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_AST, + CATEGORY_PERFORMANCE_INFO_0_AST + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ast[] = { { "mgba_gb_model", - "Game Boy Modeli (yeniden başlatma gerektirir)", - "Yüklenen içeriği belirli bir Game Boy modeliyle çalıştırır. 'Otomatik Tespit' mevcut oyun için en uygun modeli seçecektir.", + MGBA_GB_MODEL_LABEL_AST, + NULL, + MGBA_GB_MODEL_INFO_0_AST, + NULL, + "system", { - { "Autodetect", "Otomatik Tespit" }, - { "Game Boy", NULL }, - { "Super Game Boy", NULL }, - { "Game Boy Color", NULL }, - { "Game Boy Advance", NULL }, + { "Autodetect", OPTION_VAL_AUTODETECT_AST }, + { "Game Boy", OPTION_VAL_GAME_BOY_AST }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_AST }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_AST }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_AST }, { NULL, NULL }, }, "Autodetect" }, { "mgba_use_bios", - "Bulunursa BIOS Dosyasını kullanın (yeniden başlatma gerektirir)", - "RetroArch'ın sistem dizininde varsa, öykünülmüş donanım için resmi BIOS/önyükleyici kullanır.", + MGBA_USE_BIOS_LABEL_AST, + NULL, + MGBA_USE_BIOS_INFO_0_AST, + NULL, + "system", { - { "ON", "AÇIK" }, - { "OFF", "KAPALI" }, + { "ON", "enabled" }, + { "OFF", "disabled" }, { NULL, NULL }, }, "ON" }, { "mgba_skip_bios", - "BIOS Girişini Atla (yeniden başlatma gerektirir)", - "Resmi bir BIOS / önyükleyici kullanırken, başlangıç logosu animasyonunu atlayın. Bu ayar, 'Bulunursa BIOS Dosyasını Kullan' devre dışı bırakıldığında geçersiz sayılır.", + MGBA_SKIP_BIOS_LABEL_AST, + NULL, + MGBA_SKIP_BIOS_INFO_0_AST, + NULL, + "system", { - { "OFF", "HAYIR" }, - { "ON", "AÇIK" }, + { "OFF", "disabled" }, + { "ON", "enabled" }, { NULL, NULL }, }, "OFF" }, { - "mgba_sgb_borders", - "Super Game Boy Sınırlarını kullanın (yeniden başlatma gerekir)", - "Super Game Boy gelişmiş oyunlarını çalıştırırken Super Game Boy sınırlarını görüntüleR.", + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_AST, + NULL, + MGBA_GB_COLORS_INFO_0_AST, + NULL, + "video", { - { "ON", "AÇIK" }, - { "OFF", "KAPALI" }, + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_AST }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_AST, + NULL, + MGBA_SGB_BORDERS_INFO_0_AST, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, { NULL, NULL }, }, "ON" }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_AST, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_AST, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_AST }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_AST }, + { "Auto", OPTION_VAL_AUTO_AST }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_AST, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_AST, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_AST }, + { "mix_smart", OPTION_VAL_MIX_SMART_AST }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_AST }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_AST }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_AST, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_AST, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_AST, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_AST, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_AST, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_AST, + NULL, + "audio", + { + { "5", OPTION_VAL_5_AST }, + { "10", OPTION_VAL_10_AST }, + { "15", OPTION_VAL_15_AST }, + { "20", OPTION_VAL_20_AST }, + { "25", OPTION_VAL_25_AST }, + { "30", OPTION_VAL_30_AST }, + { "35", OPTION_VAL_35_AST }, + { "40", OPTION_VAL_40_AST }, + { "45", OPTION_VAL_45_AST }, + { "50", OPTION_VAL_50_AST }, + { "55", OPTION_VAL_55_AST }, + { "60", OPTION_VAL_60_AST }, + { "65", OPTION_VAL_65_AST }, + { "70", OPTION_VAL_70_AST }, + { "75", OPTION_VAL_75_AST }, + { "80", OPTION_VAL_80_AST }, + { "85", OPTION_VAL_85_AST }, + { "90", OPTION_VAL_90_AST }, + { "95", OPTION_VAL_95_AST }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_AST, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_AST, + NULL, + "input", + { + { "no", OPTION_VAL_NO_AST }, + { "yes", OPTION_VAL_YES_AST }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_AST, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_AST, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_AST }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_AST, + NULL, + MGBA_FORCE_GBP_INFO_0_AST, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, { "mgba_idle_optimization", - "Boşta Döngü Kaldırma", - "'Boşta döngüler' denilen sistemi optimize ederek sistem yükünü azaltın - hiçbir şeyin olmadığı koddaki bölümler için, CPU tam hızda çalıştırır (boşa dönen bir araba gibi). Performansı arttırır ve düşük kaliteli donanımlarda etkinleştirilmesi gerekir.", + MGBA_IDLE_OPTIMIZATION_LABEL_AST, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_AST, + NULL, + "performance", { - { "Remove Known", "Bilinenleri Kaldır" }, - { "Detect and Remove", "Algıla ve Kaldır" }, - { "Don't Remove", "Kaldırma" }, + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_AST }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_AST }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_AST }, { NULL, NULL }, }, "Remove Known" }, { "mgba_frameskip", - "Kare atlama", - "Görsel pürüzsüzlük pahasına performansı artırmak için çerçeveleri atlayın. Burada ayarlanan değer, bir kare oluşturulduktan sonra atlanan kare sayısıdır - yani '0' = 60fps, '1' = 30fps, '2' = 15fps, vb.", + MGBA_FRAMESKIP_LABEL_AST, + NULL, + MGBA_FRAMESKIP_INFO_0_AST, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_AST }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_AST }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_AST }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_AST, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_AST, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_AST, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_AST, + NULL, + "performance", { { "0", NULL }, { "1", NULL }, @@ -314,26 +856,14471 @@ struct retro_core_option_definition option_defs_tr[] = { }, "0" }, + { 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 CATEGORY_SYSTEM_LABEL_CA NULL +#define CATEGORY_SYSTEM_INFO_0_CA NULL +#define CATEGORY_VIDEO_LABEL_CA NULL +#define CATEGORY_VIDEO_INFO_0_CA NULL +#define CATEGORY_VIDEO_INFO_1_CA NULL +#define CATEGORY_AUDIO_LABEL_CA NULL +#define CATEGORY_AUDIO_INFO_0_CA NULL +#define CATEGORY_INPUT_LABEL_CA NULL +#define CATEGORY_INPUT_INFO_0_CA NULL +#define CATEGORY_PERFORMANCE_LABEL_CA NULL +#define CATEGORY_PERFORMANCE_INFO_0_CA NULL +#define MGBA_GB_MODEL_LABEL_CA NULL +#define MGBA_GB_MODEL_INFO_0_CA NULL +#define OPTION_VAL_AUTODETECT_CA NULL +#define OPTION_VAL_GAME_BOY_CA NULL +#define OPTION_VAL_SUPER_GAME_BOY_CA NULL +#define OPTION_VAL_GAME_BOY_COLOR_CA NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_CA NULL +#define MGBA_USE_BIOS_LABEL_CA NULL +#define MGBA_USE_BIOS_INFO_0_CA NULL +#define MGBA_SKIP_BIOS_LABEL_CA NULL +#define MGBA_SKIP_BIOS_INFO_0_CA NULL +#define MGBA_GB_COLORS_LABEL_CA NULL +#define MGBA_GB_COLORS_INFO_0_CA NULL +#define OPTION_VAL_GRAYSCALE_CA NULL +#define MGBA_SGB_BORDERS_LABEL_CA NULL +#define MGBA_SGB_BORDERS_INFO_0_CA NULL +#define MGBA_COLOR_CORRECTION_LABEL_CA NULL +#define MGBA_COLOR_CORRECTION_INFO_0_CA NULL +#define OPTION_VAL_AUTO_CA NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_CA NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_CA NULL +#define OPTION_VAL_MIX_CA NULL +#define OPTION_VAL_MIX_SMART_CA NULL +#define OPTION_VAL_LCD_GHOSTING_CA NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_CA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_CA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_CA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_CA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_CA NULL +#define OPTION_VAL_5_CA NULL +#define OPTION_VAL_10_CA NULL +#define OPTION_VAL_15_CA NULL +#define OPTION_VAL_20_CA NULL +#define OPTION_VAL_25_CA NULL +#define OPTION_VAL_30_CA NULL +#define OPTION_VAL_35_CA NULL +#define OPTION_VAL_40_CA NULL +#define OPTION_VAL_45_CA NULL +#define OPTION_VAL_50_CA NULL +#define OPTION_VAL_55_CA NULL +#define OPTION_VAL_60_CA NULL +#define OPTION_VAL_65_CA NULL +#define OPTION_VAL_70_CA NULL +#define OPTION_VAL_75_CA NULL +#define OPTION_VAL_80_CA NULL +#define OPTION_VAL_85_CA NULL +#define OPTION_VAL_90_CA NULL +#define OPTION_VAL_95_CA NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_CA NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_CA NULL +#define OPTION_VAL_NO_CA NULL +#define OPTION_VAL_YES_CA NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_CA NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_CA NULL +#define OPTION_VAL_SENSOR_CA NULL +#define MGBA_FORCE_GBP_LABEL_CA NULL +#define MGBA_FORCE_GBP_INFO_0_CA NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_CA NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_CA NULL +#define OPTION_VAL_REMOVE_KNOWN_CA NULL +#define OPTION_VAL_DETECT_AND_REMOVE_CA NULL +#define OPTION_VAL_DON_T_REMOVE_CA NULL +#define MGBA_FRAMESKIP_LABEL_CA NULL +#define MGBA_FRAMESKIP_INFO_0_CA NULL +#define OPTION_VAL_AUTO_THRESHOLD_CA NULL +#define OPTION_VAL_FIXED_INTERVAL_CA NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_CA NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_CA NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_CA NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_CA NULL + +struct retro_core_option_v2_category option_cats_ca[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_CA, + CATEGORY_SYSTEM_INFO_0_CA + }, + { + "video", + CATEGORY_VIDEO_LABEL_CA, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_CA +#else + CATEGORY_VIDEO_INFO_1_CA +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_CA, + CATEGORY_AUDIO_INFO_0_CA + }, + { + "input", + CATEGORY_INPUT_LABEL_CA, + CATEGORY_INPUT_INFO_0_CA + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_CA, + CATEGORY_PERFORMANCE_INFO_0_CA + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ca[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_CA, + NULL, + MGBA_GB_MODEL_INFO_0_CA, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_CA }, + { "Game Boy", OPTION_VAL_GAME_BOY_CA }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_CA }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_CA }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_CA }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_CA, + NULL, + MGBA_USE_BIOS_INFO_0_CA, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_CA, + NULL, + MGBA_SKIP_BIOS_INFO_0_CA, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_CA, + NULL, + MGBA_GB_COLORS_INFO_0_CA, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_CA }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_CA, + NULL, + MGBA_SGB_BORDERS_INFO_0_CA, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, #if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) { "mgba_color_correction", - "Renk Düzeltmesi", - "Çıktı renklerini gerçek GBA / GBC donanımının görüntüsüyle eşleşecek şekilde ayarlar.", + MGBA_COLOR_CORRECTION_LABEL_CA, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_CA, + NULL, + "video", { - { "OFF", "KAPALI" }, - { "GBA", "Game Boy Advance" }, - { "GBC", "Game Boy Color" }, - { "Auto", "Otomatik" }, + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_CA }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_CA }, + { "Auto", OPTION_VAL_AUTO_CA }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_CA, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_CA, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_CA }, + { "mix_smart", OPTION_VAL_MIX_SMART_CA }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_CA }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_CA }, { NULL, NULL }, }, "OFF" }, #endif - { NULL, NULL, NULL, {{0}}, NULL }, + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CA, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_CA, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_CA, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CA, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_CA, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_CA, + NULL, + "audio", + { + { "5", OPTION_VAL_5_CA }, + { "10", OPTION_VAL_10_CA }, + { "15", OPTION_VAL_15_CA }, + { "20", OPTION_VAL_20_CA }, + { "25", OPTION_VAL_25_CA }, + { "30", OPTION_VAL_30_CA }, + { "35", OPTION_VAL_35_CA }, + { "40", OPTION_VAL_40_CA }, + { "45", OPTION_VAL_45_CA }, + { "50", OPTION_VAL_50_CA }, + { "55", OPTION_VAL_55_CA }, + { "60", OPTION_VAL_60_CA }, + { "65", OPTION_VAL_65_CA }, + { "70", OPTION_VAL_70_CA }, + { "75", OPTION_VAL_75_CA }, + { "80", OPTION_VAL_80_CA }, + { "85", OPTION_VAL_85_CA }, + { "90", OPTION_VAL_90_CA }, + { "95", OPTION_VAL_95_CA }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_CA, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_CA, + NULL, + "input", + { + { "no", OPTION_VAL_NO_CA }, + { "yes", OPTION_VAL_YES_CA }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_CA, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_CA, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_CA }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_CA, + NULL, + MGBA_FORCE_GBP_INFO_0_CA, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_CA, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_CA, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_CA }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_CA }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_CA }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_CA, + NULL, + MGBA_FRAMESKIP_INFO_0_CA, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_CA }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_CA }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_CA }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_CA, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_CA, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_CA, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_CA, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_CHS "系统" +#define CATEGORY_SYSTEM_INFO_0_CHS NULL +#define CATEGORY_VIDEO_LABEL_CHS "视频" +#define CATEGORY_VIDEO_INFO_0_CHS NULL +#define CATEGORY_VIDEO_INFO_1_CHS NULL +#define CATEGORY_AUDIO_LABEL_CHS "音频" +#define CATEGORY_AUDIO_INFO_0_CHS NULL +#define CATEGORY_INPUT_LABEL_CHS NULL +#define CATEGORY_INPUT_INFO_0_CHS NULL +#define CATEGORY_PERFORMANCE_LABEL_CHS "性能" +#define CATEGORY_PERFORMANCE_INFO_0_CHS NULL +#define MGBA_GB_MODEL_LABEL_CHS NULL +#define MGBA_GB_MODEL_INFO_0_CHS NULL +#define OPTION_VAL_AUTODETECT_CHS "自动检测" +#define OPTION_VAL_GAME_BOY_CHS NULL +#define OPTION_VAL_SUPER_GAME_BOY_CHS NULL +#define OPTION_VAL_GAME_BOY_COLOR_CHS NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_CHS NULL +#define MGBA_USE_BIOS_LABEL_CHS NULL +#define MGBA_USE_BIOS_INFO_0_CHS NULL +#define MGBA_SKIP_BIOS_LABEL_CHS NULL +#define MGBA_SKIP_BIOS_INFO_0_CHS NULL +#define MGBA_GB_COLORS_LABEL_CHS NULL +#define MGBA_GB_COLORS_INFO_0_CHS NULL +#define OPTION_VAL_GRAYSCALE_CHS "灰阶" +#define MGBA_SGB_BORDERS_LABEL_CHS NULL +#define MGBA_SGB_BORDERS_INFO_0_CHS NULL +#define MGBA_COLOR_CORRECTION_LABEL_CHS NULL +#define MGBA_COLOR_CORRECTION_INFO_0_CHS NULL +#define OPTION_VAL_AUTO_CHS "自动" +#define MGBA_INTERFRAME_BLENDING_LABEL_CHS NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_CHS NULL +#define OPTION_VAL_MIX_CHS "简单" +#define OPTION_VAL_MIX_SMART_CHS "智能" +#define OPTION_VAL_LCD_GHOSTING_CHS NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_CHS NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CHS "音频过滤器" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_CHS "低通滤波器" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_CHS NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CHS NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_CHS NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_CHS NULL +#define OPTION_VAL_5_CHS NULL +#define OPTION_VAL_10_CHS NULL +#define OPTION_VAL_15_CHS NULL +#define OPTION_VAL_20_CHS NULL +#define OPTION_VAL_25_CHS NULL +#define OPTION_VAL_30_CHS NULL +#define OPTION_VAL_35_CHS NULL +#define OPTION_VAL_40_CHS NULL +#define OPTION_VAL_45_CHS NULL +#define OPTION_VAL_50_CHS NULL +#define OPTION_VAL_55_CHS NULL +#define OPTION_VAL_60_CHS NULL +#define OPTION_VAL_65_CHS NULL +#define OPTION_VAL_70_CHS NULL +#define OPTION_VAL_75_CHS NULL +#define OPTION_VAL_80_CHS NULL +#define OPTION_VAL_85_CHS NULL +#define OPTION_VAL_90_CHS NULL +#define OPTION_VAL_95_CHS NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_CHS NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_CHS NULL +#define OPTION_VAL_NO_CHS "否" +#define OPTION_VAL_YES_CHS NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_CHS NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_CHS NULL +#define OPTION_VAL_SENSOR_CHS NULL +#define MGBA_FORCE_GBP_LABEL_CHS NULL +#define MGBA_FORCE_GBP_INFO_0_CHS NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_CHS NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_CHS NULL +#define OPTION_VAL_REMOVE_KNOWN_CHS NULL +#define OPTION_VAL_DETECT_AND_REMOVE_CHS NULL +#define OPTION_VAL_DON_T_REMOVE_CHS NULL +#define MGBA_FRAMESKIP_LABEL_CHS "跳帧" +#define MGBA_FRAMESKIP_INFO_0_CHS NULL +#define OPTION_VAL_AUTO_THRESHOLD_CHS NULL +#define OPTION_VAL_FIXED_INTERVAL_CHS "固定间隔" +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_CHS "跳帧阈值(%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_CHS NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_CHS NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_CHS NULL + +struct retro_core_option_v2_category option_cats_chs[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_CHS, + CATEGORY_SYSTEM_INFO_0_CHS + }, + { + "video", + CATEGORY_VIDEO_LABEL_CHS, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_CHS +#else + CATEGORY_VIDEO_INFO_1_CHS +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_CHS, + CATEGORY_AUDIO_INFO_0_CHS + }, + { + "input", + CATEGORY_INPUT_LABEL_CHS, + CATEGORY_INPUT_INFO_0_CHS + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_CHS, + CATEGORY_PERFORMANCE_INFO_0_CHS + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_chs[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_CHS, + NULL, + MGBA_GB_MODEL_INFO_0_CHS, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_CHS }, + { "Game Boy", OPTION_VAL_GAME_BOY_CHS }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_CHS }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_CHS }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_CHS }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_CHS, + NULL, + MGBA_USE_BIOS_INFO_0_CHS, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_CHS, + NULL, + MGBA_SKIP_BIOS_INFO_0_CHS, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_CHS, + NULL, + MGBA_GB_COLORS_INFO_0_CHS, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_CHS }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_CHS, + NULL, + MGBA_SGB_BORDERS_INFO_0_CHS, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_CHS, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_CHS, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_CHS }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_CHS }, + { "Auto", OPTION_VAL_AUTO_CHS }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_CHS, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_CHS, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_CHS }, + { "mix_smart", OPTION_VAL_MIX_SMART_CHS }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_CHS }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_CHS }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CHS, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_CHS, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_CHS, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CHS, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_CHS, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_CHS, + NULL, + "audio", + { + { "5", OPTION_VAL_5_CHS }, + { "10", OPTION_VAL_10_CHS }, + { "15", OPTION_VAL_15_CHS }, + { "20", OPTION_VAL_20_CHS }, + { "25", OPTION_VAL_25_CHS }, + { "30", OPTION_VAL_30_CHS }, + { "35", OPTION_VAL_35_CHS }, + { "40", OPTION_VAL_40_CHS }, + { "45", OPTION_VAL_45_CHS }, + { "50", OPTION_VAL_50_CHS }, + { "55", OPTION_VAL_55_CHS }, + { "60", OPTION_VAL_60_CHS }, + { "65", OPTION_VAL_65_CHS }, + { "70", OPTION_VAL_70_CHS }, + { "75", OPTION_VAL_75_CHS }, + { "80", OPTION_VAL_80_CHS }, + { "85", OPTION_VAL_85_CHS }, + { "90", OPTION_VAL_90_CHS }, + { "95", OPTION_VAL_95_CHS }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_CHS, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_CHS, + NULL, + "input", + { + { "no", OPTION_VAL_NO_CHS }, + { "yes", OPTION_VAL_YES_CHS }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_CHS, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_CHS, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_CHS }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_CHS, + NULL, + MGBA_FORCE_GBP_INFO_0_CHS, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_CHS, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_CHS, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_CHS }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_CHS }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_CHS }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_CHS, + NULL, + MGBA_FRAMESKIP_INFO_0_CHS, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_CHS }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_CHS }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_CHS }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_CHS, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_CHS, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_CHS, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_CHS, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_CHT "系統" +#define CATEGORY_SYSTEM_INFO_0_CHT NULL +#define CATEGORY_VIDEO_LABEL_CHT "視訊" +#define CATEGORY_VIDEO_INFO_0_CHT NULL +#define CATEGORY_VIDEO_INFO_1_CHT NULL +#define CATEGORY_AUDIO_LABEL_CHT "音訊" +#define CATEGORY_AUDIO_INFO_0_CHT NULL +#define CATEGORY_INPUT_LABEL_CHT NULL +#define CATEGORY_INPUT_INFO_0_CHT NULL +#define CATEGORY_PERFORMANCE_LABEL_CHT NULL +#define CATEGORY_PERFORMANCE_INFO_0_CHT NULL +#define MGBA_GB_MODEL_LABEL_CHT NULL +#define MGBA_GB_MODEL_INFO_0_CHT NULL +#define OPTION_VAL_AUTODETECT_CHT "自動偵測" +#define OPTION_VAL_GAME_BOY_CHT NULL +#define OPTION_VAL_SUPER_GAME_BOY_CHT NULL +#define OPTION_VAL_GAME_BOY_COLOR_CHT NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_CHT NULL +#define MGBA_USE_BIOS_LABEL_CHT NULL +#define MGBA_USE_BIOS_INFO_0_CHT NULL +#define MGBA_SKIP_BIOS_LABEL_CHT NULL +#define MGBA_SKIP_BIOS_INFO_0_CHT NULL +#define MGBA_GB_COLORS_LABEL_CHT NULL +#define MGBA_GB_COLORS_INFO_0_CHT NULL +#define OPTION_VAL_GRAYSCALE_CHT NULL +#define MGBA_SGB_BORDERS_LABEL_CHT NULL +#define MGBA_SGB_BORDERS_INFO_0_CHT NULL +#define MGBA_COLOR_CORRECTION_LABEL_CHT NULL +#define MGBA_COLOR_CORRECTION_INFO_0_CHT NULL +#define OPTION_VAL_AUTO_CHT "自動" +#define MGBA_INTERFRAME_BLENDING_LABEL_CHT NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_CHT NULL +#define OPTION_VAL_MIX_CHT NULL +#define OPTION_VAL_MIX_SMART_CHT NULL +#define OPTION_VAL_LCD_GHOSTING_CHT NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_CHT NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CHT "音訊過濾器" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_CHT NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_CHT NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CHT NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_CHT NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_CHT NULL +#define OPTION_VAL_5_CHT NULL +#define OPTION_VAL_10_CHT NULL +#define OPTION_VAL_15_CHT NULL +#define OPTION_VAL_20_CHT NULL +#define OPTION_VAL_25_CHT NULL +#define OPTION_VAL_30_CHT NULL +#define OPTION_VAL_35_CHT NULL +#define OPTION_VAL_40_CHT NULL +#define OPTION_VAL_45_CHT NULL +#define OPTION_VAL_50_CHT NULL +#define OPTION_VAL_55_CHT NULL +#define OPTION_VAL_60_CHT NULL +#define OPTION_VAL_65_CHT NULL +#define OPTION_VAL_70_CHT NULL +#define OPTION_VAL_75_CHT NULL +#define OPTION_VAL_80_CHT NULL +#define OPTION_VAL_85_CHT NULL +#define OPTION_VAL_90_CHT NULL +#define OPTION_VAL_95_CHT NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_CHT NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_CHT NULL +#define OPTION_VAL_NO_CHT "否" +#define OPTION_VAL_YES_CHT "是" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_CHT NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_CHT NULL +#define OPTION_VAL_SENSOR_CHT NULL +#define MGBA_FORCE_GBP_LABEL_CHT NULL +#define MGBA_FORCE_GBP_INFO_0_CHT NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_CHT NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_CHT NULL +#define OPTION_VAL_REMOVE_KNOWN_CHT NULL +#define OPTION_VAL_DETECT_AND_REMOVE_CHT NULL +#define OPTION_VAL_DON_T_REMOVE_CHT NULL +#define MGBA_FRAMESKIP_LABEL_CHT NULL +#define MGBA_FRAMESKIP_INFO_0_CHT NULL +#define OPTION_VAL_AUTO_THRESHOLD_CHT NULL +#define OPTION_VAL_FIXED_INTERVAL_CHT NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_CHT NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_CHT NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_CHT NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_CHT NULL + +struct retro_core_option_v2_category option_cats_cht[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_CHT, + CATEGORY_SYSTEM_INFO_0_CHT + }, + { + "video", + CATEGORY_VIDEO_LABEL_CHT, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_CHT +#else + CATEGORY_VIDEO_INFO_1_CHT +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_CHT, + CATEGORY_AUDIO_INFO_0_CHT + }, + { + "input", + CATEGORY_INPUT_LABEL_CHT, + CATEGORY_INPUT_INFO_0_CHT + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_CHT, + CATEGORY_PERFORMANCE_INFO_0_CHT + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_cht[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_CHT, + NULL, + MGBA_GB_MODEL_INFO_0_CHT, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_CHT }, + { "Game Boy", OPTION_VAL_GAME_BOY_CHT }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_CHT }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_CHT }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_CHT }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_CHT, + NULL, + MGBA_USE_BIOS_INFO_0_CHT, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_CHT, + NULL, + MGBA_SKIP_BIOS_INFO_0_CHT, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_CHT, + NULL, + MGBA_GB_COLORS_INFO_0_CHT, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_CHT }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_CHT, + NULL, + MGBA_SGB_BORDERS_INFO_0_CHT, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_CHT, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_CHT, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_CHT }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_CHT }, + { "Auto", OPTION_VAL_AUTO_CHT }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_CHT, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_CHT, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_CHT }, + { "mix_smart", OPTION_VAL_MIX_SMART_CHT }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_CHT }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_CHT }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CHT, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_CHT, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_CHT, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CHT, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_CHT, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_CHT, + NULL, + "audio", + { + { "5", OPTION_VAL_5_CHT }, + { "10", OPTION_VAL_10_CHT }, + { "15", OPTION_VAL_15_CHT }, + { "20", OPTION_VAL_20_CHT }, + { "25", OPTION_VAL_25_CHT }, + { "30", OPTION_VAL_30_CHT }, + { "35", OPTION_VAL_35_CHT }, + { "40", OPTION_VAL_40_CHT }, + { "45", OPTION_VAL_45_CHT }, + { "50", OPTION_VAL_50_CHT }, + { "55", OPTION_VAL_55_CHT }, + { "60", OPTION_VAL_60_CHT }, + { "65", OPTION_VAL_65_CHT }, + { "70", OPTION_VAL_70_CHT }, + { "75", OPTION_VAL_75_CHT }, + { "80", OPTION_VAL_80_CHT }, + { "85", OPTION_VAL_85_CHT }, + { "90", OPTION_VAL_90_CHT }, + { "95", OPTION_VAL_95_CHT }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_CHT, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_CHT, + NULL, + "input", + { + { "no", OPTION_VAL_NO_CHT }, + { "yes", OPTION_VAL_YES_CHT }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_CHT, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_CHT, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_CHT }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_CHT, + NULL, + MGBA_FORCE_GBP_INFO_0_CHT, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_CHT, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_CHT, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_CHT }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_CHT }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_CHT }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_CHT, + NULL, + MGBA_FRAMESKIP_INFO_0_CHT, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_CHT }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_CHT }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_CHT }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_CHT, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_CHT, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_CHT, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_CHT, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_CS NULL +#define CATEGORY_SYSTEM_INFO_0_CS NULL +#define CATEGORY_VIDEO_LABEL_CS NULL +#define CATEGORY_VIDEO_INFO_0_CS NULL +#define CATEGORY_VIDEO_INFO_1_CS NULL +#define CATEGORY_AUDIO_LABEL_CS "Zvuk" +#define CATEGORY_AUDIO_INFO_0_CS NULL +#define CATEGORY_INPUT_LABEL_CS NULL +#define CATEGORY_INPUT_INFO_0_CS NULL +#define CATEGORY_PERFORMANCE_LABEL_CS NULL +#define CATEGORY_PERFORMANCE_INFO_0_CS NULL +#define MGBA_GB_MODEL_LABEL_CS NULL +#define MGBA_GB_MODEL_INFO_0_CS NULL +#define OPTION_VAL_AUTODETECT_CS NULL +#define OPTION_VAL_GAME_BOY_CS NULL +#define OPTION_VAL_SUPER_GAME_BOY_CS NULL +#define OPTION_VAL_GAME_BOY_COLOR_CS NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_CS NULL +#define MGBA_USE_BIOS_LABEL_CS NULL +#define MGBA_USE_BIOS_INFO_0_CS NULL +#define MGBA_SKIP_BIOS_LABEL_CS NULL +#define MGBA_SKIP_BIOS_INFO_0_CS NULL +#define MGBA_GB_COLORS_LABEL_CS NULL +#define MGBA_GB_COLORS_INFO_0_CS NULL +#define OPTION_VAL_GRAYSCALE_CS NULL +#define MGBA_SGB_BORDERS_LABEL_CS NULL +#define MGBA_SGB_BORDERS_INFO_0_CS NULL +#define MGBA_COLOR_CORRECTION_LABEL_CS NULL +#define MGBA_COLOR_CORRECTION_INFO_0_CS NULL +#define OPTION_VAL_AUTO_CS NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_CS NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_CS NULL +#define OPTION_VAL_MIX_CS NULL +#define OPTION_VAL_MIX_SMART_CS NULL +#define OPTION_VAL_LCD_GHOSTING_CS NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_CS NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CS NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_CS NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_CS NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CS NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_CS NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_CS NULL +#define OPTION_VAL_5_CS NULL +#define OPTION_VAL_10_CS NULL +#define OPTION_VAL_15_CS NULL +#define OPTION_VAL_20_CS NULL +#define OPTION_VAL_25_CS NULL +#define OPTION_VAL_30_CS NULL +#define OPTION_VAL_35_CS NULL +#define OPTION_VAL_40_CS NULL +#define OPTION_VAL_45_CS NULL +#define OPTION_VAL_50_CS NULL +#define OPTION_VAL_55_CS NULL +#define OPTION_VAL_60_CS NULL +#define OPTION_VAL_65_CS NULL +#define OPTION_VAL_70_CS NULL +#define OPTION_VAL_75_CS NULL +#define OPTION_VAL_80_CS NULL +#define OPTION_VAL_85_CS NULL +#define OPTION_VAL_90_CS NULL +#define OPTION_VAL_95_CS NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_CS NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_CS NULL +#define OPTION_VAL_NO_CS NULL +#define OPTION_VAL_YES_CS NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_CS NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_CS NULL +#define OPTION_VAL_SENSOR_CS NULL +#define MGBA_FORCE_GBP_LABEL_CS NULL +#define MGBA_FORCE_GBP_INFO_0_CS NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_CS NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_CS NULL +#define OPTION_VAL_REMOVE_KNOWN_CS NULL +#define OPTION_VAL_DETECT_AND_REMOVE_CS NULL +#define OPTION_VAL_DON_T_REMOVE_CS NULL +#define MGBA_FRAMESKIP_LABEL_CS NULL +#define MGBA_FRAMESKIP_INFO_0_CS NULL +#define OPTION_VAL_AUTO_THRESHOLD_CS NULL +#define OPTION_VAL_FIXED_INTERVAL_CS NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_CS NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_CS NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_CS NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_CS NULL + +struct retro_core_option_v2_category option_cats_cs[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_CS, + CATEGORY_SYSTEM_INFO_0_CS + }, + { + "video", + CATEGORY_VIDEO_LABEL_CS, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_CS +#else + CATEGORY_VIDEO_INFO_1_CS +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_CS, + CATEGORY_AUDIO_INFO_0_CS + }, + { + "input", + CATEGORY_INPUT_LABEL_CS, + CATEGORY_INPUT_INFO_0_CS + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_CS, + CATEGORY_PERFORMANCE_INFO_0_CS + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_cs[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_CS, + NULL, + MGBA_GB_MODEL_INFO_0_CS, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_CS }, + { "Game Boy", OPTION_VAL_GAME_BOY_CS }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_CS }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_CS }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_CS }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_CS, + NULL, + MGBA_USE_BIOS_INFO_0_CS, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_CS, + NULL, + MGBA_SKIP_BIOS_INFO_0_CS, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_CS, + NULL, + MGBA_GB_COLORS_INFO_0_CS, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_CS }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_CS, + NULL, + MGBA_SGB_BORDERS_INFO_0_CS, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_CS, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_CS, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_CS }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_CS }, + { "Auto", OPTION_VAL_AUTO_CS }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_CS, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_CS, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_CS }, + { "mix_smart", OPTION_VAL_MIX_SMART_CS }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_CS }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_CS }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CS, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_CS, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_CS, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CS, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_CS, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_CS, + NULL, + "audio", + { + { "5", OPTION_VAL_5_CS }, + { "10", OPTION_VAL_10_CS }, + { "15", OPTION_VAL_15_CS }, + { "20", OPTION_VAL_20_CS }, + { "25", OPTION_VAL_25_CS }, + { "30", OPTION_VAL_30_CS }, + { "35", OPTION_VAL_35_CS }, + { "40", OPTION_VAL_40_CS }, + { "45", OPTION_VAL_45_CS }, + { "50", OPTION_VAL_50_CS }, + { "55", OPTION_VAL_55_CS }, + { "60", OPTION_VAL_60_CS }, + { "65", OPTION_VAL_65_CS }, + { "70", OPTION_VAL_70_CS }, + { "75", OPTION_VAL_75_CS }, + { "80", OPTION_VAL_80_CS }, + { "85", OPTION_VAL_85_CS }, + { "90", OPTION_VAL_90_CS }, + { "95", OPTION_VAL_95_CS }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_CS, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_CS, + NULL, + "input", + { + { "no", OPTION_VAL_NO_CS }, + { "yes", OPTION_VAL_YES_CS }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_CS, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_CS, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_CS }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_CS, + NULL, + MGBA_FORCE_GBP_INFO_0_CS, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_CS, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_CS, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_CS }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_CS }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_CS }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_CS, + NULL, + MGBA_FRAMESKIP_INFO_0_CS, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_CS }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_CS }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_CS }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_CS, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_CS, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_CS, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_CS, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_CY NULL +#define CATEGORY_SYSTEM_INFO_0_CY NULL +#define CATEGORY_VIDEO_LABEL_CY NULL +#define CATEGORY_VIDEO_INFO_0_CY NULL +#define CATEGORY_VIDEO_INFO_1_CY NULL +#define CATEGORY_AUDIO_LABEL_CY NULL +#define CATEGORY_AUDIO_INFO_0_CY NULL +#define CATEGORY_INPUT_LABEL_CY NULL +#define CATEGORY_INPUT_INFO_0_CY NULL +#define CATEGORY_PERFORMANCE_LABEL_CY NULL +#define CATEGORY_PERFORMANCE_INFO_0_CY NULL +#define MGBA_GB_MODEL_LABEL_CY NULL +#define MGBA_GB_MODEL_INFO_0_CY NULL +#define OPTION_VAL_AUTODETECT_CY NULL +#define OPTION_VAL_GAME_BOY_CY NULL +#define OPTION_VAL_SUPER_GAME_BOY_CY NULL +#define OPTION_VAL_GAME_BOY_COLOR_CY NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_CY NULL +#define MGBA_USE_BIOS_LABEL_CY NULL +#define MGBA_USE_BIOS_INFO_0_CY NULL +#define MGBA_SKIP_BIOS_LABEL_CY NULL +#define MGBA_SKIP_BIOS_INFO_0_CY NULL +#define MGBA_GB_COLORS_LABEL_CY NULL +#define MGBA_GB_COLORS_INFO_0_CY NULL +#define OPTION_VAL_GRAYSCALE_CY NULL +#define MGBA_SGB_BORDERS_LABEL_CY NULL +#define MGBA_SGB_BORDERS_INFO_0_CY NULL +#define MGBA_COLOR_CORRECTION_LABEL_CY NULL +#define MGBA_COLOR_CORRECTION_INFO_0_CY NULL +#define OPTION_VAL_AUTO_CY NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_CY NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_CY NULL +#define OPTION_VAL_MIX_CY NULL +#define OPTION_VAL_MIX_SMART_CY NULL +#define OPTION_VAL_LCD_GHOSTING_CY NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_CY NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CY NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_CY NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_CY NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CY NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_CY NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_CY NULL +#define OPTION_VAL_5_CY NULL +#define OPTION_VAL_10_CY NULL +#define OPTION_VAL_15_CY NULL +#define OPTION_VAL_20_CY NULL +#define OPTION_VAL_25_CY NULL +#define OPTION_VAL_30_CY NULL +#define OPTION_VAL_35_CY NULL +#define OPTION_VAL_40_CY NULL +#define OPTION_VAL_45_CY NULL +#define OPTION_VAL_50_CY NULL +#define OPTION_VAL_55_CY NULL +#define OPTION_VAL_60_CY NULL +#define OPTION_VAL_65_CY NULL +#define OPTION_VAL_70_CY NULL +#define OPTION_VAL_75_CY NULL +#define OPTION_VAL_80_CY NULL +#define OPTION_VAL_85_CY NULL +#define OPTION_VAL_90_CY NULL +#define OPTION_VAL_95_CY NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_CY NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_CY NULL +#define OPTION_VAL_NO_CY "na" +#define OPTION_VAL_YES_CY "ie" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_CY NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_CY NULL +#define OPTION_VAL_SENSOR_CY NULL +#define MGBA_FORCE_GBP_LABEL_CY NULL +#define MGBA_FORCE_GBP_INFO_0_CY NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_CY NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_CY NULL +#define OPTION_VAL_REMOVE_KNOWN_CY NULL +#define OPTION_VAL_DETECT_AND_REMOVE_CY NULL +#define OPTION_VAL_DON_T_REMOVE_CY NULL +#define MGBA_FRAMESKIP_LABEL_CY NULL +#define MGBA_FRAMESKIP_INFO_0_CY NULL +#define OPTION_VAL_AUTO_THRESHOLD_CY NULL +#define OPTION_VAL_FIXED_INTERVAL_CY NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_CY NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_CY NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_CY NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_CY NULL + +struct retro_core_option_v2_category option_cats_cy[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_CY, + CATEGORY_SYSTEM_INFO_0_CY + }, + { + "video", + CATEGORY_VIDEO_LABEL_CY, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_CY +#else + CATEGORY_VIDEO_INFO_1_CY +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_CY, + CATEGORY_AUDIO_INFO_0_CY + }, + { + "input", + CATEGORY_INPUT_LABEL_CY, + CATEGORY_INPUT_INFO_0_CY + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_CY, + CATEGORY_PERFORMANCE_INFO_0_CY + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_cy[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_CY, + NULL, + MGBA_GB_MODEL_INFO_0_CY, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_CY }, + { "Game Boy", OPTION_VAL_GAME_BOY_CY }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_CY }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_CY }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_CY }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_CY, + NULL, + MGBA_USE_BIOS_INFO_0_CY, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_CY, + NULL, + MGBA_SKIP_BIOS_INFO_0_CY, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_CY, + NULL, + MGBA_GB_COLORS_INFO_0_CY, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_CY }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_CY, + NULL, + MGBA_SGB_BORDERS_INFO_0_CY, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_CY, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_CY, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_CY }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_CY }, + { "Auto", OPTION_VAL_AUTO_CY }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_CY, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_CY, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_CY }, + { "mix_smart", OPTION_VAL_MIX_SMART_CY }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_CY }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_CY }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CY, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_CY, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_CY, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CY, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_CY, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_CY, + NULL, + "audio", + { + { "5", OPTION_VAL_5_CY }, + { "10", OPTION_VAL_10_CY }, + { "15", OPTION_VAL_15_CY }, + { "20", OPTION_VAL_20_CY }, + { "25", OPTION_VAL_25_CY }, + { "30", OPTION_VAL_30_CY }, + { "35", OPTION_VAL_35_CY }, + { "40", OPTION_VAL_40_CY }, + { "45", OPTION_VAL_45_CY }, + { "50", OPTION_VAL_50_CY }, + { "55", OPTION_VAL_55_CY }, + { "60", OPTION_VAL_60_CY }, + { "65", OPTION_VAL_65_CY }, + { "70", OPTION_VAL_70_CY }, + { "75", OPTION_VAL_75_CY }, + { "80", OPTION_VAL_80_CY }, + { "85", OPTION_VAL_85_CY }, + { "90", OPTION_VAL_90_CY }, + { "95", OPTION_VAL_95_CY }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_CY, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_CY, + NULL, + "input", + { + { "no", OPTION_VAL_NO_CY }, + { "yes", OPTION_VAL_YES_CY }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_CY, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_CY, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_CY }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_CY, + NULL, + MGBA_FORCE_GBP_INFO_0_CY, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_CY, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_CY, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_CY }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_CY }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_CY }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_CY, + NULL, + MGBA_FRAMESKIP_INFO_0_CY, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_CY }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_CY }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_CY }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_CY, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_CY, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_CY, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_CY, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_DA NULL +#define CATEGORY_SYSTEM_INFO_0_DA NULL +#define CATEGORY_VIDEO_LABEL_DA NULL +#define CATEGORY_VIDEO_INFO_0_DA NULL +#define CATEGORY_VIDEO_INFO_1_DA NULL +#define CATEGORY_AUDIO_LABEL_DA "Lyd" +#define CATEGORY_AUDIO_INFO_0_DA NULL +#define CATEGORY_INPUT_LABEL_DA NULL +#define CATEGORY_INPUT_INFO_0_DA NULL +#define CATEGORY_PERFORMANCE_LABEL_DA NULL +#define CATEGORY_PERFORMANCE_INFO_0_DA NULL +#define MGBA_GB_MODEL_LABEL_DA NULL +#define MGBA_GB_MODEL_INFO_0_DA NULL +#define OPTION_VAL_AUTODETECT_DA NULL +#define OPTION_VAL_GAME_BOY_DA NULL +#define OPTION_VAL_SUPER_GAME_BOY_DA NULL +#define OPTION_VAL_GAME_BOY_COLOR_DA NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_DA NULL +#define MGBA_USE_BIOS_LABEL_DA NULL +#define MGBA_USE_BIOS_INFO_0_DA NULL +#define MGBA_SKIP_BIOS_LABEL_DA NULL +#define MGBA_SKIP_BIOS_INFO_0_DA NULL +#define MGBA_GB_COLORS_LABEL_DA NULL +#define MGBA_GB_COLORS_INFO_0_DA NULL +#define OPTION_VAL_GRAYSCALE_DA NULL +#define MGBA_SGB_BORDERS_LABEL_DA NULL +#define MGBA_SGB_BORDERS_INFO_0_DA NULL +#define MGBA_COLOR_CORRECTION_LABEL_DA NULL +#define MGBA_COLOR_CORRECTION_INFO_0_DA NULL +#define OPTION_VAL_AUTO_DA NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_DA NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_DA NULL +#define OPTION_VAL_MIX_DA NULL +#define OPTION_VAL_MIX_SMART_DA NULL +#define OPTION_VAL_LCD_GHOSTING_DA NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_DA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_DA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_DA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_DA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_DA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_DA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_DA NULL +#define OPTION_VAL_5_DA NULL +#define OPTION_VAL_10_DA NULL +#define OPTION_VAL_15_DA NULL +#define OPTION_VAL_20_DA NULL +#define OPTION_VAL_25_DA NULL +#define OPTION_VAL_30_DA NULL +#define OPTION_VAL_35_DA NULL +#define OPTION_VAL_40_DA NULL +#define OPTION_VAL_45_DA NULL +#define OPTION_VAL_50_DA NULL +#define OPTION_VAL_55_DA NULL +#define OPTION_VAL_60_DA NULL +#define OPTION_VAL_65_DA NULL +#define OPTION_VAL_70_DA NULL +#define OPTION_VAL_75_DA NULL +#define OPTION_VAL_80_DA NULL +#define OPTION_VAL_85_DA NULL +#define OPTION_VAL_90_DA NULL +#define OPTION_VAL_95_DA NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_DA NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_DA NULL +#define OPTION_VAL_NO_DA NULL +#define OPTION_VAL_YES_DA NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_DA NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_DA NULL +#define OPTION_VAL_SENSOR_DA NULL +#define MGBA_FORCE_GBP_LABEL_DA NULL +#define MGBA_FORCE_GBP_INFO_0_DA NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_DA NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_DA NULL +#define OPTION_VAL_REMOVE_KNOWN_DA NULL +#define OPTION_VAL_DETECT_AND_REMOVE_DA NULL +#define OPTION_VAL_DON_T_REMOVE_DA NULL +#define MGBA_FRAMESKIP_LABEL_DA NULL +#define MGBA_FRAMESKIP_INFO_0_DA NULL +#define OPTION_VAL_AUTO_THRESHOLD_DA NULL +#define OPTION_VAL_FIXED_INTERVAL_DA NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_DA NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_DA NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_DA NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_DA NULL + +struct retro_core_option_v2_category option_cats_da[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_DA, + CATEGORY_SYSTEM_INFO_0_DA + }, + { + "video", + CATEGORY_VIDEO_LABEL_DA, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_DA +#else + CATEGORY_VIDEO_INFO_1_DA +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_DA, + CATEGORY_AUDIO_INFO_0_DA + }, + { + "input", + CATEGORY_INPUT_LABEL_DA, + CATEGORY_INPUT_INFO_0_DA + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_DA, + CATEGORY_PERFORMANCE_INFO_0_DA + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_da[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_DA, + NULL, + MGBA_GB_MODEL_INFO_0_DA, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_DA }, + { "Game Boy", OPTION_VAL_GAME_BOY_DA }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_DA }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_DA }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_DA }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_DA, + NULL, + MGBA_USE_BIOS_INFO_0_DA, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_DA, + NULL, + MGBA_SKIP_BIOS_INFO_0_DA, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_DA, + NULL, + MGBA_GB_COLORS_INFO_0_DA, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_DA }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_DA, + NULL, + MGBA_SGB_BORDERS_INFO_0_DA, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_DA, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_DA, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_DA }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_DA }, + { "Auto", OPTION_VAL_AUTO_DA }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_DA, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_DA, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_DA }, + { "mix_smart", OPTION_VAL_MIX_SMART_DA }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_DA }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_DA }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_DA, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_DA, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_DA, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_DA, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_DA, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_DA, + NULL, + "audio", + { + { "5", OPTION_VAL_5_DA }, + { "10", OPTION_VAL_10_DA }, + { "15", OPTION_VAL_15_DA }, + { "20", OPTION_VAL_20_DA }, + { "25", OPTION_VAL_25_DA }, + { "30", OPTION_VAL_30_DA }, + { "35", OPTION_VAL_35_DA }, + { "40", OPTION_VAL_40_DA }, + { "45", OPTION_VAL_45_DA }, + { "50", OPTION_VAL_50_DA }, + { "55", OPTION_VAL_55_DA }, + { "60", OPTION_VAL_60_DA }, + { "65", OPTION_VAL_65_DA }, + { "70", OPTION_VAL_70_DA }, + { "75", OPTION_VAL_75_DA }, + { "80", OPTION_VAL_80_DA }, + { "85", OPTION_VAL_85_DA }, + { "90", OPTION_VAL_90_DA }, + { "95", OPTION_VAL_95_DA }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_DA, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_DA, + NULL, + "input", + { + { "no", OPTION_VAL_NO_DA }, + { "yes", OPTION_VAL_YES_DA }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_DA, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_DA, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_DA }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_DA, + NULL, + MGBA_FORCE_GBP_INFO_0_DA, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_DA, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_DA, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_DA }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_DA }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_DA }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_DA, + NULL, + MGBA_FRAMESKIP_INFO_0_DA, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_DA }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_DA }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_DA }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_DA, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_DA, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_DA, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_DA, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_DE NULL +#define CATEGORY_SYSTEM_INFO_0_DE NULL +#define CATEGORY_VIDEO_LABEL_DE NULL +#define CATEGORY_VIDEO_INFO_0_DE NULL +#define CATEGORY_VIDEO_INFO_1_DE NULL +#define CATEGORY_AUDIO_LABEL_DE NULL +#define CATEGORY_AUDIO_INFO_0_DE "Audiofilterung konfigurieren." +#define CATEGORY_INPUT_LABEL_DE "Eingabe- und Hilfsgeräte" +#define CATEGORY_INPUT_INFO_0_DE NULL +#define CATEGORY_PERFORMANCE_LABEL_DE "Leistung" +#define CATEGORY_PERFORMANCE_INFO_0_DE NULL +#define MGBA_GB_MODEL_LABEL_DE NULL +#define MGBA_GB_MODEL_INFO_0_DE NULL +#define OPTION_VAL_AUTODETECT_DE "Automatisch erkennen" +#define OPTION_VAL_GAME_BOY_DE NULL +#define OPTION_VAL_SUPER_GAME_BOY_DE NULL +#define OPTION_VAL_GAME_BOY_COLOR_DE NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_DE NULL +#define MGBA_USE_BIOS_LABEL_DE NULL +#define MGBA_USE_BIOS_INFO_0_DE NULL +#define MGBA_SKIP_BIOS_LABEL_DE NULL +#define MGBA_SKIP_BIOS_INFO_0_DE NULL +#define MGBA_GB_COLORS_LABEL_DE NULL +#define MGBA_GB_COLORS_INFO_0_DE NULL +#define OPTION_VAL_GRAYSCALE_DE "Graustufen" +#define MGBA_SGB_BORDERS_LABEL_DE NULL +#define MGBA_SGB_BORDERS_INFO_0_DE NULL +#define MGBA_COLOR_CORRECTION_LABEL_DE "Farbkorrektur" +#define MGBA_COLOR_CORRECTION_INFO_0_DE NULL +#define OPTION_VAL_AUTO_DE "Automatisch" +#define MGBA_INTERFRAME_BLENDING_LABEL_DE NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_DE NULL +#define OPTION_VAL_MIX_DE "Einfach" +#define OPTION_VAL_MIX_SMART_DE NULL +#define OPTION_VAL_LCD_GHOSTING_DE NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_DE NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_DE "Audiofilter" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_DE "Tiefpassfilter" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_DE NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_DE "Audiofilterstufe" +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_DE "Filterstufe" +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_DE NULL +#define OPTION_VAL_5_DE "5 %" +#define OPTION_VAL_10_DE "10 %" +#define OPTION_VAL_15_DE "15 %" +#define OPTION_VAL_20_DE "20 %" +#define OPTION_VAL_25_DE "25 %" +#define OPTION_VAL_30_DE "30 %" +#define OPTION_VAL_35_DE "35 %" +#define OPTION_VAL_40_DE "40 %" +#define OPTION_VAL_45_DE "45 %" +#define OPTION_VAL_50_DE "50 %" +#define OPTION_VAL_55_DE "55 %" +#define OPTION_VAL_60_DE "60 %" +#define OPTION_VAL_65_DE "65 %" +#define OPTION_VAL_70_DE "70 %" +#define OPTION_VAL_75_DE "75 %" +#define OPTION_VAL_80_DE "80 %" +#define OPTION_VAL_85_DE "85 %" +#define OPTION_VAL_90_DE "90 %" +#define OPTION_VAL_95_DE "95 %" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_DE NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_DE NULL +#define OPTION_VAL_NO_DE "Nein" +#define OPTION_VAL_YES_DE "Ja" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_DE NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_DE NULL +#define OPTION_VAL_SENSOR_DE NULL +#define MGBA_FORCE_GBP_LABEL_DE NULL +#define MGBA_FORCE_GBP_INFO_0_DE NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_DE NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_DE NULL +#define OPTION_VAL_REMOVE_KNOWN_DE NULL +#define OPTION_VAL_DETECT_AND_REMOVE_DE NULL +#define OPTION_VAL_DON_T_REMOVE_DE "Nicht entfernen" +#define MGBA_FRAMESKIP_LABEL_DE NULL +#define MGBA_FRAMESKIP_INFO_0_DE NULL +#define OPTION_VAL_AUTO_THRESHOLD_DE "Automatisch (Schwellenwert)" +#define OPTION_VAL_FIXED_INTERVAL_DE "Festes Intervall" +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_DE "Frameskip Grenzwert (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_DE NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_DE NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_DE NULL + +struct retro_core_option_v2_category option_cats_de[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_DE, + CATEGORY_SYSTEM_INFO_0_DE + }, + { + "video", + CATEGORY_VIDEO_LABEL_DE, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_DE +#else + CATEGORY_VIDEO_INFO_1_DE +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_DE, + CATEGORY_AUDIO_INFO_0_DE + }, + { + "input", + CATEGORY_INPUT_LABEL_DE, + CATEGORY_INPUT_INFO_0_DE + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_DE, + CATEGORY_PERFORMANCE_INFO_0_DE + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_de[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_DE, + NULL, + MGBA_GB_MODEL_INFO_0_DE, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_DE }, + { "Game Boy", OPTION_VAL_GAME_BOY_DE }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_DE }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_DE }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_DE }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_DE, + NULL, + MGBA_USE_BIOS_INFO_0_DE, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_DE, + NULL, + MGBA_SKIP_BIOS_INFO_0_DE, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_DE, + NULL, + MGBA_GB_COLORS_INFO_0_DE, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_DE }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_DE, + NULL, + MGBA_SGB_BORDERS_INFO_0_DE, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_DE, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_DE, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_DE }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_DE }, + { "Auto", OPTION_VAL_AUTO_DE }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_DE, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_DE, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_DE }, + { "mix_smart", OPTION_VAL_MIX_SMART_DE }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_DE }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_DE }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_DE, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_DE, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_DE, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_DE, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_DE, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_DE, + NULL, + "audio", + { + { "5", OPTION_VAL_5_DE }, + { "10", OPTION_VAL_10_DE }, + { "15", OPTION_VAL_15_DE }, + { "20", OPTION_VAL_20_DE }, + { "25", OPTION_VAL_25_DE }, + { "30", OPTION_VAL_30_DE }, + { "35", OPTION_VAL_35_DE }, + { "40", OPTION_VAL_40_DE }, + { "45", OPTION_VAL_45_DE }, + { "50", OPTION_VAL_50_DE }, + { "55", OPTION_VAL_55_DE }, + { "60", OPTION_VAL_60_DE }, + { "65", OPTION_VAL_65_DE }, + { "70", OPTION_VAL_70_DE }, + { "75", OPTION_VAL_75_DE }, + { "80", OPTION_VAL_80_DE }, + { "85", OPTION_VAL_85_DE }, + { "90", OPTION_VAL_90_DE }, + { "95", OPTION_VAL_95_DE }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_DE, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_DE, + NULL, + "input", + { + { "no", OPTION_VAL_NO_DE }, + { "yes", OPTION_VAL_YES_DE }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_DE, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_DE, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_DE }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_DE, + NULL, + MGBA_FORCE_GBP_INFO_0_DE, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_DE, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_DE, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_DE }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_DE }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_DE }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_DE, + NULL, + MGBA_FRAMESKIP_INFO_0_DE, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_DE }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_DE }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_DE }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_DE, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_DE, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_DE, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_DE, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_EL NULL +#define CATEGORY_SYSTEM_INFO_0_EL NULL +#define CATEGORY_VIDEO_LABEL_EL "Οδηγός Βίντεο" +#define CATEGORY_VIDEO_INFO_0_EL NULL +#define CATEGORY_VIDEO_INFO_1_EL NULL +#define CATEGORY_AUDIO_LABEL_EL "Οδηγός Ήχου" +#define CATEGORY_AUDIO_INFO_0_EL NULL +#define CATEGORY_INPUT_LABEL_EL NULL +#define CATEGORY_INPUT_INFO_0_EL NULL +#define CATEGORY_PERFORMANCE_LABEL_EL NULL +#define CATEGORY_PERFORMANCE_INFO_0_EL NULL +#define MGBA_GB_MODEL_LABEL_EL NULL +#define MGBA_GB_MODEL_INFO_0_EL NULL +#define OPTION_VAL_AUTODETECT_EL "Αυτόματη ανίχνευση" +#define OPTION_VAL_GAME_BOY_EL NULL +#define OPTION_VAL_SUPER_GAME_BOY_EL NULL +#define OPTION_VAL_GAME_BOY_COLOR_EL NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_EL NULL +#define MGBA_USE_BIOS_LABEL_EL NULL +#define MGBA_USE_BIOS_INFO_0_EL NULL +#define MGBA_SKIP_BIOS_LABEL_EL NULL +#define MGBA_SKIP_BIOS_INFO_0_EL NULL +#define MGBA_GB_COLORS_LABEL_EL NULL +#define MGBA_GB_COLORS_INFO_0_EL NULL +#define OPTION_VAL_GRAYSCALE_EL NULL +#define MGBA_SGB_BORDERS_LABEL_EL NULL +#define MGBA_SGB_BORDERS_INFO_0_EL NULL +#define MGBA_COLOR_CORRECTION_LABEL_EL NULL +#define MGBA_COLOR_CORRECTION_INFO_0_EL NULL +#define OPTION_VAL_AUTO_EL NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_EL NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_EL NULL +#define OPTION_VAL_MIX_EL NULL +#define OPTION_VAL_MIX_SMART_EL NULL +#define OPTION_VAL_LCD_GHOSTING_EL NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_EL NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_EL "Φίλτρα Ήχου" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_EL NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_EL NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_EL NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_EL NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_EL NULL +#define OPTION_VAL_5_EL NULL +#define OPTION_VAL_10_EL NULL +#define OPTION_VAL_15_EL NULL +#define OPTION_VAL_20_EL NULL +#define OPTION_VAL_25_EL NULL +#define OPTION_VAL_30_EL NULL +#define OPTION_VAL_35_EL NULL +#define OPTION_VAL_40_EL NULL +#define OPTION_VAL_45_EL NULL +#define OPTION_VAL_50_EL NULL +#define OPTION_VAL_55_EL NULL +#define OPTION_VAL_60_EL NULL +#define OPTION_VAL_65_EL NULL +#define OPTION_VAL_70_EL NULL +#define OPTION_VAL_75_EL NULL +#define OPTION_VAL_80_EL NULL +#define OPTION_VAL_85_EL NULL +#define OPTION_VAL_90_EL NULL +#define OPTION_VAL_95_EL NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_EL NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_EL NULL +#define OPTION_VAL_NO_EL "όχι" +#define OPTION_VAL_YES_EL "ναι" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_EL NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_EL NULL +#define OPTION_VAL_SENSOR_EL NULL +#define MGBA_FORCE_GBP_LABEL_EL NULL +#define MGBA_FORCE_GBP_INFO_0_EL NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_EL NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_EL NULL +#define OPTION_VAL_REMOVE_KNOWN_EL NULL +#define OPTION_VAL_DETECT_AND_REMOVE_EL NULL +#define OPTION_VAL_DON_T_REMOVE_EL NULL +#define MGBA_FRAMESKIP_LABEL_EL NULL +#define MGBA_FRAMESKIP_INFO_0_EL NULL +#define OPTION_VAL_AUTO_THRESHOLD_EL NULL +#define OPTION_VAL_FIXED_INTERVAL_EL NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_EL NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_EL NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_EL NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_EL NULL + +struct retro_core_option_v2_category option_cats_el[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_EL, + CATEGORY_SYSTEM_INFO_0_EL + }, + { + "video", + CATEGORY_VIDEO_LABEL_EL, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_EL +#else + CATEGORY_VIDEO_INFO_1_EL +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_EL, + CATEGORY_AUDIO_INFO_0_EL + }, + { + "input", + CATEGORY_INPUT_LABEL_EL, + CATEGORY_INPUT_INFO_0_EL + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_EL, + CATEGORY_PERFORMANCE_INFO_0_EL + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_el[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_EL, + NULL, + MGBA_GB_MODEL_INFO_0_EL, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_EL }, + { "Game Boy", OPTION_VAL_GAME_BOY_EL }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_EL }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_EL }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_EL }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_EL, + NULL, + MGBA_USE_BIOS_INFO_0_EL, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_EL, + NULL, + MGBA_SKIP_BIOS_INFO_0_EL, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_EL, + NULL, + MGBA_GB_COLORS_INFO_0_EL, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_EL }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_EL, + NULL, + MGBA_SGB_BORDERS_INFO_0_EL, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_EL, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_EL, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_EL }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_EL }, + { "Auto", OPTION_VAL_AUTO_EL }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_EL, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_EL, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_EL }, + { "mix_smart", OPTION_VAL_MIX_SMART_EL }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_EL }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_EL }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_EL, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_EL, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_EL, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_EL, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_EL, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_EL, + NULL, + "audio", + { + { "5", OPTION_VAL_5_EL }, + { "10", OPTION_VAL_10_EL }, + { "15", OPTION_VAL_15_EL }, + { "20", OPTION_VAL_20_EL }, + { "25", OPTION_VAL_25_EL }, + { "30", OPTION_VAL_30_EL }, + { "35", OPTION_VAL_35_EL }, + { "40", OPTION_VAL_40_EL }, + { "45", OPTION_VAL_45_EL }, + { "50", OPTION_VAL_50_EL }, + { "55", OPTION_VAL_55_EL }, + { "60", OPTION_VAL_60_EL }, + { "65", OPTION_VAL_65_EL }, + { "70", OPTION_VAL_70_EL }, + { "75", OPTION_VAL_75_EL }, + { "80", OPTION_VAL_80_EL }, + { "85", OPTION_VAL_85_EL }, + { "90", OPTION_VAL_90_EL }, + { "95", OPTION_VAL_95_EL }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_EL, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_EL, + NULL, + "input", + { + { "no", OPTION_VAL_NO_EL }, + { "yes", OPTION_VAL_YES_EL }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_EL, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_EL, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_EL }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_EL, + NULL, + MGBA_FORCE_GBP_INFO_0_EL, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_EL, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_EL, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_EL }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_EL }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_EL }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_EL, + NULL, + MGBA_FRAMESKIP_INFO_0_EL, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_EL }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_EL }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_EL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_EL, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_EL, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_EL, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_EL, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_EO NULL +#define CATEGORY_SYSTEM_INFO_0_EO NULL +#define CATEGORY_VIDEO_LABEL_EO "Video Driver" +#define CATEGORY_VIDEO_INFO_0_EO NULL +#define CATEGORY_VIDEO_INFO_1_EO NULL +#define CATEGORY_AUDIO_LABEL_EO "Audio Driver" +#define CATEGORY_AUDIO_INFO_0_EO NULL +#define CATEGORY_INPUT_LABEL_EO NULL +#define CATEGORY_INPUT_INFO_0_EO NULL +#define CATEGORY_PERFORMANCE_LABEL_EO NULL +#define CATEGORY_PERFORMANCE_INFO_0_EO NULL +#define MGBA_GB_MODEL_LABEL_EO NULL +#define MGBA_GB_MODEL_INFO_0_EO NULL +#define OPTION_VAL_AUTODETECT_EO NULL +#define OPTION_VAL_GAME_BOY_EO NULL +#define OPTION_VAL_SUPER_GAME_BOY_EO NULL +#define OPTION_VAL_GAME_BOY_COLOR_EO NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_EO NULL +#define MGBA_USE_BIOS_LABEL_EO NULL +#define MGBA_USE_BIOS_INFO_0_EO NULL +#define MGBA_SKIP_BIOS_LABEL_EO NULL +#define MGBA_SKIP_BIOS_INFO_0_EO NULL +#define MGBA_GB_COLORS_LABEL_EO NULL +#define MGBA_GB_COLORS_INFO_0_EO NULL +#define OPTION_VAL_GRAYSCALE_EO NULL +#define MGBA_SGB_BORDERS_LABEL_EO NULL +#define MGBA_SGB_BORDERS_INFO_0_EO NULL +#define MGBA_COLOR_CORRECTION_LABEL_EO NULL +#define MGBA_COLOR_CORRECTION_INFO_0_EO NULL +#define OPTION_VAL_AUTO_EO NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_EO NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_EO NULL +#define OPTION_VAL_MIX_EO NULL +#define OPTION_VAL_MIX_SMART_EO NULL +#define OPTION_VAL_LCD_GHOSTING_EO NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_EO NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_EO NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_EO NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_EO NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_EO NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_EO NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_EO NULL +#define OPTION_VAL_5_EO NULL +#define OPTION_VAL_10_EO NULL +#define OPTION_VAL_15_EO NULL +#define OPTION_VAL_20_EO NULL +#define OPTION_VAL_25_EO NULL +#define OPTION_VAL_30_EO NULL +#define OPTION_VAL_35_EO NULL +#define OPTION_VAL_40_EO NULL +#define OPTION_VAL_45_EO NULL +#define OPTION_VAL_50_EO NULL +#define OPTION_VAL_55_EO NULL +#define OPTION_VAL_60_EO NULL +#define OPTION_VAL_65_EO NULL +#define OPTION_VAL_70_EO NULL +#define OPTION_VAL_75_EO NULL +#define OPTION_VAL_80_EO NULL +#define OPTION_VAL_85_EO NULL +#define OPTION_VAL_90_EO NULL +#define OPTION_VAL_95_EO NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_EO NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_EO NULL +#define OPTION_VAL_NO_EO NULL +#define OPTION_VAL_YES_EO NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_EO NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_EO NULL +#define OPTION_VAL_SENSOR_EO NULL +#define MGBA_FORCE_GBP_LABEL_EO NULL +#define MGBA_FORCE_GBP_INFO_0_EO NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_EO NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_EO NULL +#define OPTION_VAL_REMOVE_KNOWN_EO NULL +#define OPTION_VAL_DETECT_AND_REMOVE_EO NULL +#define OPTION_VAL_DON_T_REMOVE_EO NULL +#define MGBA_FRAMESKIP_LABEL_EO NULL +#define MGBA_FRAMESKIP_INFO_0_EO NULL +#define OPTION_VAL_AUTO_THRESHOLD_EO NULL +#define OPTION_VAL_FIXED_INTERVAL_EO NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_EO NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_EO NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_EO NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_EO NULL + +struct retro_core_option_v2_category option_cats_eo[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_EO, + CATEGORY_SYSTEM_INFO_0_EO + }, + { + "video", + CATEGORY_VIDEO_LABEL_EO, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_EO +#else + CATEGORY_VIDEO_INFO_1_EO +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_EO, + CATEGORY_AUDIO_INFO_0_EO + }, + { + "input", + CATEGORY_INPUT_LABEL_EO, + CATEGORY_INPUT_INFO_0_EO + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_EO, + CATEGORY_PERFORMANCE_INFO_0_EO + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_eo[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_EO, + NULL, + MGBA_GB_MODEL_INFO_0_EO, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_EO }, + { "Game Boy", OPTION_VAL_GAME_BOY_EO }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_EO }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_EO }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_EO }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_EO, + NULL, + MGBA_USE_BIOS_INFO_0_EO, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_EO, + NULL, + MGBA_SKIP_BIOS_INFO_0_EO, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_EO, + NULL, + MGBA_GB_COLORS_INFO_0_EO, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_EO }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_EO, + NULL, + MGBA_SGB_BORDERS_INFO_0_EO, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_EO, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_EO, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_EO }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_EO }, + { "Auto", OPTION_VAL_AUTO_EO }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_EO, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_EO, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_EO }, + { "mix_smart", OPTION_VAL_MIX_SMART_EO }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_EO }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_EO }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_EO, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_EO, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_EO, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_EO, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_EO, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_EO, + NULL, + "audio", + { + { "5", OPTION_VAL_5_EO }, + { "10", OPTION_VAL_10_EO }, + { "15", OPTION_VAL_15_EO }, + { "20", OPTION_VAL_20_EO }, + { "25", OPTION_VAL_25_EO }, + { "30", OPTION_VAL_30_EO }, + { "35", OPTION_VAL_35_EO }, + { "40", OPTION_VAL_40_EO }, + { "45", OPTION_VAL_45_EO }, + { "50", OPTION_VAL_50_EO }, + { "55", OPTION_VAL_55_EO }, + { "60", OPTION_VAL_60_EO }, + { "65", OPTION_VAL_65_EO }, + { "70", OPTION_VAL_70_EO }, + { "75", OPTION_VAL_75_EO }, + { "80", OPTION_VAL_80_EO }, + { "85", OPTION_VAL_85_EO }, + { "90", OPTION_VAL_90_EO }, + { "95", OPTION_VAL_95_EO }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_EO, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_EO, + NULL, + "input", + { + { "no", OPTION_VAL_NO_EO }, + { "yes", OPTION_VAL_YES_EO }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_EO, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_EO, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_EO }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_EO, + NULL, + MGBA_FORCE_GBP_INFO_0_EO, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_EO, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_EO, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_EO }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_EO }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_EO }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_EO, + NULL, + MGBA_FRAMESKIP_INFO_0_EO, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_EO }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_EO }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_EO }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_EO, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_EO, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_EO, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_EO, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_ES "Sistema" +#define CATEGORY_SYSTEM_INFO_0_ES "Cambia los ajustes de selección del hardware base y de la BIOS." +#define CATEGORY_VIDEO_LABEL_ES "Vídeo" +#define CATEGORY_VIDEO_INFO_0_ES "Cambia la paleta de los modelos DMG, los bordes de SGB, la corrección de color y los efectos «ghosting» (fantasma) de la pantalla LCD." +#define CATEGORY_VIDEO_INFO_1_ES "Cambia la paleta de los modelos DMG y los bordes de SGB." +#define CATEGORY_AUDIO_LABEL_ES NULL +#define CATEGORY_AUDIO_INFO_0_ES "Cambia los filtros de audio." +#define CATEGORY_INPUT_LABEL_ES "Entrada y dispositivos auxiliares" +#define CATEGORY_INPUT_INFO_0_ES "Cambia los ajustes de los mandos, de la entrada de los sensores y de la vibración." +#define CATEGORY_PERFORMANCE_LABEL_ES "Rendimiento" +#define CATEGORY_PERFORMANCE_INFO_0_ES "Cambia los ajustes de los bucles de inactividad y de la omisión de fotogramas." +#define MGBA_GB_MODEL_LABEL_ES "Modelo de Game Boy (es necesario reiniciar)" +#define MGBA_GB_MODEL_INFO_0_ES "Ejecuta el contenido cargado utilizando un modelo de Game Boy específico. La opción «Detección automática» seleccionará el modelo más adecuado para cada juego." +#define OPTION_VAL_AUTODETECT_ES "Detección automática" +#define OPTION_VAL_GAME_BOY_ES NULL +#define OPTION_VAL_SUPER_GAME_BOY_ES NULL +#define OPTION_VAL_GAME_BOY_COLOR_ES NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_ES NULL +#define MGBA_USE_BIOS_LABEL_ES "Utilizar BIOS en caso de encontrarla (es necesario reiniciar)" +#define MGBA_USE_BIOS_INFO_0_ES "Si se encuentran en el directorio de sistema de RetroArch, se utilizarán los archivos de la BIOS y el cargador de arranque oficiales para emular el hardware." +#define MGBA_SKIP_BIOS_LABEL_ES "Omitir introducción de la BIOS (es necesario reiniciar)" +#define MGBA_SKIP_BIOS_INFO_0_ES "Al utilizar una BIOS y un cargador de arranque oficiales, omitirá la animación del logotipo al arrancar. Esta opción será ignorada si «Utilizar BIOS en caso de encontrarla» está desactivada." +#define MGBA_GB_COLORS_LABEL_ES "Paleta predeterminada de Game Boy" +#define MGBA_GB_COLORS_INFO_0_ES "Selecciona la paleta que se utilizará con aquellos juegos de Game Boy que no sean compatibles con Game Boy Color/Super Game Boy o al forzar el modelo a Game Boy." +#define OPTION_VAL_GRAYSCALE_ES "Escala de grises" +#define MGBA_SGB_BORDERS_LABEL_ES "Utilizar bordes de Super Game Boy (es necesario reiniciar)" +#define MGBA_SGB_BORDERS_INFO_0_ES "Muestra los bordes de Super Game Boy al ejecutar juegos compatibles con este sistema." +#define MGBA_COLOR_CORRECTION_LABEL_ES "Corrección de color" +#define MGBA_COLOR_CORRECTION_INFO_0_ES "Ajusta los colores de la salida de imagen para que esta coincida con la que mostraría un hardware real de GBA/GBC." +#define OPTION_VAL_AUTO_ES "Selección automática" +#define MGBA_INTERFRAME_BLENDING_LABEL_ES "Fusión entre fotogramas" +#define MGBA_INTERFRAME_BLENDING_INFO_0_ES "Simula el efecto «ghosting» (fantasma) de la pantalla LCD. «Sencilla» mezcla la mitad de los fotogramas anterior y siguiente. «Inteligente» intentará detectar parpadeos en la pantalla y solo hará una mezcla de mitades de fotogramas en los píxeles afectados. «Ghosting de LCD» simula los tiempos de respuesta naturales de una pantalla LCD combinando varios fotogramas almacenados en el búfer. Las fusiones «Sencilla» o «Inteligente» son necesarias para aquellos juegos que necesiten el efecto «ghosting» para mostrar efectos de transparencias (Wave Race, Chikyuu Kaihou Gun ZAS, F-Zero, la saga Boktai...)." +#define OPTION_VAL_MIX_ES "Sencilla" +#define OPTION_VAL_MIX_SMART_ES "Inteligente" +#define OPTION_VAL_LCD_GHOSTING_ES "«Ghosting» de LCD (preciso)" +#define OPTION_VAL_LCD_GHOSTING_FAST_ES "«Ghosting» de LCD (rápido)" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_ES "Filtro de audio" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_ES "Filtro de paso bajo" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_ES "Activa un filtro de paso bajo para reducir la estridencia del audio generado." +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_ES "Nivel del filtro de audio" +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_ES "Nivel del filtro" +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_ES "Especifica el corte de frecuencias en el filtro de paso bajo de audio. Un valor elevado aumentará la fuerza percibida del filtro, ya que se atenuará un rango mayor del espectro de frecuencias altas." +#define OPTION_VAL_5_ES "5 %" +#define OPTION_VAL_10_ES "10 %" +#define OPTION_VAL_15_ES "15 %" +#define OPTION_VAL_20_ES "20 %" +#define OPTION_VAL_25_ES "25 %" +#define OPTION_VAL_30_ES "30 %" +#define OPTION_VAL_35_ES "35 %" +#define OPTION_VAL_40_ES "40 %" +#define OPTION_VAL_45_ES "45 %" +#define OPTION_VAL_50_ES "50 %" +#define OPTION_VAL_55_ES "55 %" +#define OPTION_VAL_60_ES "60 %" +#define OPTION_VAL_65_ES "65 %" +#define OPTION_VAL_70_ES "70 %" +#define OPTION_VAL_75_ES "75 %" +#define OPTION_VAL_80_ES "80 %" +#define OPTION_VAL_85_ES "85 %" +#define OPTION_VAL_90_ES "90 %" +#define OPTION_VAL_95_ES "95 %" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_ES "Permitir entradas direccionales opuestas" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_ES "Esta opción permitirá pulsar, alternar rápidamente o mantener las direcciones izquierda y derecha (o arriba y abajo) al mismo tiempo. Podría provocar fallos de movimiento." +#define OPTION_VAL_NO_ES "No" +#define OPTION_VAL_YES_ES "Sí" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_ES "Nivel del sensor solar" +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_ES "Ajusta la intensidad de la luz solar ambiental. Para juegos que contenían un sensor solar en sus cartuchos, p. ej.: la saga Boktai." +#define OPTION_VAL_SENSOR_ES "Utilizar dispositivo sensor si está disponible" +#define MGBA_FORCE_GBP_LABEL_ES "Vibración de Game Boy Player (es necesario reiniciar)" +#define MGBA_FORCE_GBP_INFO_0_ES "Permite que los juegos compatibles con el logotipo de arranque de Game Boy Player hagan vibrar el mando. Debido al método que utilizó Nintendo, puede provocar fallos gráficos, como parpadeos o retrasos de señal en algunos de estos juegos." +#define MGBA_IDLE_OPTIMIZATION_LABEL_ES "Eliminar bucle de inactividad" +#define MGBA_IDLE_OPTIMIZATION_INFO_0_ES "Minimiza la carga del sistema optimizando los llamados bucles de inactividad: secciones de código en las que no ocurre nada, pero la CPU se ejecuta a máxima velocidad (como cuando un vehículo es revolucionado sin tener la marcha puesta). Mejora el rendimiento y debería activarse en hardware de bajas prestaciones." +#define OPTION_VAL_REMOVE_KNOWN_ES "Eliminar bucles conocidos" +#define OPTION_VAL_DETECT_AND_REMOVE_ES "Detectar y eliminar" +#define OPTION_VAL_DON_T_REMOVE_ES "No eliminar" +#define MGBA_FRAMESKIP_LABEL_ES "Omisión de fotogramas" +#define MGBA_FRAMESKIP_INFO_0_ES "Omite fotogramas para no saturar el búfer de audio (chasquidos en el sonido). Mejora el rendimiento a costa de perder fluidez visual. «Selección automática» omite fotogramas según lo aconseje el front-end. «Selección automática (umbral)» utiliza el valor configurado en Umbral de omisión de fotogramas (%). «Intervalos fijos» utiliza el ajuste Intervalo de omisión de fotogramas." +#define OPTION_VAL_AUTO_THRESHOLD_ES "Selección automática (umbral)" +#define OPTION_VAL_FIXED_INTERVAL_ES "Intervalos fijos" +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_ES "Umbral de omisión de fotogramas (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_ES "Cuando la omisión de fotogramas esté configurada como «Selección automática (umbral)», este ajuste especifica el umbral de ocupación del búfer de audio (en porcentaje) por el que se omitirán fotogramas si el valor es inferior. Un valor más elevado reduce el riesgo de chasquidos omitiendo fotogramas con una mayor frecuencia." +#define MGBA_FRAMESKIP_INTERVAL_LABEL_ES "Intervalo de omisión de fotogramas" +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_ES "Cuando la omisión de fotogramas esté configurada como «Intervalos fijos», el valor que se asigne aquí será el número de fotogramas omitidos una vez se haya renderizado un fotograma. Por ejemplo: «0» = 60 FPS, «1» = 30 FPS, «2» = 15 FPS, etcétera." + +struct retro_core_option_v2_category option_cats_es[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_ES, + CATEGORY_SYSTEM_INFO_0_ES + }, + { + "video", + CATEGORY_VIDEO_LABEL_ES, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_ES +#else + CATEGORY_VIDEO_INFO_1_ES +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_ES, + CATEGORY_AUDIO_INFO_0_ES + }, + { + "input", + CATEGORY_INPUT_LABEL_ES, + CATEGORY_INPUT_INFO_0_ES + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_ES, + CATEGORY_PERFORMANCE_INFO_0_ES + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_es[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_ES, + NULL, + MGBA_GB_MODEL_INFO_0_ES, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_ES }, + { "Game Boy", OPTION_VAL_GAME_BOY_ES }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_ES }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_ES }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_ES }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_ES, + NULL, + MGBA_USE_BIOS_INFO_0_ES, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_ES, + NULL, + MGBA_SKIP_BIOS_INFO_0_ES, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_ES, + NULL, + MGBA_GB_COLORS_INFO_0_ES, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_ES }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_ES, + NULL, + MGBA_SGB_BORDERS_INFO_0_ES, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_ES, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_ES, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_ES }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_ES }, + { "Auto", OPTION_VAL_AUTO_ES }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_ES, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_ES, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_ES }, + { "mix_smart", OPTION_VAL_MIX_SMART_ES }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_ES }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_ES }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_ES, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_ES, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_ES, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_ES, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_ES, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_ES, + NULL, + "audio", + { + { "5", OPTION_VAL_5_ES }, + { "10", OPTION_VAL_10_ES }, + { "15", OPTION_VAL_15_ES }, + { "20", OPTION_VAL_20_ES }, + { "25", OPTION_VAL_25_ES }, + { "30", OPTION_VAL_30_ES }, + { "35", OPTION_VAL_35_ES }, + { "40", OPTION_VAL_40_ES }, + { "45", OPTION_VAL_45_ES }, + { "50", OPTION_VAL_50_ES }, + { "55", OPTION_VAL_55_ES }, + { "60", OPTION_VAL_60_ES }, + { "65", OPTION_VAL_65_ES }, + { "70", OPTION_VAL_70_ES }, + { "75", OPTION_VAL_75_ES }, + { "80", OPTION_VAL_80_ES }, + { "85", OPTION_VAL_85_ES }, + { "90", OPTION_VAL_90_ES }, + { "95", OPTION_VAL_95_ES }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_ES, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_ES, + NULL, + "input", + { + { "no", OPTION_VAL_NO_ES }, + { "yes", OPTION_VAL_YES_ES }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_ES, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_ES, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_ES }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_ES, + NULL, + MGBA_FORCE_GBP_INFO_0_ES, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_ES, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_ES, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_ES }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_ES }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_ES }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_ES, + NULL, + MGBA_FRAMESKIP_INFO_0_ES, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_ES }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_ES }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_ES }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_ES, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_ES, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_ES, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_ES, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_FA NULL +#define CATEGORY_SYSTEM_INFO_0_FA NULL +#define CATEGORY_VIDEO_LABEL_FA "ویدیو" +#define CATEGORY_VIDEO_INFO_0_FA NULL +#define CATEGORY_VIDEO_INFO_1_FA NULL +#define CATEGORY_AUDIO_LABEL_FA "صدا" +#define CATEGORY_AUDIO_INFO_0_FA NULL +#define CATEGORY_INPUT_LABEL_FA NULL +#define CATEGORY_INPUT_INFO_0_FA NULL +#define CATEGORY_PERFORMANCE_LABEL_FA NULL +#define CATEGORY_PERFORMANCE_INFO_0_FA NULL +#define MGBA_GB_MODEL_LABEL_FA NULL +#define MGBA_GB_MODEL_INFO_0_FA NULL +#define OPTION_VAL_AUTODETECT_FA NULL +#define OPTION_VAL_GAME_BOY_FA NULL +#define OPTION_VAL_SUPER_GAME_BOY_FA NULL +#define OPTION_VAL_GAME_BOY_COLOR_FA NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_FA NULL +#define MGBA_USE_BIOS_LABEL_FA NULL +#define MGBA_USE_BIOS_INFO_0_FA NULL +#define MGBA_SKIP_BIOS_LABEL_FA NULL +#define MGBA_SKIP_BIOS_INFO_0_FA NULL +#define MGBA_GB_COLORS_LABEL_FA NULL +#define MGBA_GB_COLORS_INFO_0_FA NULL +#define OPTION_VAL_GRAYSCALE_FA NULL +#define MGBA_SGB_BORDERS_LABEL_FA NULL +#define MGBA_SGB_BORDERS_INFO_0_FA NULL +#define MGBA_COLOR_CORRECTION_LABEL_FA NULL +#define MGBA_COLOR_CORRECTION_INFO_0_FA NULL +#define OPTION_VAL_AUTO_FA NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_FA NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_FA NULL +#define OPTION_VAL_MIX_FA NULL +#define OPTION_VAL_MIX_SMART_FA NULL +#define OPTION_VAL_LCD_GHOSTING_FA NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_FA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_FA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_FA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_FA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_FA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_FA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_FA NULL +#define OPTION_VAL_5_FA NULL +#define OPTION_VAL_10_FA NULL +#define OPTION_VAL_15_FA NULL +#define OPTION_VAL_20_FA NULL +#define OPTION_VAL_25_FA NULL +#define OPTION_VAL_30_FA NULL +#define OPTION_VAL_35_FA NULL +#define OPTION_VAL_40_FA NULL +#define OPTION_VAL_45_FA NULL +#define OPTION_VAL_50_FA NULL +#define OPTION_VAL_55_FA NULL +#define OPTION_VAL_60_FA NULL +#define OPTION_VAL_65_FA NULL +#define OPTION_VAL_70_FA NULL +#define OPTION_VAL_75_FA NULL +#define OPTION_VAL_80_FA NULL +#define OPTION_VAL_85_FA NULL +#define OPTION_VAL_90_FA NULL +#define OPTION_VAL_95_FA NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_FA NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_FA NULL +#define OPTION_VAL_NO_FA NULL +#define OPTION_VAL_YES_FA NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_FA NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_FA NULL +#define OPTION_VAL_SENSOR_FA NULL +#define MGBA_FORCE_GBP_LABEL_FA NULL +#define MGBA_FORCE_GBP_INFO_0_FA NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_FA NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_FA NULL +#define OPTION_VAL_REMOVE_KNOWN_FA NULL +#define OPTION_VAL_DETECT_AND_REMOVE_FA NULL +#define OPTION_VAL_DON_T_REMOVE_FA NULL +#define MGBA_FRAMESKIP_LABEL_FA NULL +#define MGBA_FRAMESKIP_INFO_0_FA NULL +#define OPTION_VAL_AUTO_THRESHOLD_FA NULL +#define OPTION_VAL_FIXED_INTERVAL_FA NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_FA NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_FA NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_FA NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_FA NULL + +struct retro_core_option_v2_category option_cats_fa[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_FA, + CATEGORY_SYSTEM_INFO_0_FA + }, + { + "video", + CATEGORY_VIDEO_LABEL_FA, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_FA +#else + CATEGORY_VIDEO_INFO_1_FA +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_FA, + CATEGORY_AUDIO_INFO_0_FA + }, + { + "input", + CATEGORY_INPUT_LABEL_FA, + CATEGORY_INPUT_INFO_0_FA + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_FA, + CATEGORY_PERFORMANCE_INFO_0_FA + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_fa[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_FA, + NULL, + MGBA_GB_MODEL_INFO_0_FA, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_FA }, + { "Game Boy", OPTION_VAL_GAME_BOY_FA }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_FA }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_FA }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_FA }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_FA, + NULL, + MGBA_USE_BIOS_INFO_0_FA, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_FA, + NULL, + MGBA_SKIP_BIOS_INFO_0_FA, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_FA, + NULL, + MGBA_GB_COLORS_INFO_0_FA, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_FA }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_FA, + NULL, + MGBA_SGB_BORDERS_INFO_0_FA, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_FA, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_FA, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_FA }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_FA }, + { "Auto", OPTION_VAL_AUTO_FA }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_FA, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_FA, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_FA }, + { "mix_smart", OPTION_VAL_MIX_SMART_FA }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_FA }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_FA }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_FA, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_FA, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_FA, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_FA, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_FA, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_FA, + NULL, + "audio", + { + { "5", OPTION_VAL_5_FA }, + { "10", OPTION_VAL_10_FA }, + { "15", OPTION_VAL_15_FA }, + { "20", OPTION_VAL_20_FA }, + { "25", OPTION_VAL_25_FA }, + { "30", OPTION_VAL_30_FA }, + { "35", OPTION_VAL_35_FA }, + { "40", OPTION_VAL_40_FA }, + { "45", OPTION_VAL_45_FA }, + { "50", OPTION_VAL_50_FA }, + { "55", OPTION_VAL_55_FA }, + { "60", OPTION_VAL_60_FA }, + { "65", OPTION_VAL_65_FA }, + { "70", OPTION_VAL_70_FA }, + { "75", OPTION_VAL_75_FA }, + { "80", OPTION_VAL_80_FA }, + { "85", OPTION_VAL_85_FA }, + { "90", OPTION_VAL_90_FA }, + { "95", OPTION_VAL_95_FA }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_FA, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_FA, + NULL, + "input", + { + { "no", OPTION_VAL_NO_FA }, + { "yes", OPTION_VAL_YES_FA }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_FA, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_FA, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_FA }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_FA, + NULL, + MGBA_FORCE_GBP_INFO_0_FA, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_FA, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_FA, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_FA }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_FA }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_FA }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_FA, + NULL, + MGBA_FRAMESKIP_INFO_0_FA, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_FA }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_FA }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_FA }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_FA, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_FA, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_FA, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_FA, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_FI "Järjestelmä" +#define CATEGORY_SYSTEM_INFO_0_FI "Määritä peruslaitteiston valinta / BIOS-parametrit." +#define CATEGORY_VIDEO_LABEL_FI NULL +#define CATEGORY_VIDEO_INFO_0_FI "Määritä DMG paletti / SGB rajat / väri korjaus / LCD ghosting-efektit." +#define CATEGORY_VIDEO_INFO_1_FI "Määritä DMG paletti / SGB rajat." +#define CATEGORY_AUDIO_LABEL_FI "Ääni" +#define CATEGORY_AUDIO_INFO_0_FI "Määritä äänen suodatus." +#define CATEGORY_INPUT_LABEL_FI "Syöte- ja lisälaitteet" +#define CATEGORY_INPUT_INFO_0_FI "Määritä ohjaimen / anturin syötteen ja tärinän asetukset." +#define CATEGORY_PERFORMANCE_LABEL_FI "Suorituskyky" +#define CATEGORY_PERFORMANCE_INFO_0_FI "Määritä joutosilmukan poisto / kuvanohitus parametrit." +#define MGBA_GB_MODEL_LABEL_FI "Game Boy malli (Uudelleenkäynnistys)" +#define MGBA_GB_MODEL_INFO_0_FI "Suorittaa ladattua sisältöä tietyllä Game Boy -mallilla. 'Havaitse automaattisesti' valitsee sopivimman mallin nykyiselle pelille." +#define OPTION_VAL_AUTODETECT_FI "Havaitse automaattisesti" +#define OPTION_VAL_GAME_BOY_FI NULL +#define OPTION_VAL_SUPER_GAME_BOY_FI NULL +#define OPTION_VAL_GAME_BOY_COLOR_FI NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_FI NULL +#define MGBA_USE_BIOS_LABEL_FI "Käytä BIOS-tiedostoa, mikäli se on läsnä (Uudelleenkäynnistys)" +#define MGBA_USE_BIOS_INFO_0_FI "Käytä virallista BIOS/bootloader -ohjelmaa emuloidulle laitteelle, mikäli ne löytyvät RetroArchin järjestelmäkansiosta." +#define MGBA_SKIP_BIOS_LABEL_FI "Ohita BIOS-alkulataus (Uudelleenkäynnistys)" +#define MGBA_SKIP_BIOS_INFO_0_FI "Kun käytät virallista BIOS/bootloaderia, jätä käynnistyslogo-animaatio väliin. Tämä asetus ohitetaan, kun 'Käytä BIOS-tiedostoa, mikäli se on läsnä\" on pois päältä." +#define MGBA_GB_COLORS_LABEL_FI "Game Boy:n oletus paletti" +#define MGBA_GB_COLORS_INFO_0_FI NULL +#define OPTION_VAL_GRAYSCALE_FI "Harmaasävy" +#define MGBA_SGB_BORDERS_LABEL_FI "Käytä Super Game Boy -kehyksiä (Uudelleenkäynnistys)" +#define MGBA_SGB_BORDERS_INFO_0_FI "Näytä Super Game Boy kehykset, kun ajetaan Super Game Boy tehostettuja pelejä." +#define MGBA_COLOR_CORRECTION_LABEL_FI "Värinkorjaus" +#define MGBA_COLOR_CORRECTION_INFO_0_FI "Säätää ulostulon värejä vastaamaan todellisen GBA/GBC-laitteen näyttöä." +#define OPTION_VAL_AUTO_FI "Automaattinen" +#define MGBA_INTERFRAME_BLENDING_LABEL_FI NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_FI NULL +#define OPTION_VAL_MIX_FI "Yksinkertainen" +#define OPTION_VAL_MIX_SMART_FI "Älykäs" +#define OPTION_VAL_LCD_GHOSTING_FI "LCD-ghosting (Tarkka)" +#define OPTION_VAL_LCD_GHOSTING_FAST_FI "LCD-ghosting (Nopea)" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_FI "Äänisuodatin" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_FI "Alipäästösuodatin" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_FI "Ota käyttöön alipäästösuodatin vähentääksesi luodun äänen \"karkeutta\"." +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_FI "Äänen suodatuksen taso" +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_FI "Suodatustaso" +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_FI "Määritä alipäästösuodattimen katkaisu taajuus. Korkeampi arvo nostaa suodattimen \"vahvuutta\", koska suurempi osuus korkeamman taajuuden spektristä on vaimennettu." +#define OPTION_VAL_5_FI "5 %" +#define OPTION_VAL_10_FI "10 %" +#define OPTION_VAL_15_FI "15 %" +#define OPTION_VAL_20_FI "20 %" +#define OPTION_VAL_25_FI "25 %" +#define OPTION_VAL_30_FI "30 %" +#define OPTION_VAL_35_FI "35 %" +#define OPTION_VAL_40_FI "40 %" +#define OPTION_VAL_45_FI "45 %" +#define OPTION_VAL_50_FI "50 %" +#define OPTION_VAL_55_FI "55 %" +#define OPTION_VAL_60_FI "60 %" +#define OPTION_VAL_65_FI "65 %" +#define OPTION_VAL_70_FI "70 %" +#define OPTION_VAL_75_FI "75 %" +#define OPTION_VAL_80_FI "80 %" +#define OPTION_VAL_85_FI "85 %" +#define OPTION_VAL_90_FI "90 %" +#define OPTION_VAL_95_FI "95 %" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_FI "Salli vastakkaisten suuntien syöte" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_FI "Tämän käyttöönotto sallii painamaan / nopeasti vaihtelemaan / pitämään sekä vasemmalle että oikealle (tai ylös ja alas) samanaikaisesti. Tämä voi aiheuttaa liikkeisiin perustuvia virheitä." +#define OPTION_VAL_NO_FI "ei" +#define OPTION_VAL_YES_FI "kyllä" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_FI "Aurinkoanturin taso" +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_FI "Asettaa ympäristön auringonvalon voimakkuuden. Voidaan käyttää peleissä, jotka sisälsivät aurinkoanturin kaseteissaan, esim. Boktai-sarjassa." +#define OPTION_VAL_SENSOR_FI "Käytä laitteen anturia, mikäli saatavana" +#define MGBA_FORCE_GBP_LABEL_FI "Game Boy Player tärinä (Uudelleenkäynnistys)" +#define MGBA_FORCE_GBP_INFO_0_FI "Tämän käyttöönotto mahdollistaa Game Boy Player:in kanssa yhteensopivien pelien käyttää tärinää. Siitä miten Nintendo päätti tämän ominaisuuden pitäisi toimia, se saattaa aiheuttaa virheitä, kuten vilkkumista tai viivettä joissakin näistä peleistä." +#define MGBA_IDLE_OPTIMIZATION_LABEL_FI "Joutosilmukan poisto" +#define MGBA_IDLE_OPTIMIZATION_INFO_0_FI "Vähentää järjestelmän kuormitusta optimoimalla niin kutsuttuja \"joutosilmukkoja\" - osioita koodissa, jossa mitään ei tapahdu, mutta prosessori toimii täydellä nopeudella (kuten auto kaasuttelee vapaalla). Parantaa suorituskykyä, ja pitäisi ottaa käyttöön heikkotehoisissa laitteissa." +#define OPTION_VAL_REMOVE_KNOWN_FI "Poista tunnetut" +#define OPTION_VAL_DETECT_AND_REMOVE_FI "Tunnista ja poista" +#define OPTION_VAL_DON_T_REMOVE_FI "Älä poista" +#define MGBA_FRAMESKIP_LABEL_FI "Kuvanohitus" +#define MGBA_FRAMESKIP_INFO_0_FI "Ohita kuvia välttääksesi äänipuskurin alle ajon (säröily). Parantaa suorituskykyä visuaalisen tasaisuuden kustannuksella. \"Automaatiinen\" ohittaa kuvat käyttöliittymän ohjeistuksen mukaan. \"Automaattinen (Kynnysarvo)\" käyttää \"Kuvienohituksen arvo (%)\"-asetusta. \"Kiinteä aikaväli\" käyttää \"Kiinteä aikaväli\"-asetusta." +#define OPTION_VAL_AUTO_THRESHOLD_FI "Automaattinen (Kynnysarvo)" +#define OPTION_VAL_FIXED_INTERVAL_FI "Kiinteä aikaväli" +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_FI "Kuvienohituksen arvo (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_FI "Kun \"Kuvanohitus\" on asetettu \"Automaattinen (Kynnysarvo)\", määrittää äänipuskurin kynnysarvo (prosentteina), jonka alapuolella kuvat ohitetaan. Korkeammat arvot vähentävät säröilyn riskiä siten, että kuvia poistetaan useammin." +#define MGBA_FRAMESKIP_INTERVAL_LABEL_FI "Kuvienohituksen aikaväli" +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_FI "Kun \"Kuvanohitus\" on asetettu \"Kiinteä aikaväli\", tässä asetettu arvo on ruutujen lukumäärä, jotka jätetään pois kehyksen renderöinnin jälkeen, esim. \"0\" = 60fps, \"1\" = 30fps, \"2\" = 15fps jne." + +struct retro_core_option_v2_category option_cats_fi[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_FI, + CATEGORY_SYSTEM_INFO_0_FI + }, + { + "video", + CATEGORY_VIDEO_LABEL_FI, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_FI +#else + CATEGORY_VIDEO_INFO_1_FI +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_FI, + CATEGORY_AUDIO_INFO_0_FI + }, + { + "input", + CATEGORY_INPUT_LABEL_FI, + CATEGORY_INPUT_INFO_0_FI + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_FI, + CATEGORY_PERFORMANCE_INFO_0_FI + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_fi[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_FI, + NULL, + MGBA_GB_MODEL_INFO_0_FI, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_FI }, + { "Game Boy", OPTION_VAL_GAME_BOY_FI }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_FI }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_FI }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_FI }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_FI, + NULL, + MGBA_USE_BIOS_INFO_0_FI, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_FI, + NULL, + MGBA_SKIP_BIOS_INFO_0_FI, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_FI, + NULL, + MGBA_GB_COLORS_INFO_0_FI, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_FI }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_FI, + NULL, + MGBA_SGB_BORDERS_INFO_0_FI, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_FI, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_FI, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_FI }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_FI }, + { "Auto", OPTION_VAL_AUTO_FI }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_FI, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_FI, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_FI }, + { "mix_smart", OPTION_VAL_MIX_SMART_FI }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_FI }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_FI }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_FI, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_FI, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_FI, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_FI, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_FI, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_FI, + NULL, + "audio", + { + { "5", OPTION_VAL_5_FI }, + { "10", OPTION_VAL_10_FI }, + { "15", OPTION_VAL_15_FI }, + { "20", OPTION_VAL_20_FI }, + { "25", OPTION_VAL_25_FI }, + { "30", OPTION_VAL_30_FI }, + { "35", OPTION_VAL_35_FI }, + { "40", OPTION_VAL_40_FI }, + { "45", OPTION_VAL_45_FI }, + { "50", OPTION_VAL_50_FI }, + { "55", OPTION_VAL_55_FI }, + { "60", OPTION_VAL_60_FI }, + { "65", OPTION_VAL_65_FI }, + { "70", OPTION_VAL_70_FI }, + { "75", OPTION_VAL_75_FI }, + { "80", OPTION_VAL_80_FI }, + { "85", OPTION_VAL_85_FI }, + { "90", OPTION_VAL_90_FI }, + { "95", OPTION_VAL_95_FI }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_FI, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_FI, + NULL, + "input", + { + { "no", OPTION_VAL_NO_FI }, + { "yes", OPTION_VAL_YES_FI }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_FI, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_FI, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_FI }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_FI, + NULL, + MGBA_FORCE_GBP_INFO_0_FI, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_FI, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_FI, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_FI }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_FI }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_FI }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_FI, + NULL, + MGBA_FRAMESKIP_INFO_0_FI, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_FI }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_FI }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_FI }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_FI, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_FI, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_FI, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_FI, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_FR "Système" +#define CATEGORY_SYSTEM_INFO_0_FR "Configurer les paramètres de la sélection du matériel de base/du BIOS." +#define CATEGORY_VIDEO_LABEL_FR "Vidéo" +#define CATEGORY_VIDEO_INFO_0_FR "Configurer la palette DMG/les bordures SGB/la correction des couleurs/les effets de rémanence LCD." +#define CATEGORY_VIDEO_INFO_1_FR "Configurer la palette DMG/les bordures SGB." +#define CATEGORY_AUDIO_LABEL_FR NULL +#define CATEGORY_AUDIO_INFO_0_FR "Configurer le filtrage audio." +#define CATEGORY_INPUT_LABEL_FR "Périphériques d'entrées & auxiliaires" +#define CATEGORY_INPUT_INFO_0_FR "Configurer les réglages d'entrées manettes/capteurs et de vibration." +#define CATEGORY_PERFORMANCE_LABEL_FR "Performances" +#define CATEGORY_PERFORMANCE_INFO_0_FR "Configurer les réglages de suppression de boucle inactive/de saut d'images." +#define MGBA_GB_MODEL_LABEL_FR "Modèle de Game Boy (Redémarrage requis)" +#define MGBA_GB_MODEL_INFO_0_FR "Exécute du contenu chargé avec un modèle de Game Boy émulée spécifique. 'Détection automatique' sélectionnera le modèle le plus approprié pour le jeu en cours." +#define OPTION_VAL_AUTODETECT_FR "Détection automatique" +#define OPTION_VAL_GAME_BOY_FR NULL +#define OPTION_VAL_SUPER_GAME_BOY_FR NULL +#define OPTION_VAL_GAME_BOY_COLOR_FR NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_FR NULL +#define MGBA_USE_BIOS_LABEL_FR "Utiliser le fichier BIOS si trouvé (Redémarrage requis)" +#define MGBA_USE_BIOS_INFO_0_FR "Utiliser le BIOS/bootloader officiel pour le matériel émulé, s'il est présent dans le dossier system de RetroArch." +#define MGBA_SKIP_BIOS_LABEL_FR "Ignorer l'intro du BIOS (Redémarrage requis)" +#define MGBA_SKIP_BIOS_INFO_0_FR "Lors de l'utilisation d'un BIOS/bootloader officiel, sauter l'animation du logo de démarrage. Ce réglage est ignoré lorsque l'option 'Utiliser le fichier BIOS si trouvé' est désactivée." +#define MGBA_GB_COLORS_LABEL_FR "Palette Game Boy par défaut" +#define MGBA_GB_COLORS_INFO_0_FR "Sélectionne quelle palette est utilisée pour les jeux de Game Boy qui ne sont pas compatibles Game Boy Color ou Super Game Boy, ou si le modèle est forcé sur Game Boy." +#define OPTION_VAL_GRAYSCALE_FR "Niveaux de gris" +#define MGBA_SGB_BORDERS_LABEL_FR "Utiliser les bordures de Super Game Boy (Redémarrage requis)" +#define MGBA_SGB_BORDERS_INFO_0_FR "Afficher les bordures Super Game Boy lors de l'exécution de jeux améliorés pour le Super Game Boy." +#define MGBA_COLOR_CORRECTION_LABEL_FR "Correction colorimétrique" +#define MGBA_COLOR_CORRECTION_INFO_0_FR "Ajuste les couleurs de sortie pour correspondre à l'écran du matériel GBA/GBC réel." +#define OPTION_VAL_AUTO_FR NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_FR "Mélange d'inter-trames" +#define MGBA_INTERFRAME_BLENDING_INFO_0_FR "Simule les effets de rémanence LCD, 'Simple' effectue un mélange à 50/50 des images actuelles et précédentes. 'Intelligent' tente de détecter le scintillement de l'écran, et n'effectue un mélange à 50/50 que sur les pixels affectés. 'Rémanence LCD' imite le temps de réponse naturel du LCD en combinant plusieurs images mises en mémoire tampon. Un mélange 'Simple' ou 'Intelligent' est nécessaire lorsque vous jouez à des jeux qui exploitent agressivement la rémanence LCD pour des effets de transparence (Wave Race, Chikyuu Kaihou Gun ZAS, F-Zero, la série Boktai...)." +#define OPTION_VAL_MIX_FR NULL +#define OPTION_VAL_MIX_SMART_FR "Intelligent" +#define OPTION_VAL_LCD_GHOSTING_FR "Rémanence LCD (réaliste)" +#define OPTION_VAL_LCD_GHOSTING_FAST_FR "Rémanence LCD (rapide)" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_FR "Filtre audio" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_FR "Filtre passe-bas" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_FR "Active un filtre audio passe-bas pour réduire la 'dureté' de l'audio généré." +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_FR "Niveau du filtre audio" +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_FR "Niveau du filtre" +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_FR "Spécifie la fréquence de coupure du filtre passe-bas audio. Une valeur plus élevée accroît la 'force' perçue du filtre, car une gamme plus large du spectre des hautes fréquences est atténuée." +#define OPTION_VAL_5_FR NULL +#define OPTION_VAL_10_FR NULL +#define OPTION_VAL_15_FR NULL +#define OPTION_VAL_20_FR NULL +#define OPTION_VAL_25_FR NULL +#define OPTION_VAL_30_FR NULL +#define OPTION_VAL_35_FR NULL +#define OPTION_VAL_40_FR NULL +#define OPTION_VAL_45_FR NULL +#define OPTION_VAL_50_FR NULL +#define OPTION_VAL_55_FR NULL +#define OPTION_VAL_60_FR NULL +#define OPTION_VAL_65_FR NULL +#define OPTION_VAL_70_FR NULL +#define OPTION_VAL_75_FR NULL +#define OPTION_VAL_80_FR NULL +#define OPTION_VAL_85_FR NULL +#define OPTION_VAL_90_FR NULL +#define OPTION_VAL_95_FR NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_FR "Autoriser les entrées directionnelles opposées" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_FR "L'activation de cette option permettra d'appuyer/d'alterner rapidement/de maintenir les directions gauche et droite (ou haut et bas) en même temps. Cela peut causer des bugs liés au mouvement." +#define OPTION_VAL_NO_FR "non" +#define OPTION_VAL_YES_FR "oui" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_FR "Niveau du capteur solaire" +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_FR "Définit l'intensité ambiante de la lumière du soleil. Peut être utilisée par des jeux qui incluaient un capteur solaire dans leurs cartouches, par exemple : la série Boktai." +#define OPTION_VAL_SENSOR_FR "Utiliser le capteur de l'appareil si disponible" +#define MGBA_FORCE_GBP_LABEL_FR "Vibration du Game Boy Player (Redémarrage requis)" +#define MGBA_FORCE_GBP_INFO_0_FR "Activer cette option permettra aux jeux compatibles avec le logo de démarrage du Game Boy Player de faire vibrer la manette. En raison de la façon dont Nintendo a décidé que cette fonctionnalité devrait marcher, cela peut causer des bugs tels que scintillement ou latence dans certains de ces jeux." +#define MGBA_IDLE_OPTIMIZATION_LABEL_FR "Suppression de la boucle inactive" +#define MGBA_IDLE_OPTIMIZATION_INFO_0_FR "Réduire la charge du système en optimisant ce que l'on appelle les 'boucles inactives' — sections dans le code où rien ne se passe, mais où le processeur fonctionne à pleine vitesse (comme une voiture révoquée en neutre). Améliore les performances et devrait être activé sur du matériel de bas de gamme." +#define OPTION_VAL_REMOVE_KNOWN_FR "Supprimer celles connues" +#define OPTION_VAL_DETECT_AND_REMOVE_FR "Détecter et supprimer" +#define OPTION_VAL_DON_T_REMOVE_FR "Ne pas supprimer" +#define MGBA_FRAMESKIP_LABEL_FR "Saut d'images" +#define MGBA_FRAMESKIP_INFO_0_FR "Sauter des images pour éviter que le tampon audio ne soit sous-exécuté (crépitements). Améliore les performances au détriment de la fluidité visuelle. 'Auto' saute des images lorsque l'interface le conseille. 'Auto (seuil)' utilise le paramètre 'Seuil de saut d'images (%)'. 'Intervalle fixe' utilise le paramètre 'Intervalle de saut d'images'." +#define OPTION_VAL_AUTO_THRESHOLD_FR "Auto (seuil)" +#define OPTION_VAL_FIXED_INTERVAL_FR "Intervalle fixe" +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_FR "Seuil de saut d'images (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_FR "Lorsque 'Saut d'images' est réglé sur 'Auto (seuil)', spécifie le seuil d'occupation du tampon audio (pourcentage) en dessous duquel des images seront sautées. Des valeurs plus élevées réduisent le risque de crépitements en faisant sauter des images plus fréquemment." +#define MGBA_FRAMESKIP_INTERVAL_LABEL_FR "Intervalle de saut d'images" +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_FR "Lorsque 'Saut d'images' est défini sur 'Intervalle fixe', la valeur définie ici est le nombre d'images omises après le rendu d'une image - par exemple '0' = 60i/s, '1' = 30i/s, '2' = 15i/s, etc." + +struct retro_core_option_v2_category option_cats_fr[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_FR, + CATEGORY_SYSTEM_INFO_0_FR + }, + { + "video", + CATEGORY_VIDEO_LABEL_FR, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_FR +#else + CATEGORY_VIDEO_INFO_1_FR +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_FR, + CATEGORY_AUDIO_INFO_0_FR + }, + { + "input", + CATEGORY_INPUT_LABEL_FR, + CATEGORY_INPUT_INFO_0_FR + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_FR, + CATEGORY_PERFORMANCE_INFO_0_FR + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_fr[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_FR, + NULL, + MGBA_GB_MODEL_INFO_0_FR, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_FR }, + { "Game Boy", OPTION_VAL_GAME_BOY_FR }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_FR }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_FR }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_FR }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_FR, + NULL, + MGBA_USE_BIOS_INFO_0_FR, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_FR, + NULL, + MGBA_SKIP_BIOS_INFO_0_FR, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_FR, + NULL, + MGBA_GB_COLORS_INFO_0_FR, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_FR }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_FR, + NULL, + MGBA_SGB_BORDERS_INFO_0_FR, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_FR, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_FR, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_FR }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_FR }, + { "Auto", OPTION_VAL_AUTO_FR }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_FR, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_FR, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_FR }, + { "mix_smart", OPTION_VAL_MIX_SMART_FR }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_FR }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_FR }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_FR, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_FR, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_FR, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_FR, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_FR, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_FR, + NULL, + "audio", + { + { "5", OPTION_VAL_5_FR }, + { "10", OPTION_VAL_10_FR }, + { "15", OPTION_VAL_15_FR }, + { "20", OPTION_VAL_20_FR }, + { "25", OPTION_VAL_25_FR }, + { "30", OPTION_VAL_30_FR }, + { "35", OPTION_VAL_35_FR }, + { "40", OPTION_VAL_40_FR }, + { "45", OPTION_VAL_45_FR }, + { "50", OPTION_VAL_50_FR }, + { "55", OPTION_VAL_55_FR }, + { "60", OPTION_VAL_60_FR }, + { "65", OPTION_VAL_65_FR }, + { "70", OPTION_VAL_70_FR }, + { "75", OPTION_VAL_75_FR }, + { "80", OPTION_VAL_80_FR }, + { "85", OPTION_VAL_85_FR }, + { "90", OPTION_VAL_90_FR }, + { "95", OPTION_VAL_95_FR }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_FR, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_FR, + NULL, + "input", + { + { "no", OPTION_VAL_NO_FR }, + { "yes", OPTION_VAL_YES_FR }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_FR, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_FR, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_FR }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_FR, + NULL, + MGBA_FORCE_GBP_INFO_0_FR, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_FR, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_FR, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_FR }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_FR }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_FR }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_FR, + NULL, + MGBA_FRAMESKIP_INFO_0_FR, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_FR }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_FR }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_FR }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_FR, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_FR, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_FR, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_FR, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_GL NULL +#define CATEGORY_SYSTEM_INFO_0_GL NULL +#define CATEGORY_VIDEO_LABEL_GL "Vídeo" +#define CATEGORY_VIDEO_INFO_0_GL NULL +#define CATEGORY_VIDEO_INFO_1_GL NULL +#define CATEGORY_AUDIO_LABEL_GL "Son" +#define CATEGORY_AUDIO_INFO_0_GL NULL +#define CATEGORY_INPUT_LABEL_GL NULL +#define CATEGORY_INPUT_INFO_0_GL NULL +#define CATEGORY_PERFORMANCE_LABEL_GL NULL +#define CATEGORY_PERFORMANCE_INFO_0_GL NULL +#define MGBA_GB_MODEL_LABEL_GL NULL +#define MGBA_GB_MODEL_INFO_0_GL NULL +#define OPTION_VAL_AUTODETECT_GL NULL +#define OPTION_VAL_GAME_BOY_GL NULL +#define OPTION_VAL_SUPER_GAME_BOY_GL NULL +#define OPTION_VAL_GAME_BOY_COLOR_GL NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_GL NULL +#define MGBA_USE_BIOS_LABEL_GL NULL +#define MGBA_USE_BIOS_INFO_0_GL NULL +#define MGBA_SKIP_BIOS_LABEL_GL NULL +#define MGBA_SKIP_BIOS_INFO_0_GL NULL +#define MGBA_GB_COLORS_LABEL_GL NULL +#define MGBA_GB_COLORS_INFO_0_GL NULL +#define OPTION_VAL_GRAYSCALE_GL NULL +#define MGBA_SGB_BORDERS_LABEL_GL NULL +#define MGBA_SGB_BORDERS_INFO_0_GL NULL +#define MGBA_COLOR_CORRECTION_LABEL_GL NULL +#define MGBA_COLOR_CORRECTION_INFO_0_GL NULL +#define OPTION_VAL_AUTO_GL NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_GL NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_GL NULL +#define OPTION_VAL_MIX_GL NULL +#define OPTION_VAL_MIX_SMART_GL NULL +#define OPTION_VAL_LCD_GHOSTING_GL NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_GL NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_GL NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_GL NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_GL NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_GL NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_GL NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_GL NULL +#define OPTION_VAL_5_GL NULL +#define OPTION_VAL_10_GL NULL +#define OPTION_VAL_15_GL NULL +#define OPTION_VAL_20_GL NULL +#define OPTION_VAL_25_GL NULL +#define OPTION_VAL_30_GL NULL +#define OPTION_VAL_35_GL NULL +#define OPTION_VAL_40_GL NULL +#define OPTION_VAL_45_GL NULL +#define OPTION_VAL_50_GL NULL +#define OPTION_VAL_55_GL NULL +#define OPTION_VAL_60_GL NULL +#define OPTION_VAL_65_GL NULL +#define OPTION_VAL_70_GL NULL +#define OPTION_VAL_75_GL NULL +#define OPTION_VAL_80_GL NULL +#define OPTION_VAL_85_GL NULL +#define OPTION_VAL_90_GL NULL +#define OPTION_VAL_95_GL NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_GL NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_GL NULL +#define OPTION_VAL_NO_GL NULL +#define OPTION_VAL_YES_GL "sí" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_GL NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_GL NULL +#define OPTION_VAL_SENSOR_GL NULL +#define MGBA_FORCE_GBP_LABEL_GL NULL +#define MGBA_FORCE_GBP_INFO_0_GL NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_GL NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_GL NULL +#define OPTION_VAL_REMOVE_KNOWN_GL NULL +#define OPTION_VAL_DETECT_AND_REMOVE_GL NULL +#define OPTION_VAL_DON_T_REMOVE_GL NULL +#define MGBA_FRAMESKIP_LABEL_GL NULL +#define MGBA_FRAMESKIP_INFO_0_GL NULL +#define OPTION_VAL_AUTO_THRESHOLD_GL NULL +#define OPTION_VAL_FIXED_INTERVAL_GL NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_GL NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_GL NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_GL NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_GL NULL + +struct retro_core_option_v2_category option_cats_gl[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_GL, + CATEGORY_SYSTEM_INFO_0_GL + }, + { + "video", + CATEGORY_VIDEO_LABEL_GL, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_GL +#else + CATEGORY_VIDEO_INFO_1_GL +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_GL, + CATEGORY_AUDIO_INFO_0_GL + }, + { + "input", + CATEGORY_INPUT_LABEL_GL, + CATEGORY_INPUT_INFO_0_GL + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_GL, + CATEGORY_PERFORMANCE_INFO_0_GL + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_gl[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_GL, + NULL, + MGBA_GB_MODEL_INFO_0_GL, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_GL }, + { "Game Boy", OPTION_VAL_GAME_BOY_GL }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_GL }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_GL }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_GL }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_GL, + NULL, + MGBA_USE_BIOS_INFO_0_GL, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_GL, + NULL, + MGBA_SKIP_BIOS_INFO_0_GL, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_GL, + NULL, + MGBA_GB_COLORS_INFO_0_GL, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_GL }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_GL, + NULL, + MGBA_SGB_BORDERS_INFO_0_GL, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_GL, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_GL, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_GL }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_GL }, + { "Auto", OPTION_VAL_AUTO_GL }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_GL, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_GL, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_GL }, + { "mix_smart", OPTION_VAL_MIX_SMART_GL }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_GL }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_GL }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_GL, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_GL, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_GL, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_GL, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_GL, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_GL, + NULL, + "audio", + { + { "5", OPTION_VAL_5_GL }, + { "10", OPTION_VAL_10_GL }, + { "15", OPTION_VAL_15_GL }, + { "20", OPTION_VAL_20_GL }, + { "25", OPTION_VAL_25_GL }, + { "30", OPTION_VAL_30_GL }, + { "35", OPTION_VAL_35_GL }, + { "40", OPTION_VAL_40_GL }, + { "45", OPTION_VAL_45_GL }, + { "50", OPTION_VAL_50_GL }, + { "55", OPTION_VAL_55_GL }, + { "60", OPTION_VAL_60_GL }, + { "65", OPTION_VAL_65_GL }, + { "70", OPTION_VAL_70_GL }, + { "75", OPTION_VAL_75_GL }, + { "80", OPTION_VAL_80_GL }, + { "85", OPTION_VAL_85_GL }, + { "90", OPTION_VAL_90_GL }, + { "95", OPTION_VAL_95_GL }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_GL, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_GL, + NULL, + "input", + { + { "no", OPTION_VAL_NO_GL }, + { "yes", OPTION_VAL_YES_GL }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_GL, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_GL, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_GL }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_GL, + NULL, + MGBA_FORCE_GBP_INFO_0_GL, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_GL, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_GL, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_GL }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_GL }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_GL }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_GL, + NULL, + MGBA_FRAMESKIP_INFO_0_GL, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_GL }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_GL }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_GL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_GL, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_GL, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_GL, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_GL, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_HE NULL +#define CATEGORY_SYSTEM_INFO_0_HE NULL +#define CATEGORY_VIDEO_LABEL_HE "וידאו" +#define CATEGORY_VIDEO_INFO_0_HE NULL +#define CATEGORY_VIDEO_INFO_1_HE NULL +#define CATEGORY_AUDIO_LABEL_HE "שמע" +#define CATEGORY_AUDIO_INFO_0_HE NULL +#define CATEGORY_INPUT_LABEL_HE NULL +#define CATEGORY_INPUT_INFO_0_HE NULL +#define CATEGORY_PERFORMANCE_LABEL_HE NULL +#define CATEGORY_PERFORMANCE_INFO_0_HE NULL +#define MGBA_GB_MODEL_LABEL_HE NULL +#define MGBA_GB_MODEL_INFO_0_HE NULL +#define OPTION_VAL_AUTODETECT_HE NULL +#define OPTION_VAL_GAME_BOY_HE NULL +#define OPTION_VAL_SUPER_GAME_BOY_HE NULL +#define OPTION_VAL_GAME_BOY_COLOR_HE NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_HE NULL +#define MGBA_USE_BIOS_LABEL_HE NULL +#define MGBA_USE_BIOS_INFO_0_HE NULL +#define MGBA_SKIP_BIOS_LABEL_HE NULL +#define MGBA_SKIP_BIOS_INFO_0_HE NULL +#define MGBA_GB_COLORS_LABEL_HE NULL +#define MGBA_GB_COLORS_INFO_0_HE NULL +#define OPTION_VAL_GRAYSCALE_HE NULL +#define MGBA_SGB_BORDERS_LABEL_HE NULL +#define MGBA_SGB_BORDERS_INFO_0_HE NULL +#define MGBA_COLOR_CORRECTION_LABEL_HE NULL +#define MGBA_COLOR_CORRECTION_INFO_0_HE NULL +#define OPTION_VAL_AUTO_HE NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_HE NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_HE NULL +#define OPTION_VAL_MIX_HE NULL +#define OPTION_VAL_MIX_SMART_HE NULL +#define OPTION_VAL_LCD_GHOSTING_HE NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_HE NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_HE NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_HE NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_HE NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_HE NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_HE NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_HE NULL +#define OPTION_VAL_5_HE NULL +#define OPTION_VAL_10_HE NULL +#define OPTION_VAL_15_HE NULL +#define OPTION_VAL_20_HE NULL +#define OPTION_VAL_25_HE NULL +#define OPTION_VAL_30_HE NULL +#define OPTION_VAL_35_HE NULL +#define OPTION_VAL_40_HE NULL +#define OPTION_VAL_45_HE NULL +#define OPTION_VAL_50_HE NULL +#define OPTION_VAL_55_HE NULL +#define OPTION_VAL_60_HE NULL +#define OPTION_VAL_65_HE NULL +#define OPTION_VAL_70_HE NULL +#define OPTION_VAL_75_HE NULL +#define OPTION_VAL_80_HE NULL +#define OPTION_VAL_85_HE NULL +#define OPTION_VAL_90_HE NULL +#define OPTION_VAL_95_HE NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_HE NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_HE NULL +#define OPTION_VAL_NO_HE NULL +#define OPTION_VAL_YES_HE NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_HE NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_HE NULL +#define OPTION_VAL_SENSOR_HE NULL +#define MGBA_FORCE_GBP_LABEL_HE NULL +#define MGBA_FORCE_GBP_INFO_0_HE NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_HE NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_HE NULL +#define OPTION_VAL_REMOVE_KNOWN_HE NULL +#define OPTION_VAL_DETECT_AND_REMOVE_HE NULL +#define OPTION_VAL_DON_T_REMOVE_HE NULL +#define MGBA_FRAMESKIP_LABEL_HE NULL +#define MGBA_FRAMESKIP_INFO_0_HE NULL +#define OPTION_VAL_AUTO_THRESHOLD_HE NULL +#define OPTION_VAL_FIXED_INTERVAL_HE NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_HE NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_HE NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_HE NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_HE NULL + +struct retro_core_option_v2_category option_cats_he[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_HE, + CATEGORY_SYSTEM_INFO_0_HE + }, + { + "video", + CATEGORY_VIDEO_LABEL_HE, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_HE +#else + CATEGORY_VIDEO_INFO_1_HE +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_HE, + CATEGORY_AUDIO_INFO_0_HE + }, + { + "input", + CATEGORY_INPUT_LABEL_HE, + CATEGORY_INPUT_INFO_0_HE + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_HE, + CATEGORY_PERFORMANCE_INFO_0_HE + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_he[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_HE, + NULL, + MGBA_GB_MODEL_INFO_0_HE, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_HE }, + { "Game Boy", OPTION_VAL_GAME_BOY_HE }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_HE }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_HE }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_HE }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_HE, + NULL, + MGBA_USE_BIOS_INFO_0_HE, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_HE, + NULL, + MGBA_SKIP_BIOS_INFO_0_HE, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_HE, + NULL, + MGBA_GB_COLORS_INFO_0_HE, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_HE }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_HE, + NULL, + MGBA_SGB_BORDERS_INFO_0_HE, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_HE, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_HE, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_HE }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_HE }, + { "Auto", OPTION_VAL_AUTO_HE }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_HE, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_HE, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_HE }, + { "mix_smart", OPTION_VAL_MIX_SMART_HE }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_HE }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_HE }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_HE, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_HE, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_HE, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_HE, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_HE, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_HE, + NULL, + "audio", + { + { "5", OPTION_VAL_5_HE }, + { "10", OPTION_VAL_10_HE }, + { "15", OPTION_VAL_15_HE }, + { "20", OPTION_VAL_20_HE }, + { "25", OPTION_VAL_25_HE }, + { "30", OPTION_VAL_30_HE }, + { "35", OPTION_VAL_35_HE }, + { "40", OPTION_VAL_40_HE }, + { "45", OPTION_VAL_45_HE }, + { "50", OPTION_VAL_50_HE }, + { "55", OPTION_VAL_55_HE }, + { "60", OPTION_VAL_60_HE }, + { "65", OPTION_VAL_65_HE }, + { "70", OPTION_VAL_70_HE }, + { "75", OPTION_VAL_75_HE }, + { "80", OPTION_VAL_80_HE }, + { "85", OPTION_VAL_85_HE }, + { "90", OPTION_VAL_90_HE }, + { "95", OPTION_VAL_95_HE }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_HE, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_HE, + NULL, + "input", + { + { "no", OPTION_VAL_NO_HE }, + { "yes", OPTION_VAL_YES_HE }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_HE, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_HE, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_HE }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_HE, + NULL, + MGBA_FORCE_GBP_INFO_0_HE, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_HE, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_HE, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_HE }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_HE }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_HE }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_HE, + NULL, + MGBA_FRAMESKIP_INFO_0_HE, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_HE }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_HE }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_HE }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_HE, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_HE, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_HE, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_HE, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_HU NULL +#define CATEGORY_SYSTEM_INFO_0_HU NULL +#define CATEGORY_VIDEO_LABEL_HU "Videó" +#define CATEGORY_VIDEO_INFO_0_HU NULL +#define CATEGORY_VIDEO_INFO_1_HU NULL +#define CATEGORY_AUDIO_LABEL_HU "Hang" +#define CATEGORY_AUDIO_INFO_0_HU NULL +#define CATEGORY_INPUT_LABEL_HU NULL +#define CATEGORY_INPUT_INFO_0_HU NULL +#define CATEGORY_PERFORMANCE_LABEL_HU NULL +#define CATEGORY_PERFORMANCE_INFO_0_HU NULL +#define MGBA_GB_MODEL_LABEL_HU NULL +#define MGBA_GB_MODEL_INFO_0_HU NULL +#define OPTION_VAL_AUTODETECT_HU "Automatikus felismerés" +#define OPTION_VAL_GAME_BOY_HU NULL +#define OPTION_VAL_SUPER_GAME_BOY_HU NULL +#define OPTION_VAL_GAME_BOY_COLOR_HU NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_HU NULL +#define MGBA_USE_BIOS_LABEL_HU NULL +#define MGBA_USE_BIOS_INFO_0_HU NULL +#define MGBA_SKIP_BIOS_LABEL_HU NULL +#define MGBA_SKIP_BIOS_INFO_0_HU NULL +#define MGBA_GB_COLORS_LABEL_HU NULL +#define MGBA_GB_COLORS_INFO_0_HU NULL +#define OPTION_VAL_GRAYSCALE_HU NULL +#define MGBA_SGB_BORDERS_LABEL_HU NULL +#define MGBA_SGB_BORDERS_INFO_0_HU NULL +#define MGBA_COLOR_CORRECTION_LABEL_HU NULL +#define MGBA_COLOR_CORRECTION_INFO_0_HU NULL +#define OPTION_VAL_AUTO_HU NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_HU NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_HU NULL +#define OPTION_VAL_MIX_HU NULL +#define OPTION_VAL_MIX_SMART_HU NULL +#define OPTION_VAL_LCD_GHOSTING_HU NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_HU NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_HU NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_HU NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_HU NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_HU NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_HU NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_HU NULL +#define OPTION_VAL_5_HU NULL +#define OPTION_VAL_10_HU NULL +#define OPTION_VAL_15_HU NULL +#define OPTION_VAL_20_HU NULL +#define OPTION_VAL_25_HU NULL +#define OPTION_VAL_30_HU NULL +#define OPTION_VAL_35_HU NULL +#define OPTION_VAL_40_HU NULL +#define OPTION_VAL_45_HU NULL +#define OPTION_VAL_50_HU NULL +#define OPTION_VAL_55_HU NULL +#define OPTION_VAL_60_HU NULL +#define OPTION_VAL_65_HU NULL +#define OPTION_VAL_70_HU NULL +#define OPTION_VAL_75_HU NULL +#define OPTION_VAL_80_HU NULL +#define OPTION_VAL_85_HU NULL +#define OPTION_VAL_90_HU NULL +#define OPTION_VAL_95_HU NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_HU NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_HU NULL +#define OPTION_VAL_NO_HU NULL +#define OPTION_VAL_YES_HU NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_HU NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_HU NULL +#define OPTION_VAL_SENSOR_HU NULL +#define MGBA_FORCE_GBP_LABEL_HU NULL +#define MGBA_FORCE_GBP_INFO_0_HU NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_HU NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_HU NULL +#define OPTION_VAL_REMOVE_KNOWN_HU NULL +#define OPTION_VAL_DETECT_AND_REMOVE_HU NULL +#define OPTION_VAL_DON_T_REMOVE_HU NULL +#define MGBA_FRAMESKIP_LABEL_HU NULL +#define MGBA_FRAMESKIP_INFO_0_HU NULL +#define OPTION_VAL_AUTO_THRESHOLD_HU NULL +#define OPTION_VAL_FIXED_INTERVAL_HU NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_HU NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_HU NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_HU NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_HU NULL + +struct retro_core_option_v2_category option_cats_hu[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_HU, + CATEGORY_SYSTEM_INFO_0_HU + }, + { + "video", + CATEGORY_VIDEO_LABEL_HU, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_HU +#else + CATEGORY_VIDEO_INFO_1_HU +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_HU, + CATEGORY_AUDIO_INFO_0_HU + }, + { + "input", + CATEGORY_INPUT_LABEL_HU, + CATEGORY_INPUT_INFO_0_HU + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_HU, + CATEGORY_PERFORMANCE_INFO_0_HU + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_hu[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_HU, + NULL, + MGBA_GB_MODEL_INFO_0_HU, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_HU }, + { "Game Boy", OPTION_VAL_GAME_BOY_HU }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_HU }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_HU }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_HU }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_HU, + NULL, + MGBA_USE_BIOS_INFO_0_HU, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_HU, + NULL, + MGBA_SKIP_BIOS_INFO_0_HU, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_HU, + NULL, + MGBA_GB_COLORS_INFO_0_HU, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_HU }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_HU, + NULL, + MGBA_SGB_BORDERS_INFO_0_HU, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_HU, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_HU, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_HU }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_HU }, + { "Auto", OPTION_VAL_AUTO_HU }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_HU, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_HU, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_HU }, + { "mix_smart", OPTION_VAL_MIX_SMART_HU }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_HU }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_HU }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_HU, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_HU, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_HU, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_HU, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_HU, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_HU, + NULL, + "audio", + { + { "5", OPTION_VAL_5_HU }, + { "10", OPTION_VAL_10_HU }, + { "15", OPTION_VAL_15_HU }, + { "20", OPTION_VAL_20_HU }, + { "25", OPTION_VAL_25_HU }, + { "30", OPTION_VAL_30_HU }, + { "35", OPTION_VAL_35_HU }, + { "40", OPTION_VAL_40_HU }, + { "45", OPTION_VAL_45_HU }, + { "50", OPTION_VAL_50_HU }, + { "55", OPTION_VAL_55_HU }, + { "60", OPTION_VAL_60_HU }, + { "65", OPTION_VAL_65_HU }, + { "70", OPTION_VAL_70_HU }, + { "75", OPTION_VAL_75_HU }, + { "80", OPTION_VAL_80_HU }, + { "85", OPTION_VAL_85_HU }, + { "90", OPTION_VAL_90_HU }, + { "95", OPTION_VAL_95_HU }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_HU, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_HU, + NULL, + "input", + { + { "no", OPTION_VAL_NO_HU }, + { "yes", OPTION_VAL_YES_HU }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_HU, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_HU, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_HU }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_HU, + NULL, + MGBA_FORCE_GBP_INFO_0_HU, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_HU, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_HU, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_HU }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_HU }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_HU }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_HU, + NULL, + MGBA_FRAMESKIP_INFO_0_HU, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_HU }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_HU }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_HU }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_HU, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_HU, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_HU, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_HU, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_ID NULL +#define CATEGORY_SYSTEM_INFO_0_ID NULL +#define CATEGORY_VIDEO_LABEL_ID NULL +#define CATEGORY_VIDEO_INFO_0_ID NULL +#define CATEGORY_VIDEO_INFO_1_ID NULL +#define CATEGORY_AUDIO_LABEL_ID "Suara" +#define CATEGORY_AUDIO_INFO_0_ID NULL +#define CATEGORY_INPUT_LABEL_ID NULL +#define CATEGORY_INPUT_INFO_0_ID NULL +#define CATEGORY_PERFORMANCE_LABEL_ID NULL +#define CATEGORY_PERFORMANCE_INFO_0_ID NULL +#define MGBA_GB_MODEL_LABEL_ID NULL +#define MGBA_GB_MODEL_INFO_0_ID NULL +#define OPTION_VAL_AUTODETECT_ID NULL +#define OPTION_VAL_GAME_BOY_ID NULL +#define OPTION_VAL_SUPER_GAME_BOY_ID NULL +#define OPTION_VAL_GAME_BOY_COLOR_ID NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_ID NULL +#define MGBA_USE_BIOS_LABEL_ID NULL +#define MGBA_USE_BIOS_INFO_0_ID NULL +#define MGBA_SKIP_BIOS_LABEL_ID NULL +#define MGBA_SKIP_BIOS_INFO_0_ID NULL +#define MGBA_GB_COLORS_LABEL_ID NULL +#define MGBA_GB_COLORS_INFO_0_ID NULL +#define OPTION_VAL_GRAYSCALE_ID NULL +#define MGBA_SGB_BORDERS_LABEL_ID NULL +#define MGBA_SGB_BORDERS_INFO_0_ID NULL +#define MGBA_COLOR_CORRECTION_LABEL_ID NULL +#define MGBA_COLOR_CORRECTION_INFO_0_ID NULL +#define OPTION_VAL_AUTO_ID NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_ID NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_ID NULL +#define OPTION_VAL_MIX_ID NULL +#define OPTION_VAL_MIX_SMART_ID NULL +#define OPTION_VAL_LCD_GHOSTING_ID NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_ID NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_ID NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_ID NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_ID NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_ID NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_ID NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_ID NULL +#define OPTION_VAL_5_ID NULL +#define OPTION_VAL_10_ID NULL +#define OPTION_VAL_15_ID NULL +#define OPTION_VAL_20_ID NULL +#define OPTION_VAL_25_ID NULL +#define OPTION_VAL_30_ID NULL +#define OPTION_VAL_35_ID NULL +#define OPTION_VAL_40_ID NULL +#define OPTION_VAL_45_ID NULL +#define OPTION_VAL_50_ID NULL +#define OPTION_VAL_55_ID NULL +#define OPTION_VAL_60_ID NULL +#define OPTION_VAL_65_ID NULL +#define OPTION_VAL_70_ID NULL +#define OPTION_VAL_75_ID NULL +#define OPTION_VAL_80_ID NULL +#define OPTION_VAL_85_ID NULL +#define OPTION_VAL_90_ID NULL +#define OPTION_VAL_95_ID NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_ID NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_ID NULL +#define OPTION_VAL_NO_ID NULL +#define OPTION_VAL_YES_ID NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_ID NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_ID NULL +#define OPTION_VAL_SENSOR_ID NULL +#define MGBA_FORCE_GBP_LABEL_ID NULL +#define MGBA_FORCE_GBP_INFO_0_ID NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_ID NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_ID NULL +#define OPTION_VAL_REMOVE_KNOWN_ID NULL +#define OPTION_VAL_DETECT_AND_REMOVE_ID NULL +#define OPTION_VAL_DON_T_REMOVE_ID NULL +#define MGBA_FRAMESKIP_LABEL_ID NULL +#define MGBA_FRAMESKIP_INFO_0_ID NULL +#define OPTION_VAL_AUTO_THRESHOLD_ID NULL +#define OPTION_VAL_FIXED_INTERVAL_ID NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_ID NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_ID NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_ID NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_ID NULL + +struct retro_core_option_v2_category option_cats_id[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_ID, + CATEGORY_SYSTEM_INFO_0_ID + }, + { + "video", + CATEGORY_VIDEO_LABEL_ID, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_ID +#else + CATEGORY_VIDEO_INFO_1_ID +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_ID, + CATEGORY_AUDIO_INFO_0_ID + }, + { + "input", + CATEGORY_INPUT_LABEL_ID, + CATEGORY_INPUT_INFO_0_ID + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_ID, + CATEGORY_PERFORMANCE_INFO_0_ID + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_id[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_ID, + NULL, + MGBA_GB_MODEL_INFO_0_ID, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_ID }, + { "Game Boy", OPTION_VAL_GAME_BOY_ID }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_ID }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_ID }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_ID }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_ID, + NULL, + MGBA_USE_BIOS_INFO_0_ID, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_ID, + NULL, + MGBA_SKIP_BIOS_INFO_0_ID, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_ID, + NULL, + MGBA_GB_COLORS_INFO_0_ID, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_ID }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_ID, + NULL, + MGBA_SGB_BORDERS_INFO_0_ID, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_ID, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_ID, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_ID }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_ID }, + { "Auto", OPTION_VAL_AUTO_ID }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_ID, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_ID, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_ID }, + { "mix_smart", OPTION_VAL_MIX_SMART_ID }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_ID }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_ID }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_ID, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_ID, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_ID, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_ID, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_ID, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_ID, + NULL, + "audio", + { + { "5", OPTION_VAL_5_ID }, + { "10", OPTION_VAL_10_ID }, + { "15", OPTION_VAL_15_ID }, + { "20", OPTION_VAL_20_ID }, + { "25", OPTION_VAL_25_ID }, + { "30", OPTION_VAL_30_ID }, + { "35", OPTION_VAL_35_ID }, + { "40", OPTION_VAL_40_ID }, + { "45", OPTION_VAL_45_ID }, + { "50", OPTION_VAL_50_ID }, + { "55", OPTION_VAL_55_ID }, + { "60", OPTION_VAL_60_ID }, + { "65", OPTION_VAL_65_ID }, + { "70", OPTION_VAL_70_ID }, + { "75", OPTION_VAL_75_ID }, + { "80", OPTION_VAL_80_ID }, + { "85", OPTION_VAL_85_ID }, + { "90", OPTION_VAL_90_ID }, + { "95", OPTION_VAL_95_ID }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_ID, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_ID, + NULL, + "input", + { + { "no", OPTION_VAL_NO_ID }, + { "yes", OPTION_VAL_YES_ID }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_ID, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_ID, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_ID }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_ID, + NULL, + MGBA_FORCE_GBP_INFO_0_ID, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_ID, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_ID, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_ID }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_ID }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_ID }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_ID, + NULL, + MGBA_FRAMESKIP_INFO_0_ID, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_ID }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_ID }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_ID }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_ID, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_ID, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_ID, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_ID, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_IT "Sistema" +#define CATEGORY_SYSTEM_INFO_0_IT "Configura i parametri di selezione hardware base / BIOS." +#define CATEGORY_VIDEO_LABEL_IT NULL +#define CATEGORY_VIDEO_INFO_0_IT "Configura i bordi della tavolozza DMG / SGB / correzione del colore / effetti fantasma LCD." +#define CATEGORY_VIDEO_INFO_1_IT "Configura i bordi della tavolozza DMG / SGB." +#define CATEGORY_AUDIO_LABEL_IT NULL +#define CATEGORY_AUDIO_INFO_0_IT "Configura il filtro audio." +#define CATEGORY_INPUT_LABEL_IT "Dispositivi Di Ingresso E Ausiliari" +#define CATEGORY_INPUT_INFO_0_IT "Configurare le impostazioni del controller / sensore di ingresso e della vibrazione del controller." +#define CATEGORY_PERFORMANCE_LABEL_IT "Prestazioni" +#define CATEGORY_PERFORMANCE_INFO_0_IT "Configura i parametri di rimozione del ciclo inattivo / frameskipping." +#define MGBA_GB_MODEL_LABEL_IT "Modello Game Boy (richiede riavvio)" +#define MGBA_GB_MODEL_INFO_0_IT "Esegue il contenuto caricato con un modello specifico di Game Boy. 'Rivela Automaticamente' selezionerà il modello più appropriato per il gioco attuale." +#define OPTION_VAL_AUTODETECT_IT "Rivela Automaticamente" +#define OPTION_VAL_GAME_BOY_IT NULL +#define OPTION_VAL_SUPER_GAME_BOY_IT NULL +#define OPTION_VAL_GAME_BOY_COLOR_IT NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_IT NULL +#define MGBA_USE_BIOS_LABEL_IT "Usa il File BIOS se Presente (richiede riavvio)" +#define MGBA_USE_BIOS_INFO_0_IT "Usa il BIOS/bootloader ufficiale per hardware emulato, se presente nella cartella di sistema di RetroArch." +#define MGBA_SKIP_BIOS_LABEL_IT "Salta Intro BIOS (richiede riavvio)" +#define MGBA_SKIP_BIOS_INFO_0_IT "Salta il filmato del logo di avvio se si usa un BIOS/bootloader ufficiale. Questa impostazione è ignorata se 'Usa il file BIOS se presente' è disabilitato." +#define MGBA_GB_COLORS_LABEL_IT "Tavolozza Game Boy Predefinita" +#define MGBA_GB_COLORS_INFO_0_IT "Seleziona quale tavolozza è utilizzata per i giochi Game Boy che non sono compatibili con Game Boy Color o Super Game Boy, o se il modello è costretto a Game Boy." +#define OPTION_VAL_GRAYSCALE_IT "Scala di grigi" +#define MGBA_SGB_BORDERS_LABEL_IT "Utilizza i Bordi Super Game Boy (richiede riavvio)" +#define MGBA_SGB_BORDERS_INFO_0_IT "Visualizza i bordi del Super Game Boy quando apri un gioco potenziato dal Super Game Boy." +#define MGBA_COLOR_CORRECTION_LABEL_IT "Correzione Colore" +#define MGBA_COLOR_CORRECTION_INFO_0_IT "Regola i colori per corrispondere lo schermo di GBA/GBC reali." +#define OPTION_VAL_AUTO_IT NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_IT "Combinazione Interframe" +#define MGBA_INTERFRAME_BLENDING_INFO_0_IT "Simula gli effetti fantasma LCD. 'Semplice' esegue un mix di 50:50 dei fotogrammi attuali e precedenti. 'Smart' tenta di rilevare lo sfarfallio dello schermo, ed esegue solo un mix di 50:50 sui pixel interessati. 'LCD Ghosting' imita i tempi naturali di risposta LCD combinando più frame tamponati. 'Semplice' o 'Smart' miscela è necessario quando si gioca a giochi che sfruttano aggressivamente il fantasma LCD per gli effetti di trasparenza (Wave Race, Chikyuu Kaihou Gun ZAS, F-Zero, la serie Boktai..)." +#define OPTION_VAL_MIX_IT "Semplice" +#define OPTION_VAL_MIX_SMART_IT "Intelligente" +#define OPTION_VAL_LCD_GHOSTING_IT "Ghosting LCD (preciso)" +#define OPTION_VAL_LCD_GHOSTING_FAST_IT "Ghosting LCD (veloce)" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_IT "Filtro Audio" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_IT "Filtro Passaggio-basso" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_IT "Abilita un filtro audio passaggio-basso per ridurre la 'durezza' dell'audio generato." +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_IT "Livello Filtro Audio" +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_IT "Livello Filtro" +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_IT "Specifica la frequenza di cut-off del filtro audio passa-basso. Un valore più elevato aumenta la 'forza' percepita del filtro, poiché una gamma più ampia dello spettro ad alta frequenza è attenuata." +#define OPTION_VAL_5_IT NULL +#define OPTION_VAL_10_IT NULL +#define OPTION_VAL_15_IT NULL +#define OPTION_VAL_20_IT NULL +#define OPTION_VAL_25_IT NULL +#define OPTION_VAL_30_IT NULL +#define OPTION_VAL_35_IT NULL +#define OPTION_VAL_40_IT NULL +#define OPTION_VAL_45_IT NULL +#define OPTION_VAL_50_IT NULL +#define OPTION_VAL_55_IT NULL +#define OPTION_VAL_60_IT NULL +#define OPTION_VAL_65_IT NULL +#define OPTION_VAL_70_IT NULL +#define OPTION_VAL_75_IT NULL +#define OPTION_VAL_80_IT NULL +#define OPTION_VAL_85_IT NULL +#define OPTION_VAL_90_IT NULL +#define OPTION_VAL_95_IT NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_IT "Permetti Input Direzionali Opposti" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_IT "Attivando questa funzionalità ti permette di premere / alternare velocemente / tenere premuti entrambe le direzioni destra e sinistra (oppure su e giù) allo stesso momento. Potrebbe causare dei glitch di movimento." +#define OPTION_VAL_NO_IT NULL +#define OPTION_VAL_YES_IT "si" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_IT "Livello Sensore Solare" +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_IT "Imposta l'intensità solare dell'ambiente. Può essere usato dai giochi che includono un sensore solare nelle loro cartucce, es.: la serie Boktai." +#define OPTION_VAL_SENSOR_IT "Usa sensore dispositivo se disponibile" +#define MGBA_FORCE_GBP_LABEL_IT "Vibrazione Game Boy Player (Riavvio)" +#define MGBA_FORCE_GBP_INFO_0_IT "Abilitando questa opzione i giochi saranno compatibili con il logo di avvio del Game Boy Player per far vibrare il controller. A causa di come Nintendo ha deciso che questa funzione dovrebbe funzionare, può causare problemi come tremolio o ritardo in alcuni di questi giochi." +#define MGBA_IDLE_OPTIMIZATION_LABEL_IT "Rimozione Idle Loop" +#define MGBA_IDLE_OPTIMIZATION_INFO_0_IT "Riduce il carico del sistema ottimizzando gli 'idle-loops' - sezione del codice dove non accade nulla, ma la CPU lavora a velocità massima. Migliora le prestazioni, è consigliato abilitarlo su hardware di bassa fascia." +#define OPTION_VAL_REMOVE_KNOWN_IT "Rimuovi Conosciuti" +#define OPTION_VAL_DETECT_AND_REMOVE_IT "Rileva e Rimuovi" +#define OPTION_VAL_DON_T_REMOVE_IT "Non Rimuovere" +#define MGBA_FRAMESKIP_LABEL_IT "Salta Frame" +#define MGBA_FRAMESKIP_INFO_0_IT "Salta dei frame per migliorare le prestazioni a costo della fluidità dell'immagine. Il valore impostato qui è il numero dei frame rimosso dopo che un frame sia stato renderizzato - ovvero '0' = 60fps, '1' = 30fps, '2' = 15fps, ecc." +#define OPTION_VAL_AUTO_THRESHOLD_IT "Auto (Soglia)" +#define OPTION_VAL_FIXED_INTERVAL_IT "Intervallo Fisso" +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_IT "Soglia salto fotogrammi (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_IT "Quando 'Salto fotogrammi' è impostato a 'Auto (Soglia)', specifica la soglia di occupazione del buffer audio (percentuale) al di sotto della quale i quadri saranno saltati. Valori più elevati riducono il rischio di rompere causando un calo più frequente dei fotogrammi." +#define MGBA_FRAMESKIP_INTERVAL_LABEL_IT "Intervallo Salto Fotogrammi" +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_IT "Quando 'Salto fotogrammi' è impostato a 'Intervallo Fisso', il valore impostato qui è il numero di fotogrammi omessi dopo che un fotogramma è renderizzato - i.. '0' = 60fps, '1' = 30fps, '2' = 15fps, ecc." + +struct retro_core_option_v2_category option_cats_it[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_IT, + CATEGORY_SYSTEM_INFO_0_IT + }, + { + "video", + CATEGORY_VIDEO_LABEL_IT, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_IT +#else + CATEGORY_VIDEO_INFO_1_IT +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_IT, + CATEGORY_AUDIO_INFO_0_IT + }, + { + "input", + CATEGORY_INPUT_LABEL_IT, + CATEGORY_INPUT_INFO_0_IT + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_IT, + CATEGORY_PERFORMANCE_INFO_0_IT + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_it[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_IT, + NULL, + MGBA_GB_MODEL_INFO_0_IT, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_IT }, + { "Game Boy", OPTION_VAL_GAME_BOY_IT }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_IT }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_IT }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_IT }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_IT, + NULL, + MGBA_USE_BIOS_INFO_0_IT, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_IT, + NULL, + MGBA_SKIP_BIOS_INFO_0_IT, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_IT, + NULL, + MGBA_GB_COLORS_INFO_0_IT, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_IT }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_IT, + NULL, + MGBA_SGB_BORDERS_INFO_0_IT, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_IT, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_IT, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_IT }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_IT }, + { "Auto", OPTION_VAL_AUTO_IT }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_IT, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_IT, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_IT }, + { "mix_smart", OPTION_VAL_MIX_SMART_IT }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_IT }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_IT }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_IT, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_IT, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_IT, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_IT, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_IT, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_IT, + NULL, + "audio", + { + { "5", OPTION_VAL_5_IT }, + { "10", OPTION_VAL_10_IT }, + { "15", OPTION_VAL_15_IT }, + { "20", OPTION_VAL_20_IT }, + { "25", OPTION_VAL_25_IT }, + { "30", OPTION_VAL_30_IT }, + { "35", OPTION_VAL_35_IT }, + { "40", OPTION_VAL_40_IT }, + { "45", OPTION_VAL_45_IT }, + { "50", OPTION_VAL_50_IT }, + { "55", OPTION_VAL_55_IT }, + { "60", OPTION_VAL_60_IT }, + { "65", OPTION_VAL_65_IT }, + { "70", OPTION_VAL_70_IT }, + { "75", OPTION_VAL_75_IT }, + { "80", OPTION_VAL_80_IT }, + { "85", OPTION_VAL_85_IT }, + { "90", OPTION_VAL_90_IT }, + { "95", OPTION_VAL_95_IT }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_IT, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_IT, + NULL, + "input", + { + { "no", OPTION_VAL_NO_IT }, + { "yes", OPTION_VAL_YES_IT }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_IT, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_IT, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_IT }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_IT, + NULL, + MGBA_FORCE_GBP_INFO_0_IT, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_IT, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_IT, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_IT }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_IT }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_IT }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_IT, + NULL, + MGBA_FRAMESKIP_INFO_0_IT, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_IT }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_IT }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_IT }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_IT, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_IT, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_IT, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_IT, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_JA "システム" +#define CATEGORY_SYSTEM_INFO_0_JA NULL +#define CATEGORY_VIDEO_LABEL_JA "ビデオのドライバ" +#define CATEGORY_VIDEO_INFO_0_JA NULL +#define CATEGORY_VIDEO_INFO_1_JA NULL +#define CATEGORY_AUDIO_LABEL_JA "オーディオのドライバ" +#define CATEGORY_AUDIO_INFO_0_JA NULL +#define CATEGORY_INPUT_LABEL_JA NULL +#define CATEGORY_INPUT_INFO_0_JA NULL +#define CATEGORY_PERFORMANCE_LABEL_JA NULL +#define CATEGORY_PERFORMANCE_INFO_0_JA NULL +#define MGBA_GB_MODEL_LABEL_JA NULL +#define MGBA_GB_MODEL_INFO_0_JA NULL +#define OPTION_VAL_AUTODETECT_JA "自動検出" +#define OPTION_VAL_GAME_BOY_JA NULL +#define OPTION_VAL_SUPER_GAME_BOY_JA NULL +#define OPTION_VAL_GAME_BOY_COLOR_JA NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_JA NULL +#define MGBA_USE_BIOS_LABEL_JA NULL +#define MGBA_USE_BIOS_INFO_0_JA NULL +#define MGBA_SKIP_BIOS_LABEL_JA NULL +#define MGBA_SKIP_BIOS_INFO_0_JA NULL +#define MGBA_GB_COLORS_LABEL_JA NULL +#define MGBA_GB_COLORS_INFO_0_JA NULL +#define OPTION_VAL_GRAYSCALE_JA NULL +#define MGBA_SGB_BORDERS_LABEL_JA NULL +#define MGBA_SGB_BORDERS_INFO_0_JA NULL +#define MGBA_COLOR_CORRECTION_LABEL_JA NULL +#define MGBA_COLOR_CORRECTION_INFO_0_JA NULL +#define OPTION_VAL_AUTO_JA "自動" +#define MGBA_INTERFRAME_BLENDING_LABEL_JA NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_JA NULL +#define OPTION_VAL_MIX_JA NULL +#define OPTION_VAL_MIX_SMART_JA NULL +#define OPTION_VAL_LCD_GHOSTING_JA NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_JA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_JA "オーディオフィルタ" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_JA NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_JA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_JA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_JA NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_JA NULL +#define OPTION_VAL_5_JA NULL +#define OPTION_VAL_10_JA NULL +#define OPTION_VAL_15_JA NULL +#define OPTION_VAL_20_JA NULL +#define OPTION_VAL_25_JA NULL +#define OPTION_VAL_30_JA NULL +#define OPTION_VAL_35_JA NULL +#define OPTION_VAL_40_JA NULL +#define OPTION_VAL_45_JA NULL +#define OPTION_VAL_50_JA NULL +#define OPTION_VAL_55_JA NULL +#define OPTION_VAL_60_JA NULL +#define OPTION_VAL_65_JA NULL +#define OPTION_VAL_70_JA NULL +#define OPTION_VAL_75_JA NULL +#define OPTION_VAL_80_JA NULL +#define OPTION_VAL_85_JA NULL +#define OPTION_VAL_90_JA NULL +#define OPTION_VAL_95_JA NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_JA NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_JA NULL +#define OPTION_VAL_NO_JA "いいえ" +#define OPTION_VAL_YES_JA "はい" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_JA NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_JA NULL +#define OPTION_VAL_SENSOR_JA NULL +#define MGBA_FORCE_GBP_LABEL_JA NULL +#define MGBA_FORCE_GBP_INFO_0_JA NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_JA NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_JA NULL +#define OPTION_VAL_REMOVE_KNOWN_JA NULL +#define OPTION_VAL_DETECT_AND_REMOVE_JA NULL +#define OPTION_VAL_DON_T_REMOVE_JA NULL +#define MGBA_FRAMESKIP_LABEL_JA NULL +#define MGBA_FRAMESKIP_INFO_0_JA NULL +#define OPTION_VAL_AUTO_THRESHOLD_JA NULL +#define OPTION_VAL_FIXED_INTERVAL_JA NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_JA NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_JA NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_JA NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_JA NULL + +struct retro_core_option_v2_category option_cats_ja[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_JA, + CATEGORY_SYSTEM_INFO_0_JA + }, + { + "video", + CATEGORY_VIDEO_LABEL_JA, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_JA +#else + CATEGORY_VIDEO_INFO_1_JA +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_JA, + CATEGORY_AUDIO_INFO_0_JA + }, + { + "input", + CATEGORY_INPUT_LABEL_JA, + CATEGORY_INPUT_INFO_0_JA + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_JA, + CATEGORY_PERFORMANCE_INFO_0_JA + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ja[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_JA, + NULL, + MGBA_GB_MODEL_INFO_0_JA, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_JA }, + { "Game Boy", OPTION_VAL_GAME_BOY_JA }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_JA }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_JA }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_JA }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_JA, + NULL, + MGBA_USE_BIOS_INFO_0_JA, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_JA, + NULL, + MGBA_SKIP_BIOS_INFO_0_JA, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_JA, + NULL, + MGBA_GB_COLORS_INFO_0_JA, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_JA }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_JA, + NULL, + MGBA_SGB_BORDERS_INFO_0_JA, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_JA, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_JA, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_JA }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_JA }, + { "Auto", OPTION_VAL_AUTO_JA }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_JA, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_JA, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_JA }, + { "mix_smart", OPTION_VAL_MIX_SMART_JA }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_JA }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_JA }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_JA, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_JA, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_JA, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_JA, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_JA, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_JA, + NULL, + "audio", + { + { "5", OPTION_VAL_5_JA }, + { "10", OPTION_VAL_10_JA }, + { "15", OPTION_VAL_15_JA }, + { "20", OPTION_VAL_20_JA }, + { "25", OPTION_VAL_25_JA }, + { "30", OPTION_VAL_30_JA }, + { "35", OPTION_VAL_35_JA }, + { "40", OPTION_VAL_40_JA }, + { "45", OPTION_VAL_45_JA }, + { "50", OPTION_VAL_50_JA }, + { "55", OPTION_VAL_55_JA }, + { "60", OPTION_VAL_60_JA }, + { "65", OPTION_VAL_65_JA }, + { "70", OPTION_VAL_70_JA }, + { "75", OPTION_VAL_75_JA }, + { "80", OPTION_VAL_80_JA }, + { "85", OPTION_VAL_85_JA }, + { "90", OPTION_VAL_90_JA }, + { "95", OPTION_VAL_95_JA }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_JA, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_JA, + NULL, + "input", + { + { "no", OPTION_VAL_NO_JA }, + { "yes", OPTION_VAL_YES_JA }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_JA, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_JA, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_JA }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_JA, + NULL, + MGBA_FORCE_GBP_INFO_0_JA, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_JA, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_JA, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_JA }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_JA }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_JA }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_JA, + NULL, + MGBA_FRAMESKIP_INFO_0_JA, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_JA }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_JA }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_JA }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_JA, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_JA, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_JA, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_JA, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_KO "시스템" +#define CATEGORY_SYSTEM_INFO_0_KO "기본 하드웨어 / BIOS 등을 설정합니다." +#define CATEGORY_VIDEO_LABEL_KO "비디오" +#define CATEGORY_VIDEO_INFO_0_KO "DMG 팔레트 / SGB 보더 / 색상 보정 / LCD 고스팅 효과 등을 설정합니다." +#define CATEGORY_VIDEO_INFO_1_KO "DMG 팔레트 / SGB 보더를 설정합니다." +#define CATEGORY_AUDIO_LABEL_KO "오디오" +#define CATEGORY_AUDIO_INFO_0_KO "오디오 필터를 설정합니다." +#define CATEGORY_INPUT_LABEL_KO "입력 및 보조 장치" +#define CATEGORY_INPUT_INFO_0_KO "컨트롤러 / 센서 입력 / 진동 등을 설정합니다." +#define CATEGORY_PERFORMANCE_LABEL_KO "성능" +#define CATEGORY_PERFORMANCE_INFO_0_KO "유휴 루프 제거 / 프레임 스킵 등을 설정합니다." +#define MGBA_GB_MODEL_LABEL_KO "Game Boy 모델 (재시작 필요)" +#define MGBA_GB_MODEL_INFO_0_KO "불러온 컨텐츠를 실행할 Game Boy 모델을 선택합니다. '자동 감지'는 현재 게임에 가장 적절한 모델을 자동으로 선택합니다." +#define OPTION_VAL_AUTODETECT_KO "자동 감지" +#define OPTION_VAL_GAME_BOY_KO NULL +#define OPTION_VAL_SUPER_GAME_BOY_KO NULL +#define OPTION_VAL_GAME_BOY_COLOR_KO NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_KO NULL +#define MGBA_USE_BIOS_LABEL_KO "존재할 경우 BIOS 파일 사용 (재시작 필요)" +#define MGBA_USE_BIOS_INFO_0_KO "RetroArch의 시스템 디렉토리에 존재할 경우, 에뮬레이트하는 하드웨어의 공식 BIOS/부트로더를 사용합니다." +#define MGBA_SKIP_BIOS_LABEL_KO "BIOS 인트로 건너뛰기 (재시작 필요)" +#define MGBA_SKIP_BIOS_INFO_0_KO "공식 BIOS/부트로더를 사용할 때, 시작 로고 애니메이션을 건너뜁니다. 이 설정은 '존재할 경우 BIOS 파일 사용'이 비활성화되어있을 경우 무시됩니다." +#define MGBA_GB_COLORS_LABEL_KO "기본 Game Boy 팔레트" +#define MGBA_GB_COLORS_INFO_0_KO "Game Boy Color 또는 Super Game Boy와 호환되지 않는 Game Boy 게임을 구동하거나, 게임을 강제로 Game Boy 모델로 구동할 경우 사용할 팔레트를 선택합니다." +#define OPTION_VAL_GRAYSCALE_KO "흑백" +#define MGBA_SGB_BORDERS_LABEL_KO "Super Game Boy 보더 사용 (재시작 필요)" +#define MGBA_SGB_BORDERS_INFO_0_KO "Super Game Boy 향상이 지원되는 게임을 구동할 때 Super Game Boy 보더를 표시합니다." +#define MGBA_COLOR_CORRECTION_LABEL_KO "색상 보정" +#define MGBA_COLOR_CORRECTION_INFO_0_KO "출력되는 색상을 실제 GBA/GBC 하드웨어의 디스플레이와 비슷하게 조정합니다." +#define OPTION_VAL_AUTO_KO "자동" +#define MGBA_INTERFRAME_BLENDING_LABEL_KO "프레임 간 혼합" +#define MGBA_INTERFRAME_BLENDING_INFO_0_KO "LCD 고스팅 효과를 흉내냅니다. '단순'은 현재 프레임과 이전 프레임을 50:50 비율로 혼합합니다. '스마트'는 화면 깜빡임을 감지하여 영향을 받는 픽셀만 50:50 비율로 혼합합니다. 'LCD 고스팅' 옵션은 LCD 반응 시간에 따라 여러 프레임을 혼합합니다. LCD 고스팅을 이용해 투명 효과를 구현하는 게임(Wave Race, Chikyuu Kaihou Gun ZAS, F-Zero, Boktai 시리즈 등)을 플레이하려면 '단순' 또는 '스마트' 혼합을 사용해야 합니다." +#define OPTION_VAL_MIX_KO "단순" +#define OPTION_VAL_MIX_SMART_KO "스마트" +#define OPTION_VAL_LCD_GHOSTING_KO "LCD 고스팅 (정확하게)" +#define OPTION_VAL_LCD_GHOSTING_FAST_KO "LCD 고스팅 (빠르게)" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_KO "오디오 필터" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_KO "로우패스 필터" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_KO "오디오에 로우패스 필터를 적용하여 '거친' 소리를 줄입니다." +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_KO "오디오 필터 수준" +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_KO "필터 수준" +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_KO "로우패스 오디오 필터의 컷오프 주파수를 지정합니다. 높은 값은 더 넓은 범위의 고주파음을 차단하여 필터의 '강도'를 높입니다." +#define OPTION_VAL_5_KO NULL +#define OPTION_VAL_10_KO NULL +#define OPTION_VAL_15_KO NULL +#define OPTION_VAL_20_KO NULL +#define OPTION_VAL_25_KO NULL +#define OPTION_VAL_30_KO NULL +#define OPTION_VAL_35_KO NULL +#define OPTION_VAL_40_KO NULL +#define OPTION_VAL_45_KO NULL +#define OPTION_VAL_50_KO NULL +#define OPTION_VAL_55_KO NULL +#define OPTION_VAL_60_KO NULL +#define OPTION_VAL_65_KO NULL +#define OPTION_VAL_70_KO NULL +#define OPTION_VAL_75_KO NULL +#define OPTION_VAL_80_KO NULL +#define OPTION_VAL_85_KO NULL +#define OPTION_VAL_90_KO NULL +#define OPTION_VAL_95_KO NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_KO "반대 방향 동시 입력 허용" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_KO "이 옵션을 활성화하면 왼쪽과 오른쪽 (또는 위쪽과 아래쪽) 방향 입력을 동시에 누르거나 빠르게 번갈아 누르는 것을 허용합니다. 이는 움직임 관련 버그를 일으킬 수 있습니다." +#define OPTION_VAL_NO_KO "아니오" +#define OPTION_VAL_YES_KO "예" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_KO "태양광 센서 수준" +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_KO "태양광 센서의 강도를 설정합니다. 카트리지에 태양광 센서를 장착한 일부 게임(예: Boktai 시리즈)에서 사용할 수 있습니다." +#define OPTION_VAL_SENSOR_KO "가능한 경우 장치 센서 사용" +#define MGBA_FORCE_GBP_LABEL_KO "Game Boy Player 진동 (재시작 필요)" +#define MGBA_FORCE_GBP_INFO_0_KO "사용할 경우 Game Boy Player 로고를 표시하는 호환 게임에서 컨트롤러 진동을 사용합니다. Nintendo의 진동 구현 방식 때문에 일부 게임에서는 화면 깜빡임 또는 지연이 발생할 수 있습니다." +#define MGBA_IDLE_OPTIMIZATION_LABEL_KO "유휴 루프 제거" +#define MGBA_IDLE_OPTIMIZATION_INFO_0_KO "아무런 작업도 하지 않지만 CPU를 100% 사용하는 일명 '유휴 루프'를 최적화하여 시스템 부하를 감소시킵니다. 성능을 향상시키며, 저사양 환경에서는 활성화되어야 합니다." +#define OPTION_VAL_REMOVE_KNOWN_KO "알려진 경우만 제거" +#define OPTION_VAL_DETECT_AND_REMOVE_KO "자동 감지하여 제거" +#define OPTION_VAL_DON_T_REMOVE_KO "제거 안 함" +#define MGBA_FRAMESKIP_LABEL_KO "프레임 스킵" +#define MGBA_FRAMESKIP_INFO_0_KO "오디오 버퍼 언더런(소리깨짐) 을 줄이기 위해 프레임 건너뛰기를 합니다. 시각적인 부드러움을 포기하는 대신 성능이 향상됩니다. '자동'은 프론트엔드의 추천값으로 실행되고 '자동 (임계값)'은 '프레임 건너뛰기 임계값(%)' 설정을 이용해 실행됩니다. '고정 간격'은 '프레임 스킵 간격' 설정을 이용합니다." +#define OPTION_VAL_AUTO_THRESHOLD_KO "자동 (임계값)" +#define OPTION_VAL_FIXED_INTERVAL_KO "고정 간격" +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_KO "프레임 스킵 임계값 (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_KO "'프레임 건너뛰기'가 '자동 (임계값)'일 경우 건너뛸 프레임에 대한 오디오 버퍼 점유 임계점 (퍼센트) 을 설정하게됩니다. 값이 높을 수록 프레임은 떨어지고 그 대신 소리 깨짐 현상은 줄어들게 됩니다." +#define MGBA_FRAMESKIP_INTERVAL_LABEL_KO "프레임 스킵 간격" +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_KO "'프레임 건너뛰기'가 '고정 간격'일 경우, 프레임을 표시한 뒤 여기에 지정한 수만큼 다음 프레임을 건너뜁니다. 예: '0' = 60fps, '1' = 30fps, '2' = 15fps..." + +struct retro_core_option_v2_category option_cats_ko[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_KO, + CATEGORY_SYSTEM_INFO_0_KO + }, + { + "video", + CATEGORY_VIDEO_LABEL_KO, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_KO +#else + CATEGORY_VIDEO_INFO_1_KO +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_KO, + CATEGORY_AUDIO_INFO_0_KO + }, + { + "input", + CATEGORY_INPUT_LABEL_KO, + CATEGORY_INPUT_INFO_0_KO + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_KO, + CATEGORY_PERFORMANCE_INFO_0_KO + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ko[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_KO, + NULL, + MGBA_GB_MODEL_INFO_0_KO, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_KO }, + { "Game Boy", OPTION_VAL_GAME_BOY_KO }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_KO }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_KO }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_KO }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_KO, + NULL, + MGBA_USE_BIOS_INFO_0_KO, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_KO, + NULL, + MGBA_SKIP_BIOS_INFO_0_KO, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_KO, + NULL, + MGBA_GB_COLORS_INFO_0_KO, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_KO }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_KO, + NULL, + MGBA_SGB_BORDERS_INFO_0_KO, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_KO, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_KO, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_KO }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_KO }, + { "Auto", OPTION_VAL_AUTO_KO }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_KO, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_KO, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_KO }, + { "mix_smart", OPTION_VAL_MIX_SMART_KO }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_KO }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_KO }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_KO, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_KO, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_KO, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_KO, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_KO, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_KO, + NULL, + "audio", + { + { "5", OPTION_VAL_5_KO }, + { "10", OPTION_VAL_10_KO }, + { "15", OPTION_VAL_15_KO }, + { "20", OPTION_VAL_20_KO }, + { "25", OPTION_VAL_25_KO }, + { "30", OPTION_VAL_30_KO }, + { "35", OPTION_VAL_35_KO }, + { "40", OPTION_VAL_40_KO }, + { "45", OPTION_VAL_45_KO }, + { "50", OPTION_VAL_50_KO }, + { "55", OPTION_VAL_55_KO }, + { "60", OPTION_VAL_60_KO }, + { "65", OPTION_VAL_65_KO }, + { "70", OPTION_VAL_70_KO }, + { "75", OPTION_VAL_75_KO }, + { "80", OPTION_VAL_80_KO }, + { "85", OPTION_VAL_85_KO }, + { "90", OPTION_VAL_90_KO }, + { "95", OPTION_VAL_95_KO }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_KO, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_KO, + NULL, + "input", + { + { "no", OPTION_VAL_NO_KO }, + { "yes", OPTION_VAL_YES_KO }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_KO, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_KO, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_KO }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_KO, + NULL, + MGBA_FORCE_GBP_INFO_0_KO, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_KO, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_KO, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_KO }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_KO }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_KO }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_KO, + NULL, + MGBA_FRAMESKIP_INFO_0_KO, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_KO }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_KO }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_KO }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_KO, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_KO, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_KO, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_KO, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_MT NULL +#define CATEGORY_SYSTEM_INFO_0_MT NULL +#define CATEGORY_VIDEO_LABEL_MT NULL +#define CATEGORY_VIDEO_INFO_0_MT NULL +#define CATEGORY_VIDEO_INFO_1_MT NULL +#define CATEGORY_AUDIO_LABEL_MT NULL +#define CATEGORY_AUDIO_INFO_0_MT NULL +#define CATEGORY_INPUT_LABEL_MT NULL +#define CATEGORY_INPUT_INFO_0_MT NULL +#define CATEGORY_PERFORMANCE_LABEL_MT NULL +#define CATEGORY_PERFORMANCE_INFO_0_MT NULL +#define MGBA_GB_MODEL_LABEL_MT NULL +#define MGBA_GB_MODEL_INFO_0_MT NULL +#define OPTION_VAL_AUTODETECT_MT NULL +#define OPTION_VAL_GAME_BOY_MT NULL +#define OPTION_VAL_SUPER_GAME_BOY_MT NULL +#define OPTION_VAL_GAME_BOY_COLOR_MT NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_MT NULL +#define MGBA_USE_BIOS_LABEL_MT NULL +#define MGBA_USE_BIOS_INFO_0_MT NULL +#define MGBA_SKIP_BIOS_LABEL_MT NULL +#define MGBA_SKIP_BIOS_INFO_0_MT NULL +#define MGBA_GB_COLORS_LABEL_MT NULL +#define MGBA_GB_COLORS_INFO_0_MT NULL +#define OPTION_VAL_GRAYSCALE_MT NULL +#define MGBA_SGB_BORDERS_LABEL_MT NULL +#define MGBA_SGB_BORDERS_INFO_0_MT NULL +#define MGBA_COLOR_CORRECTION_LABEL_MT NULL +#define MGBA_COLOR_CORRECTION_INFO_0_MT NULL +#define OPTION_VAL_AUTO_MT NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_MT NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_MT NULL +#define OPTION_VAL_MIX_MT NULL +#define OPTION_VAL_MIX_SMART_MT NULL +#define OPTION_VAL_LCD_GHOSTING_MT NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_MT NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_MT NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_MT NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_MT NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_MT NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_MT NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_MT NULL +#define OPTION_VAL_5_MT NULL +#define OPTION_VAL_10_MT NULL +#define OPTION_VAL_15_MT NULL +#define OPTION_VAL_20_MT NULL +#define OPTION_VAL_25_MT NULL +#define OPTION_VAL_30_MT NULL +#define OPTION_VAL_35_MT NULL +#define OPTION_VAL_40_MT NULL +#define OPTION_VAL_45_MT NULL +#define OPTION_VAL_50_MT NULL +#define OPTION_VAL_55_MT NULL +#define OPTION_VAL_60_MT NULL +#define OPTION_VAL_65_MT NULL +#define OPTION_VAL_70_MT NULL +#define OPTION_VAL_75_MT NULL +#define OPTION_VAL_80_MT NULL +#define OPTION_VAL_85_MT NULL +#define OPTION_VAL_90_MT NULL +#define OPTION_VAL_95_MT NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_MT NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_MT NULL +#define OPTION_VAL_NO_MT NULL +#define OPTION_VAL_YES_MT NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_MT NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_MT NULL +#define OPTION_VAL_SENSOR_MT NULL +#define MGBA_FORCE_GBP_LABEL_MT NULL +#define MGBA_FORCE_GBP_INFO_0_MT NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_MT NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_MT NULL +#define OPTION_VAL_REMOVE_KNOWN_MT NULL +#define OPTION_VAL_DETECT_AND_REMOVE_MT NULL +#define OPTION_VAL_DON_T_REMOVE_MT NULL +#define MGBA_FRAMESKIP_LABEL_MT NULL +#define MGBA_FRAMESKIP_INFO_0_MT NULL +#define OPTION_VAL_AUTO_THRESHOLD_MT NULL +#define OPTION_VAL_FIXED_INTERVAL_MT NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_MT NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_MT NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_MT NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_MT NULL + +struct retro_core_option_v2_category option_cats_mt[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_MT, + CATEGORY_SYSTEM_INFO_0_MT + }, + { + "video", + CATEGORY_VIDEO_LABEL_MT, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_MT +#else + CATEGORY_VIDEO_INFO_1_MT +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_MT, + CATEGORY_AUDIO_INFO_0_MT + }, + { + "input", + CATEGORY_INPUT_LABEL_MT, + CATEGORY_INPUT_INFO_0_MT + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_MT, + CATEGORY_PERFORMANCE_INFO_0_MT + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_mt[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_MT, + NULL, + MGBA_GB_MODEL_INFO_0_MT, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_MT }, + { "Game Boy", OPTION_VAL_GAME_BOY_MT }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_MT }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_MT }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_MT }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_MT, + NULL, + MGBA_USE_BIOS_INFO_0_MT, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_MT, + NULL, + MGBA_SKIP_BIOS_INFO_0_MT, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_MT, + NULL, + MGBA_GB_COLORS_INFO_0_MT, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_MT }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_MT, + NULL, + MGBA_SGB_BORDERS_INFO_0_MT, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_MT, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_MT, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_MT }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_MT }, + { "Auto", OPTION_VAL_AUTO_MT }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_MT, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_MT, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_MT }, + { "mix_smart", OPTION_VAL_MIX_SMART_MT }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_MT }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_MT }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_MT, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_MT, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_MT, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_MT, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_MT, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_MT, + NULL, + "audio", + { + { "5", OPTION_VAL_5_MT }, + { "10", OPTION_VAL_10_MT }, + { "15", OPTION_VAL_15_MT }, + { "20", OPTION_VAL_20_MT }, + { "25", OPTION_VAL_25_MT }, + { "30", OPTION_VAL_30_MT }, + { "35", OPTION_VAL_35_MT }, + { "40", OPTION_VAL_40_MT }, + { "45", OPTION_VAL_45_MT }, + { "50", OPTION_VAL_50_MT }, + { "55", OPTION_VAL_55_MT }, + { "60", OPTION_VAL_60_MT }, + { "65", OPTION_VAL_65_MT }, + { "70", OPTION_VAL_70_MT }, + { "75", OPTION_VAL_75_MT }, + { "80", OPTION_VAL_80_MT }, + { "85", OPTION_VAL_85_MT }, + { "90", OPTION_VAL_90_MT }, + { "95", OPTION_VAL_95_MT }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_MT, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_MT, + NULL, + "input", + { + { "no", OPTION_VAL_NO_MT }, + { "yes", OPTION_VAL_YES_MT }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_MT, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_MT, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_MT }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_MT, + NULL, + MGBA_FORCE_GBP_INFO_0_MT, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_MT, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_MT, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_MT }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_MT }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_MT }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_MT, + NULL, + MGBA_FRAMESKIP_INFO_0_MT, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_MT }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_MT }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_MT }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_MT, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_MT, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_MT, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_MT, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_NL "Systeem" +#define CATEGORY_SYSTEM_INFO_0_NL NULL +#define CATEGORY_VIDEO_LABEL_NL NULL +#define CATEGORY_VIDEO_INFO_0_NL "Configureer DMG palet / SGB randen / kleur correctie / LCD ghosting effecten." +#define CATEGORY_VIDEO_INFO_1_NL "Configureer DMG palet / SGB randen." +#define CATEGORY_AUDIO_LABEL_NL "Geluid" +#define CATEGORY_AUDIO_INFO_0_NL NULL +#define CATEGORY_INPUT_LABEL_NL NULL +#define CATEGORY_INPUT_INFO_0_NL NULL +#define CATEGORY_PERFORMANCE_LABEL_NL NULL +#define CATEGORY_PERFORMANCE_INFO_0_NL NULL +#define MGBA_GB_MODEL_LABEL_NL NULL +#define MGBA_GB_MODEL_INFO_0_NL NULL +#define OPTION_VAL_AUTODETECT_NL "Autodetecteren" +#define OPTION_VAL_GAME_BOY_NL NULL +#define OPTION_VAL_SUPER_GAME_BOY_NL NULL +#define OPTION_VAL_GAME_BOY_COLOR_NL NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_NL NULL +#define MGBA_USE_BIOS_LABEL_NL NULL +#define MGBA_USE_BIOS_INFO_0_NL NULL +#define MGBA_SKIP_BIOS_LABEL_NL NULL +#define MGBA_SKIP_BIOS_INFO_0_NL NULL +#define MGBA_GB_COLORS_LABEL_NL NULL +#define MGBA_GB_COLORS_INFO_0_NL NULL +#define OPTION_VAL_GRAYSCALE_NL NULL +#define MGBA_SGB_BORDERS_LABEL_NL NULL +#define MGBA_SGB_BORDERS_INFO_0_NL NULL +#define MGBA_COLOR_CORRECTION_LABEL_NL NULL +#define MGBA_COLOR_CORRECTION_INFO_0_NL NULL +#define OPTION_VAL_AUTO_NL "Automatisch" +#define MGBA_INTERFRAME_BLENDING_LABEL_NL NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_NL NULL +#define OPTION_VAL_MIX_NL NULL +#define OPTION_VAL_MIX_SMART_NL NULL +#define OPTION_VAL_LCD_GHOSTING_NL NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_NL NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_NL NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_NL NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_NL NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_NL NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_NL NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_NL NULL +#define OPTION_VAL_5_NL NULL +#define OPTION_VAL_10_NL NULL +#define OPTION_VAL_15_NL NULL +#define OPTION_VAL_20_NL NULL +#define OPTION_VAL_25_NL NULL +#define OPTION_VAL_30_NL NULL +#define OPTION_VAL_35_NL NULL +#define OPTION_VAL_40_NL NULL +#define OPTION_VAL_45_NL NULL +#define OPTION_VAL_50_NL NULL +#define OPTION_VAL_55_NL NULL +#define OPTION_VAL_60_NL NULL +#define OPTION_VAL_65_NL NULL +#define OPTION_VAL_70_NL NULL +#define OPTION_VAL_75_NL NULL +#define OPTION_VAL_80_NL NULL +#define OPTION_VAL_85_NL NULL +#define OPTION_VAL_90_NL NULL +#define OPTION_VAL_95_NL NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_NL NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_NL NULL +#define OPTION_VAL_NO_NL "nee" +#define OPTION_VAL_YES_NL "ja" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_NL NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_NL NULL +#define OPTION_VAL_SENSOR_NL NULL +#define MGBA_FORCE_GBP_LABEL_NL NULL +#define MGBA_FORCE_GBP_INFO_0_NL NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_NL NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_NL NULL +#define OPTION_VAL_REMOVE_KNOWN_NL NULL +#define OPTION_VAL_DETECT_AND_REMOVE_NL NULL +#define OPTION_VAL_DON_T_REMOVE_NL NULL +#define MGBA_FRAMESKIP_LABEL_NL NULL +#define MGBA_FRAMESKIP_INFO_0_NL NULL +#define OPTION_VAL_AUTO_THRESHOLD_NL NULL +#define OPTION_VAL_FIXED_INTERVAL_NL NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_NL NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_NL NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_NL NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_NL NULL + +struct retro_core_option_v2_category option_cats_nl[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_NL, + CATEGORY_SYSTEM_INFO_0_NL + }, + { + "video", + CATEGORY_VIDEO_LABEL_NL, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_NL +#else + CATEGORY_VIDEO_INFO_1_NL +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_NL, + CATEGORY_AUDIO_INFO_0_NL + }, + { + "input", + CATEGORY_INPUT_LABEL_NL, + CATEGORY_INPUT_INFO_0_NL + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_NL, + CATEGORY_PERFORMANCE_INFO_0_NL + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_nl[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_NL, + NULL, + MGBA_GB_MODEL_INFO_0_NL, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_NL }, + { "Game Boy", OPTION_VAL_GAME_BOY_NL }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_NL }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_NL }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_NL }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_NL, + NULL, + MGBA_USE_BIOS_INFO_0_NL, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_NL, + NULL, + MGBA_SKIP_BIOS_INFO_0_NL, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_NL, + NULL, + MGBA_GB_COLORS_INFO_0_NL, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_NL }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_NL, + NULL, + MGBA_SGB_BORDERS_INFO_0_NL, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_NL, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_NL, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_NL }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_NL }, + { "Auto", OPTION_VAL_AUTO_NL }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_NL, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_NL, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_NL }, + { "mix_smart", OPTION_VAL_MIX_SMART_NL }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_NL }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_NL }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_NL, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_NL, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_NL, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_NL, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_NL, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_NL, + NULL, + "audio", + { + { "5", OPTION_VAL_5_NL }, + { "10", OPTION_VAL_10_NL }, + { "15", OPTION_VAL_15_NL }, + { "20", OPTION_VAL_20_NL }, + { "25", OPTION_VAL_25_NL }, + { "30", OPTION_VAL_30_NL }, + { "35", OPTION_VAL_35_NL }, + { "40", OPTION_VAL_40_NL }, + { "45", OPTION_VAL_45_NL }, + { "50", OPTION_VAL_50_NL }, + { "55", OPTION_VAL_55_NL }, + { "60", OPTION_VAL_60_NL }, + { "65", OPTION_VAL_65_NL }, + { "70", OPTION_VAL_70_NL }, + { "75", OPTION_VAL_75_NL }, + { "80", OPTION_VAL_80_NL }, + { "85", OPTION_VAL_85_NL }, + { "90", OPTION_VAL_90_NL }, + { "95", OPTION_VAL_95_NL }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_NL, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_NL, + NULL, + "input", + { + { "no", OPTION_VAL_NO_NL }, + { "yes", OPTION_VAL_YES_NL }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_NL, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_NL, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_NL }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_NL, + NULL, + MGBA_FORCE_GBP_INFO_0_NL, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_NL, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_NL, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_NL }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_NL }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_NL }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_NL, + NULL, + MGBA_FRAMESKIP_INFO_0_NL, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_NL }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_NL }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_NL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_NL, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_NL, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_NL, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_NL, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_OC NULL +#define CATEGORY_SYSTEM_INFO_0_OC NULL +#define CATEGORY_VIDEO_LABEL_OC "Vidèo" +#define CATEGORY_VIDEO_INFO_0_OC NULL +#define CATEGORY_VIDEO_INFO_1_OC NULL +#define CATEGORY_AUDIO_LABEL_OC NULL +#define CATEGORY_AUDIO_INFO_0_OC NULL +#define CATEGORY_INPUT_LABEL_OC NULL +#define CATEGORY_INPUT_INFO_0_OC NULL +#define CATEGORY_PERFORMANCE_LABEL_OC NULL +#define CATEGORY_PERFORMANCE_INFO_0_OC NULL +#define MGBA_GB_MODEL_LABEL_OC NULL +#define MGBA_GB_MODEL_INFO_0_OC NULL +#define OPTION_VAL_AUTODETECT_OC NULL +#define OPTION_VAL_GAME_BOY_OC NULL +#define OPTION_VAL_SUPER_GAME_BOY_OC NULL +#define OPTION_VAL_GAME_BOY_COLOR_OC NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_OC NULL +#define MGBA_USE_BIOS_LABEL_OC NULL +#define MGBA_USE_BIOS_INFO_0_OC NULL +#define MGBA_SKIP_BIOS_LABEL_OC NULL +#define MGBA_SKIP_BIOS_INFO_0_OC NULL +#define MGBA_GB_COLORS_LABEL_OC NULL +#define MGBA_GB_COLORS_INFO_0_OC NULL +#define OPTION_VAL_GRAYSCALE_OC NULL +#define MGBA_SGB_BORDERS_LABEL_OC NULL +#define MGBA_SGB_BORDERS_INFO_0_OC NULL +#define MGBA_COLOR_CORRECTION_LABEL_OC NULL +#define MGBA_COLOR_CORRECTION_INFO_0_OC NULL +#define OPTION_VAL_AUTO_OC NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_OC NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_OC NULL +#define OPTION_VAL_MIX_OC NULL +#define OPTION_VAL_MIX_SMART_OC NULL +#define OPTION_VAL_LCD_GHOSTING_OC NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_OC NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_OC NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_OC NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_OC NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_OC NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_OC NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_OC NULL +#define OPTION_VAL_5_OC NULL +#define OPTION_VAL_10_OC NULL +#define OPTION_VAL_15_OC NULL +#define OPTION_VAL_20_OC NULL +#define OPTION_VAL_25_OC NULL +#define OPTION_VAL_30_OC NULL +#define OPTION_VAL_35_OC NULL +#define OPTION_VAL_40_OC NULL +#define OPTION_VAL_45_OC NULL +#define OPTION_VAL_50_OC NULL +#define OPTION_VAL_55_OC NULL +#define OPTION_VAL_60_OC NULL +#define OPTION_VAL_65_OC NULL +#define OPTION_VAL_70_OC NULL +#define OPTION_VAL_75_OC NULL +#define OPTION_VAL_80_OC NULL +#define OPTION_VAL_85_OC NULL +#define OPTION_VAL_90_OC NULL +#define OPTION_VAL_95_OC NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_OC NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_OC NULL +#define OPTION_VAL_NO_OC NULL +#define OPTION_VAL_YES_OC NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_OC NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_OC NULL +#define OPTION_VAL_SENSOR_OC NULL +#define MGBA_FORCE_GBP_LABEL_OC NULL +#define MGBA_FORCE_GBP_INFO_0_OC NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_OC NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_OC NULL +#define OPTION_VAL_REMOVE_KNOWN_OC NULL +#define OPTION_VAL_DETECT_AND_REMOVE_OC NULL +#define OPTION_VAL_DON_T_REMOVE_OC NULL +#define MGBA_FRAMESKIP_LABEL_OC NULL +#define MGBA_FRAMESKIP_INFO_0_OC NULL +#define OPTION_VAL_AUTO_THRESHOLD_OC NULL +#define OPTION_VAL_FIXED_INTERVAL_OC NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_OC NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_OC NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_OC NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_OC NULL + +struct retro_core_option_v2_category option_cats_oc[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_OC, + CATEGORY_SYSTEM_INFO_0_OC + }, + { + "video", + CATEGORY_VIDEO_LABEL_OC, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_OC +#else + CATEGORY_VIDEO_INFO_1_OC +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_OC, + CATEGORY_AUDIO_INFO_0_OC + }, + { + "input", + CATEGORY_INPUT_LABEL_OC, + CATEGORY_INPUT_INFO_0_OC + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_OC, + CATEGORY_PERFORMANCE_INFO_0_OC + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_oc[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_OC, + NULL, + MGBA_GB_MODEL_INFO_0_OC, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_OC }, + { "Game Boy", OPTION_VAL_GAME_BOY_OC }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_OC }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_OC }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_OC }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_OC, + NULL, + MGBA_USE_BIOS_INFO_0_OC, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_OC, + NULL, + MGBA_SKIP_BIOS_INFO_0_OC, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_OC, + NULL, + MGBA_GB_COLORS_INFO_0_OC, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_OC }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_OC, + NULL, + MGBA_SGB_BORDERS_INFO_0_OC, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_OC, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_OC, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_OC }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_OC }, + { "Auto", OPTION_VAL_AUTO_OC }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_OC, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_OC, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_OC }, + { "mix_smart", OPTION_VAL_MIX_SMART_OC }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_OC }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_OC }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_OC, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_OC, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_OC, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_OC, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_OC, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_OC, + NULL, + "audio", + { + { "5", OPTION_VAL_5_OC }, + { "10", OPTION_VAL_10_OC }, + { "15", OPTION_VAL_15_OC }, + { "20", OPTION_VAL_20_OC }, + { "25", OPTION_VAL_25_OC }, + { "30", OPTION_VAL_30_OC }, + { "35", OPTION_VAL_35_OC }, + { "40", OPTION_VAL_40_OC }, + { "45", OPTION_VAL_45_OC }, + { "50", OPTION_VAL_50_OC }, + { "55", OPTION_VAL_55_OC }, + { "60", OPTION_VAL_60_OC }, + { "65", OPTION_VAL_65_OC }, + { "70", OPTION_VAL_70_OC }, + { "75", OPTION_VAL_75_OC }, + { "80", OPTION_VAL_80_OC }, + { "85", OPTION_VAL_85_OC }, + { "90", OPTION_VAL_90_OC }, + { "95", OPTION_VAL_95_OC }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_OC, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_OC, + NULL, + "input", + { + { "no", OPTION_VAL_NO_OC }, + { "yes", OPTION_VAL_YES_OC }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_OC, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_OC, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_OC }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_OC, + NULL, + MGBA_FORCE_GBP_INFO_0_OC, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_OC, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_OC, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_OC }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_OC }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_OC }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_OC, + NULL, + MGBA_FRAMESKIP_INFO_0_OC, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_OC }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_OC }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_OC }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_OC, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_OC, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_OC, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_OC, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_PL NULL +#define CATEGORY_SYSTEM_INFO_0_PL "Skonfiguruj podstawowe ustawienia sprzętowe / parametry BIOS." +#define CATEGORY_VIDEO_LABEL_PL "Wideo" +#define CATEGORY_VIDEO_INFO_0_PL "Skonfiguruj paletę DMG / ramki SGB / korektę kolorów / efekty wizualizacji LCD." +#define CATEGORY_VIDEO_INFO_1_PL "Skonfiguruj paletę DMG / granice SGB." +#define CATEGORY_AUDIO_LABEL_PL NULL +#define CATEGORY_AUDIO_INFO_0_PL "Skonfiguruj filtrowanie audio." +#define CATEGORY_INPUT_LABEL_PL "Urządzenia wejściowe i pomocnicze" +#define CATEGORY_INPUT_INFO_0_PL "Skonfiguruj ustawienia sterownika / czujnika wejściowego i kontrolera." +#define CATEGORY_PERFORMANCE_LABEL_PL "Wydajność" +#define CATEGORY_PERFORMANCE_INFO_0_PL "Skonfiguruj parametry usuwania pętli bezczynności / usuwania ramek." +#define MGBA_GB_MODEL_LABEL_PL "Model Game Boy (restart)" +#define MGBA_GB_MODEL_INFO_0_PL NULL +#define OPTION_VAL_AUTODETECT_PL "Autodetekcja" +#define OPTION_VAL_GAME_BOY_PL NULL +#define OPTION_VAL_SUPER_GAME_BOY_PL NULL +#define OPTION_VAL_GAME_BOY_COLOR_PL NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_PL NULL +#define MGBA_USE_BIOS_LABEL_PL "Użyj pliku BIOS jeśli został znaleziony (Restart)" +#define MGBA_USE_BIOS_INFO_0_PL "Użyj oficjalnego BIOS/bootloadera do emulowanego sprzętu, jeśli jest obecny w katalogu systemowym RetroArch." +#define MGBA_SKIP_BIOS_LABEL_PL "Pomiń wprowadzenie BIOS (restart)" +#define MGBA_SKIP_BIOS_INFO_0_PL NULL +#define MGBA_GB_COLORS_LABEL_PL "Domyślna paleta Game Boy" +#define MGBA_GB_COLORS_INFO_0_PL NULL +#define OPTION_VAL_GRAYSCALE_PL "Odcienie szarości" +#define MGBA_SGB_BORDERS_LABEL_PL NULL +#define MGBA_SGB_BORDERS_INFO_0_PL NULL +#define MGBA_COLOR_CORRECTION_LABEL_PL "Korekcja kolorów" +#define MGBA_COLOR_CORRECTION_INFO_0_PL "Dostosowuje kolory wyjściowe, aby dopasować wyświetlanie rzeczywistego sprzętu GBA/GBC." +#define OPTION_VAL_AUTO_PL NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_PL "Łączenie międzyramowe" +#define MGBA_INTERFRAME_BLENDING_INFO_0_PL NULL +#define OPTION_VAL_MIX_PL "Prosty" +#define OPTION_VAL_MIX_SMART_PL "Inteligentny" +#define OPTION_VAL_LCD_GHOSTING_PL "Ghosting LCD (dokładny)" +#define OPTION_VAL_LCD_GHOSTING_FAST_PL "LCD Ghosting (szybki)" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_PL "Filtr audio" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_PL "Filtr dolnoprzepustowy" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_PL "Włącza filtr dźwiękowy o niskim współczynniku przenikania w celu zmniejszenia \"surowości\" generowanego dźwięku." +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_PL "Poziom filtra dźwięku" +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_PL "Poziom filtrów" +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_PL NULL +#define OPTION_VAL_5_PL NULL +#define OPTION_VAL_10_PL NULL +#define OPTION_VAL_15_PL NULL +#define OPTION_VAL_20_PL NULL +#define OPTION_VAL_25_PL NULL +#define OPTION_VAL_30_PL "30 %" +#define OPTION_VAL_35_PL NULL +#define OPTION_VAL_40_PL NULL +#define OPTION_VAL_45_PL NULL +#define OPTION_VAL_50_PL "50 %" +#define OPTION_VAL_55_PL NULL +#define OPTION_VAL_60_PL "60 %" +#define OPTION_VAL_65_PL NULL +#define OPTION_VAL_70_PL NULL +#define OPTION_VAL_75_PL NULL +#define OPTION_VAL_80_PL "80 %" +#define OPTION_VAL_85_PL NULL +#define OPTION_VAL_90_PL NULL +#define OPTION_VAL_95_PL NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_PL NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_PL NULL +#define OPTION_VAL_NO_PL "nie" +#define OPTION_VAL_YES_PL "tak" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_PL NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_PL NULL +#define OPTION_VAL_SENSOR_PL "Użyj czujnika urządzenia, jeśli jest dostępny" +#define MGBA_FORCE_GBP_LABEL_PL NULL +#define MGBA_FORCE_GBP_INFO_0_PL NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_PL "Usuwanie pętli bezczynności" +#define MGBA_IDLE_OPTIMIZATION_INFO_0_PL NULL +#define OPTION_VAL_REMOVE_KNOWN_PL "Usuń znaną" +#define OPTION_VAL_DETECT_AND_REMOVE_PL "Wykrywanie i usuwanie" +#define OPTION_VAL_DON_T_REMOVE_PL "Nie usuwaj" +#define MGBA_FRAMESKIP_LABEL_PL "Pomijanie klatek" +#define MGBA_FRAMESKIP_INFO_0_PL NULL +#define OPTION_VAL_AUTO_THRESHOLD_PL "Auto (próg)" +#define OPTION_VAL_FIXED_INTERVAL_PL NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_PL "Próg pominięcia ramki (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_PL NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_PL "Odstęp pomiędzy ramkami" +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_PL NULL + +struct retro_core_option_v2_category option_cats_pl[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_PL, + CATEGORY_SYSTEM_INFO_0_PL + }, + { + "video", + CATEGORY_VIDEO_LABEL_PL, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_PL +#else + CATEGORY_VIDEO_INFO_1_PL +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_PL, + CATEGORY_AUDIO_INFO_0_PL + }, + { + "input", + CATEGORY_INPUT_LABEL_PL, + CATEGORY_INPUT_INFO_0_PL + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_PL, + CATEGORY_PERFORMANCE_INFO_0_PL + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_pl[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_PL, + NULL, + MGBA_GB_MODEL_INFO_0_PL, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_PL }, + { "Game Boy", OPTION_VAL_GAME_BOY_PL }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_PL }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_PL }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_PL }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_PL, + NULL, + MGBA_USE_BIOS_INFO_0_PL, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_PL, + NULL, + MGBA_SKIP_BIOS_INFO_0_PL, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_PL, + NULL, + MGBA_GB_COLORS_INFO_0_PL, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_PL }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_PL, + NULL, + MGBA_SGB_BORDERS_INFO_0_PL, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_PL, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_PL, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_PL }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_PL }, + { "Auto", OPTION_VAL_AUTO_PL }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_PL, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_PL, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_PL }, + { "mix_smart", OPTION_VAL_MIX_SMART_PL }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_PL }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_PL }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_PL, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_PL, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_PL, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_PL, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_PL, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_PL, + NULL, + "audio", + { + { "5", OPTION_VAL_5_PL }, + { "10", OPTION_VAL_10_PL }, + { "15", OPTION_VAL_15_PL }, + { "20", OPTION_VAL_20_PL }, + { "25", OPTION_VAL_25_PL }, + { "30", OPTION_VAL_30_PL }, + { "35", OPTION_VAL_35_PL }, + { "40", OPTION_VAL_40_PL }, + { "45", OPTION_VAL_45_PL }, + { "50", OPTION_VAL_50_PL }, + { "55", OPTION_VAL_55_PL }, + { "60", OPTION_VAL_60_PL }, + { "65", OPTION_VAL_65_PL }, + { "70", OPTION_VAL_70_PL }, + { "75", OPTION_VAL_75_PL }, + { "80", OPTION_VAL_80_PL }, + { "85", OPTION_VAL_85_PL }, + { "90", OPTION_VAL_90_PL }, + { "95", OPTION_VAL_95_PL }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_PL, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_PL, + NULL, + "input", + { + { "no", OPTION_VAL_NO_PL }, + { "yes", OPTION_VAL_YES_PL }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_PL, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_PL, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_PL }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_PL, + NULL, + MGBA_FORCE_GBP_INFO_0_PL, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_PL, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_PL, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_PL }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_PL }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_PL }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_PL, + NULL, + MGBA_FRAMESKIP_INFO_0_PL, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_PL }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_PL }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_PL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_PL, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_PL, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_PL, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_PL, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_PT_BR "Sistema" +#define CATEGORY_SYSTEM_INFO_0_PT_BR "Configura os parâmetros de seleção do hardware base e da BIOS." +#define CATEGORY_VIDEO_LABEL_PT_BR "Vídeo" +#define CATEGORY_VIDEO_INFO_0_PT_BR "Configura a paleta de modelos DMG, as bordas do SGB, a correção de cor e os efeitos fantasmas do LCD." +#define CATEGORY_VIDEO_INFO_1_PT_BR "Configura a paleta de modelos DMG e as bordas do SGB." +#define CATEGORY_AUDIO_LABEL_PT_BR "Áudio" +#define CATEGORY_AUDIO_INFO_0_PT_BR "Configura o filtro de áudio." +#define CATEGORY_INPUT_LABEL_PT_BR "Entrada e dispositivos auxiliares" +#define CATEGORY_INPUT_INFO_0_PT_BR "Configura os ajustes dos controles, da entrada dos sensores e da vibração dos controles." +#define CATEGORY_PERFORMANCE_LABEL_PT_BR "Desempenho" +#define CATEGORY_PERFORMANCE_INFO_0_PT_BR "Configura os ajustes dos loops de inatividade e dos pulos de quadros." +#define MGBA_GB_MODEL_LABEL_PT_BR "Modelo do Game Boy (requer reinício)" +#define MGBA_GB_MODEL_INFO_0_PT_BR "Executa o conteúdo carregado utilizando um modelo de Game Boy específico. 'Detectar automaticamente' selecionará o modelo mais apropriado para o jogo atual." +#define OPTION_VAL_AUTODETECT_PT_BR "Detectar automaticamente" +#define OPTION_VAL_GAME_BOY_PT_BR NULL +#define OPTION_VAL_SUPER_GAME_BOY_PT_BR NULL +#define OPTION_VAL_GAME_BOY_COLOR_PT_BR NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_PT_BR NULL +#define MGBA_USE_BIOS_LABEL_PT_BR "Usar arquivo de BIOS se encontrado (requer reinício)" +#define MGBA_USE_BIOS_INFO_0_PT_BR "Usa a BIOS/carregador de inicialização oficial para o hardware emulado, se estiver presente no diretório de sistema do RetroArch." +#define MGBA_SKIP_BIOS_LABEL_PT_BR "Pular introdução da BIOS (requer reinício)" +#define MGBA_SKIP_BIOS_INFO_0_PT_BR "Ao usar uma BIOS e um carregador de inicialização oficial, omitirá a animação do logotipo na inicialização. Esta configuração será ignorada caso 'Usar arquivo de BIOS se encontrado' estiver desativada." +#define MGBA_GB_COLORS_LABEL_PT_BR "Paleta padrão do Game Boy" +#define MGBA_GB_COLORS_INFO_0_PT_BR "Seleciona a paleta que será usada com jogos de Game Boy que não são compatíveis com Game Boy Color ou Super Game Boy ou ao forçar o modelo a Game Boy." +#define OPTION_VAL_GRAYSCALE_PT_BR "Escalas de cinza" +#define MGBA_SGB_BORDERS_LABEL_PT_BR "Usar bordas do Super Game Boy (requer reinício)" +#define MGBA_SGB_BORDERS_INFO_0_PT_BR "Exibe as bordas do Super Game Boy ao jogar jogos compatíveis com esse sistema." +#define MGBA_COLOR_CORRECTION_LABEL_PT_BR "Correção de cor" +#define MGBA_COLOR_CORRECTION_INFO_0_PT_BR "Ajusta as cores de saída para coincidir com a exibição de hardware real do GBA ou GBC." +#define OPTION_VAL_AUTO_PT_BR "Automático" +#define MGBA_INTERFRAME_BLENDING_LABEL_PT_BR "Fusão entre quadros" +#define MGBA_INTERFRAME_BLENDING_INFO_0_PT_BR "Simula o efeito 'fantasma' da tela LCD. 'Simples' mistura metade dos quadros anterior e seguinte. 'Inteligente' tentará detectar a cintilação na tela e irá misturar apenas metade dos quadros nos pixels afetados. 'Efeito fantasma do LCD' simula os tempos naturais de resposta de uma tela de LCD, combinando vários quadros armazenados em buffer. As fusões 'Simples' ou 'Inteligente' são necessárias para jogos que precisam do efeito 'fantasma' para exibir transparência (Wave Race, Chikyuu Kaihou Gun ZAS, F-Zero, a saga Boktai...)." +#define OPTION_VAL_MIX_PT_BR "Simples" +#define OPTION_VAL_MIX_SMART_PT_BR "Inteligente" +#define OPTION_VAL_LCD_GHOSTING_PT_BR "Efeito fantasma do LCD (preciso)" +#define OPTION_VAL_LCD_GHOSTING_FAST_PT_BR "Efeito fantasma do LCD (rápido)" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_PT_BR "Filtro de áudio" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_PT_BR "Filtro passa-baixo" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_PT_BR "Ativa um filtro passa-baixo de áudio para reduzir a estridência do áudio gerado." +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_PT_BR "Nível do filtro de áudio" +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_PT_BR "Nível do filtro" +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_PT_BR "Especifica a frequência de corte do filtro de áudio passa-baixo. Um valor mais alto aumenta a 'força' percebida do filtro, uma vez que uma faixa mais ampla do espectro de alta frequência é atenuada." +#define OPTION_VAL_5_PT_BR NULL +#define OPTION_VAL_10_PT_BR NULL +#define OPTION_VAL_15_PT_BR NULL +#define OPTION_VAL_20_PT_BR NULL +#define OPTION_VAL_25_PT_BR NULL +#define OPTION_VAL_30_PT_BR NULL +#define OPTION_VAL_35_PT_BR NULL +#define OPTION_VAL_40_PT_BR NULL +#define OPTION_VAL_45_PT_BR NULL +#define OPTION_VAL_50_PT_BR NULL +#define OPTION_VAL_55_PT_BR NULL +#define OPTION_VAL_60_PT_BR NULL +#define OPTION_VAL_65_PT_BR NULL +#define OPTION_VAL_70_PT_BR NULL +#define OPTION_VAL_75_PT_BR NULL +#define OPTION_VAL_80_PT_BR NULL +#define OPTION_VAL_85_PT_BR NULL +#define OPTION_VAL_90_PT_BR NULL +#define OPTION_VAL_95_PT_BR NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_PT_BR "Permitir entradas direcionais opostas" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_PT_BR "Esta opção permitira pressionar, alternar ou segurar rapidamente as direções esquerda e direita (ou cima e baixo) ao mesmo tempo. Pode causar falhas de movimento." +#define OPTION_VAL_NO_PT_BR "não" +#define OPTION_VAL_YES_PT_BR "sim" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_PT_BR "Nível do sensor solar" +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_PT_BR "Define a intensidade da luz do sol no ambiente. Pode ser usado por jogos que incluem um sensor solar em seus cartuchos, por exemplo: a série Boktai." +#define OPTION_VAL_SENSOR_PT_BR "Usa um dispositivo sensor, se disponível" +#define MGBA_FORCE_GBP_LABEL_PT_BR "Vibração do Game Boy Player (requer reinício)" +#define MGBA_FORCE_GBP_INFO_0_PT_BR "Permite que os jogos que suportam o logotipo de inicialização do Game Boy Player vibrem o controle. Devido ao método que a Nintendo utilizou, pode causar falhas gráficas como tremulações ou atrasos de sinal em alguns destes jogos." +#define MGBA_IDLE_OPTIMIZATION_LABEL_PT_BR "Remover loops de inatividade" +#define MGBA_IDLE_OPTIMIZATION_INFO_0_PT_BR "Reduz a carga do sistema através da otimização dos chamados 'loops ociosos': seções de código onde nada acontece, mas a CPU está funcionando em velocidade máxima (como quando um carro é acelerado em ponto morto). Ela melhora o desempenho e deve ser habilitada em hardware de baixo desempenho." +#define OPTION_VAL_REMOVE_KNOWN_PT_BR "Eliminar loops conhecidos" +#define OPTION_VAL_DETECT_AND_REMOVE_PT_BR "Detectar e remover" +#define OPTION_VAL_DON_T_REMOVE_PT_BR "Não eliminar" +#define MGBA_FRAMESKIP_LABEL_PT_BR "Pulo de quadro" +#define MGBA_FRAMESKIP_INFO_0_PT_BR "Ignora quadros para evitar o esvaziamento do buffer do áudio (cortes no áudio). Melhora o desempenho ao custo da suavidade visual. A opção 'Automático' ignora os quadros quando for aconselhado pela interface. A opção 'Automático (limite)' utiliza a configuração 'Limite do salto de quadros (%)'. 'Já 'Intervalo fixo', usa a configuração do 'Intervalo de pulo de quadros'." +#define OPTION_VAL_AUTO_THRESHOLD_PT_BR "Automático (limite)" +#define OPTION_VAL_FIXED_INTERVAL_PT_BR "Intervalo fixo" +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_PT_BR "Limite de pulo de quadro (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_PT_BR "Quando o 'Pulo de quadro' for definido como 'Automático (limite)', especifica o limite de ocupação do buffer de áudio (em porcentagem) abaixo do qual os quadros serão pulados. Valores maiores reduzem o risco de engasgos pois farão que os quadros sejam descartados com mais frequência." +#define MGBA_FRAMESKIP_INTERVAL_LABEL_PT_BR "Intervalo de pulo de quadros" +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_PT_BR "Quando o 'Pulo de quadro' é definido como 'Intervalo fixo', o valor atribuído aqui será o número de quadros pulados uma vez que um quadro tenha sido renderizado. Por exemplo: '0' = 60fps, '1' = 30fps, '2' = 15fps, e assim por diante." + +struct retro_core_option_v2_category option_cats_pt_br[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_PT_BR, + CATEGORY_SYSTEM_INFO_0_PT_BR + }, + { + "video", + CATEGORY_VIDEO_LABEL_PT_BR, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_PT_BR +#else + CATEGORY_VIDEO_INFO_1_PT_BR +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_PT_BR, + CATEGORY_AUDIO_INFO_0_PT_BR + }, + { + "input", + CATEGORY_INPUT_LABEL_PT_BR, + CATEGORY_INPUT_INFO_0_PT_BR + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_PT_BR, + CATEGORY_PERFORMANCE_INFO_0_PT_BR + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_pt_br[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_PT_BR, + NULL, + MGBA_GB_MODEL_INFO_0_PT_BR, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_PT_BR }, + { "Game Boy", OPTION_VAL_GAME_BOY_PT_BR }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_PT_BR }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_PT_BR }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_PT_BR }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_PT_BR, + NULL, + MGBA_USE_BIOS_INFO_0_PT_BR, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_PT_BR, + NULL, + MGBA_SKIP_BIOS_INFO_0_PT_BR, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_PT_BR, + NULL, + MGBA_GB_COLORS_INFO_0_PT_BR, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_PT_BR }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_PT_BR, + NULL, + MGBA_SGB_BORDERS_INFO_0_PT_BR, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_PT_BR, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_PT_BR, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_PT_BR }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_PT_BR }, + { "Auto", OPTION_VAL_AUTO_PT_BR }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_PT_BR, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_PT_BR, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_PT_BR }, + { "mix_smart", OPTION_VAL_MIX_SMART_PT_BR }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_PT_BR }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_PT_BR }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_PT_BR, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_PT_BR, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_PT_BR, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_PT_BR, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_PT_BR, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_PT_BR, + NULL, + "audio", + { + { "5", OPTION_VAL_5_PT_BR }, + { "10", OPTION_VAL_10_PT_BR }, + { "15", OPTION_VAL_15_PT_BR }, + { "20", OPTION_VAL_20_PT_BR }, + { "25", OPTION_VAL_25_PT_BR }, + { "30", OPTION_VAL_30_PT_BR }, + { "35", OPTION_VAL_35_PT_BR }, + { "40", OPTION_VAL_40_PT_BR }, + { "45", OPTION_VAL_45_PT_BR }, + { "50", OPTION_VAL_50_PT_BR }, + { "55", OPTION_VAL_55_PT_BR }, + { "60", OPTION_VAL_60_PT_BR }, + { "65", OPTION_VAL_65_PT_BR }, + { "70", OPTION_VAL_70_PT_BR }, + { "75", OPTION_VAL_75_PT_BR }, + { "80", OPTION_VAL_80_PT_BR }, + { "85", OPTION_VAL_85_PT_BR }, + { "90", OPTION_VAL_90_PT_BR }, + { "95", OPTION_VAL_95_PT_BR }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_PT_BR, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_PT_BR, + NULL, + "input", + { + { "no", OPTION_VAL_NO_PT_BR }, + { "yes", OPTION_VAL_YES_PT_BR }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_PT_BR, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_PT_BR, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_PT_BR }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_PT_BR, + NULL, + MGBA_FORCE_GBP_INFO_0_PT_BR, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_PT_BR, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_PT_BR, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_PT_BR }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_PT_BR }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_PT_BR }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_PT_BR, + NULL, + MGBA_FRAMESKIP_INFO_0_PT_BR, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_PT_BR }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_PT_BR }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_PT_BR }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_PT_BR, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_PT_BR, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_PT_BR, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_PT_BR, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_PT_PT NULL +#define CATEGORY_SYSTEM_INFO_0_PT_PT NULL +#define CATEGORY_VIDEO_LABEL_PT_PT "Vídeo" +#define CATEGORY_VIDEO_INFO_0_PT_PT NULL +#define CATEGORY_VIDEO_INFO_1_PT_PT NULL +#define CATEGORY_AUDIO_LABEL_PT_PT "Áudio" +#define CATEGORY_AUDIO_INFO_0_PT_PT NULL +#define CATEGORY_INPUT_LABEL_PT_PT NULL +#define CATEGORY_INPUT_INFO_0_PT_PT NULL +#define CATEGORY_PERFORMANCE_LABEL_PT_PT NULL +#define CATEGORY_PERFORMANCE_INFO_0_PT_PT NULL +#define MGBA_GB_MODEL_LABEL_PT_PT NULL +#define MGBA_GB_MODEL_INFO_0_PT_PT NULL +#define OPTION_VAL_AUTODETECT_PT_PT "Auto-detetar" +#define OPTION_VAL_GAME_BOY_PT_PT NULL +#define OPTION_VAL_SUPER_GAME_BOY_PT_PT NULL +#define OPTION_VAL_GAME_BOY_COLOR_PT_PT NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_PT_PT NULL +#define MGBA_USE_BIOS_LABEL_PT_PT NULL +#define MGBA_USE_BIOS_INFO_0_PT_PT NULL +#define MGBA_SKIP_BIOS_LABEL_PT_PT NULL +#define MGBA_SKIP_BIOS_INFO_0_PT_PT NULL +#define MGBA_GB_COLORS_LABEL_PT_PT NULL +#define MGBA_GB_COLORS_INFO_0_PT_PT NULL +#define OPTION_VAL_GRAYSCALE_PT_PT NULL +#define MGBA_SGB_BORDERS_LABEL_PT_PT NULL +#define MGBA_SGB_BORDERS_INFO_0_PT_PT NULL +#define MGBA_COLOR_CORRECTION_LABEL_PT_PT NULL +#define MGBA_COLOR_CORRECTION_INFO_0_PT_PT NULL +#define OPTION_VAL_AUTO_PT_PT NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_PT_PT NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_PT_PT NULL +#define OPTION_VAL_MIX_PT_PT NULL +#define OPTION_VAL_MIX_SMART_PT_PT NULL +#define OPTION_VAL_LCD_GHOSTING_PT_PT NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_PT_PT NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_PT_PT "Filtro de som" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_PT_PT NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_PT_PT NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_PT_PT NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_PT_PT NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_PT_PT NULL +#define OPTION_VAL_5_PT_PT NULL +#define OPTION_VAL_10_PT_PT NULL +#define OPTION_VAL_15_PT_PT NULL +#define OPTION_VAL_20_PT_PT NULL +#define OPTION_VAL_25_PT_PT NULL +#define OPTION_VAL_30_PT_PT NULL +#define OPTION_VAL_35_PT_PT NULL +#define OPTION_VAL_40_PT_PT NULL +#define OPTION_VAL_45_PT_PT NULL +#define OPTION_VAL_50_PT_PT NULL +#define OPTION_VAL_55_PT_PT NULL +#define OPTION_VAL_60_PT_PT NULL +#define OPTION_VAL_65_PT_PT NULL +#define OPTION_VAL_70_PT_PT NULL +#define OPTION_VAL_75_PT_PT NULL +#define OPTION_VAL_80_PT_PT NULL +#define OPTION_VAL_85_PT_PT NULL +#define OPTION_VAL_90_PT_PT NULL +#define OPTION_VAL_95_PT_PT NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_PT_PT NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_PT_PT NULL +#define OPTION_VAL_NO_PT_PT "não" +#define OPTION_VAL_YES_PT_PT "sim" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_PT_PT NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_PT_PT NULL +#define OPTION_VAL_SENSOR_PT_PT NULL +#define MGBA_FORCE_GBP_LABEL_PT_PT NULL +#define MGBA_FORCE_GBP_INFO_0_PT_PT NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_PT_PT NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_PT_PT NULL +#define OPTION_VAL_REMOVE_KNOWN_PT_PT NULL +#define OPTION_VAL_DETECT_AND_REMOVE_PT_PT NULL +#define OPTION_VAL_DON_T_REMOVE_PT_PT NULL +#define MGBA_FRAMESKIP_LABEL_PT_PT NULL +#define MGBA_FRAMESKIP_INFO_0_PT_PT NULL +#define OPTION_VAL_AUTO_THRESHOLD_PT_PT NULL +#define OPTION_VAL_FIXED_INTERVAL_PT_PT NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_PT_PT NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_PT_PT NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_PT_PT NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_PT_PT NULL + +struct retro_core_option_v2_category option_cats_pt_pt[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_PT_PT, + CATEGORY_SYSTEM_INFO_0_PT_PT + }, + { + "video", + CATEGORY_VIDEO_LABEL_PT_PT, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_PT_PT +#else + CATEGORY_VIDEO_INFO_1_PT_PT +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_PT_PT, + CATEGORY_AUDIO_INFO_0_PT_PT + }, + { + "input", + CATEGORY_INPUT_LABEL_PT_PT, + CATEGORY_INPUT_INFO_0_PT_PT + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_PT_PT, + CATEGORY_PERFORMANCE_INFO_0_PT_PT + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_pt_pt[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_PT_PT, + NULL, + MGBA_GB_MODEL_INFO_0_PT_PT, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_PT_PT }, + { "Game Boy", OPTION_VAL_GAME_BOY_PT_PT }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_PT_PT }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_PT_PT }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_PT_PT }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_PT_PT, + NULL, + MGBA_USE_BIOS_INFO_0_PT_PT, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_PT_PT, + NULL, + MGBA_SKIP_BIOS_INFO_0_PT_PT, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_PT_PT, + NULL, + MGBA_GB_COLORS_INFO_0_PT_PT, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_PT_PT }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_PT_PT, + NULL, + MGBA_SGB_BORDERS_INFO_0_PT_PT, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_PT_PT, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_PT_PT, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_PT_PT }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_PT_PT }, + { "Auto", OPTION_VAL_AUTO_PT_PT }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_PT_PT, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_PT_PT, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_PT_PT }, + { "mix_smart", OPTION_VAL_MIX_SMART_PT_PT }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_PT_PT }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_PT_PT }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_PT_PT, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_PT_PT, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_PT_PT, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_PT_PT, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_PT_PT, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_PT_PT, + NULL, + "audio", + { + { "5", OPTION_VAL_5_PT_PT }, + { "10", OPTION_VAL_10_PT_PT }, + { "15", OPTION_VAL_15_PT_PT }, + { "20", OPTION_VAL_20_PT_PT }, + { "25", OPTION_VAL_25_PT_PT }, + { "30", OPTION_VAL_30_PT_PT }, + { "35", OPTION_VAL_35_PT_PT }, + { "40", OPTION_VAL_40_PT_PT }, + { "45", OPTION_VAL_45_PT_PT }, + { "50", OPTION_VAL_50_PT_PT }, + { "55", OPTION_VAL_55_PT_PT }, + { "60", OPTION_VAL_60_PT_PT }, + { "65", OPTION_VAL_65_PT_PT }, + { "70", OPTION_VAL_70_PT_PT }, + { "75", OPTION_VAL_75_PT_PT }, + { "80", OPTION_VAL_80_PT_PT }, + { "85", OPTION_VAL_85_PT_PT }, + { "90", OPTION_VAL_90_PT_PT }, + { "95", OPTION_VAL_95_PT_PT }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_PT_PT, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_PT_PT, + NULL, + "input", + { + { "no", OPTION_VAL_NO_PT_PT }, + { "yes", OPTION_VAL_YES_PT_PT }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_PT_PT, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_PT_PT, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_PT_PT }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_PT_PT, + NULL, + MGBA_FORCE_GBP_INFO_0_PT_PT, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_PT_PT, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_PT_PT, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_PT_PT }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_PT_PT }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_PT_PT }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_PT_PT, + NULL, + MGBA_FRAMESKIP_INFO_0_PT_PT, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_PT_PT }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_PT_PT }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_PT_PT }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_PT_PT, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_PT_PT, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_PT_PT, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_PT_PT, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_RO NULL +#define CATEGORY_SYSTEM_INFO_0_RO NULL +#define CATEGORY_VIDEO_LABEL_RO NULL +#define CATEGORY_VIDEO_INFO_0_RO NULL +#define CATEGORY_VIDEO_INFO_1_RO NULL +#define CATEGORY_AUDIO_LABEL_RO NULL +#define CATEGORY_AUDIO_INFO_0_RO NULL +#define CATEGORY_INPUT_LABEL_RO NULL +#define CATEGORY_INPUT_INFO_0_RO NULL +#define CATEGORY_PERFORMANCE_LABEL_RO NULL +#define CATEGORY_PERFORMANCE_INFO_0_RO NULL +#define MGBA_GB_MODEL_LABEL_RO NULL +#define MGBA_GB_MODEL_INFO_0_RO NULL +#define OPTION_VAL_AUTODETECT_RO NULL +#define OPTION_VAL_GAME_BOY_RO NULL +#define OPTION_VAL_SUPER_GAME_BOY_RO NULL +#define OPTION_VAL_GAME_BOY_COLOR_RO NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_RO NULL +#define MGBA_USE_BIOS_LABEL_RO NULL +#define MGBA_USE_BIOS_INFO_0_RO NULL +#define MGBA_SKIP_BIOS_LABEL_RO NULL +#define MGBA_SKIP_BIOS_INFO_0_RO NULL +#define MGBA_GB_COLORS_LABEL_RO NULL +#define MGBA_GB_COLORS_INFO_0_RO NULL +#define OPTION_VAL_GRAYSCALE_RO NULL +#define MGBA_SGB_BORDERS_LABEL_RO NULL +#define MGBA_SGB_BORDERS_INFO_0_RO NULL +#define MGBA_COLOR_CORRECTION_LABEL_RO NULL +#define MGBA_COLOR_CORRECTION_INFO_0_RO NULL +#define OPTION_VAL_AUTO_RO NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_RO NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_RO NULL +#define OPTION_VAL_MIX_RO NULL +#define OPTION_VAL_MIX_SMART_RO NULL +#define OPTION_VAL_LCD_GHOSTING_RO NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_RO NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_RO NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_RO NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_RO NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_RO NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_RO NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_RO NULL +#define OPTION_VAL_5_RO NULL +#define OPTION_VAL_10_RO NULL +#define OPTION_VAL_15_RO NULL +#define OPTION_VAL_20_RO NULL +#define OPTION_VAL_25_RO NULL +#define OPTION_VAL_30_RO NULL +#define OPTION_VAL_35_RO NULL +#define OPTION_VAL_40_RO NULL +#define OPTION_VAL_45_RO NULL +#define OPTION_VAL_50_RO NULL +#define OPTION_VAL_55_RO NULL +#define OPTION_VAL_60_RO NULL +#define OPTION_VAL_65_RO NULL +#define OPTION_VAL_70_RO NULL +#define OPTION_VAL_75_RO NULL +#define OPTION_VAL_80_RO NULL +#define OPTION_VAL_85_RO NULL +#define OPTION_VAL_90_RO NULL +#define OPTION_VAL_95_RO NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_RO NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_RO NULL +#define OPTION_VAL_NO_RO NULL +#define OPTION_VAL_YES_RO NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_RO NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_RO NULL +#define OPTION_VAL_SENSOR_RO NULL +#define MGBA_FORCE_GBP_LABEL_RO NULL +#define MGBA_FORCE_GBP_INFO_0_RO NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_RO NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_RO NULL +#define OPTION_VAL_REMOVE_KNOWN_RO NULL +#define OPTION_VAL_DETECT_AND_REMOVE_RO NULL +#define OPTION_VAL_DON_T_REMOVE_RO NULL +#define MGBA_FRAMESKIP_LABEL_RO NULL +#define MGBA_FRAMESKIP_INFO_0_RO NULL +#define OPTION_VAL_AUTO_THRESHOLD_RO NULL +#define OPTION_VAL_FIXED_INTERVAL_RO NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_RO NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_RO NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_RO NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_RO NULL + +struct retro_core_option_v2_category option_cats_ro[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_RO, + CATEGORY_SYSTEM_INFO_0_RO + }, + { + "video", + CATEGORY_VIDEO_LABEL_RO, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_RO +#else + CATEGORY_VIDEO_INFO_1_RO +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_RO, + CATEGORY_AUDIO_INFO_0_RO + }, + { + "input", + CATEGORY_INPUT_LABEL_RO, + CATEGORY_INPUT_INFO_0_RO + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_RO, + CATEGORY_PERFORMANCE_INFO_0_RO + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ro[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_RO, + NULL, + MGBA_GB_MODEL_INFO_0_RO, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_RO }, + { "Game Boy", OPTION_VAL_GAME_BOY_RO }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_RO }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_RO }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_RO }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_RO, + NULL, + MGBA_USE_BIOS_INFO_0_RO, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_RO, + NULL, + MGBA_SKIP_BIOS_INFO_0_RO, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_RO, + NULL, + MGBA_GB_COLORS_INFO_0_RO, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_RO }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_RO, + NULL, + MGBA_SGB_BORDERS_INFO_0_RO, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_RO, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_RO, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_RO }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_RO }, + { "Auto", OPTION_VAL_AUTO_RO }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_RO, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_RO, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_RO }, + { "mix_smart", OPTION_VAL_MIX_SMART_RO }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_RO }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_RO }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_RO, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_RO, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_RO, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_RO, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_RO, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_RO, + NULL, + "audio", + { + { "5", OPTION_VAL_5_RO }, + { "10", OPTION_VAL_10_RO }, + { "15", OPTION_VAL_15_RO }, + { "20", OPTION_VAL_20_RO }, + { "25", OPTION_VAL_25_RO }, + { "30", OPTION_VAL_30_RO }, + { "35", OPTION_VAL_35_RO }, + { "40", OPTION_VAL_40_RO }, + { "45", OPTION_VAL_45_RO }, + { "50", OPTION_VAL_50_RO }, + { "55", OPTION_VAL_55_RO }, + { "60", OPTION_VAL_60_RO }, + { "65", OPTION_VAL_65_RO }, + { "70", OPTION_VAL_70_RO }, + { "75", OPTION_VAL_75_RO }, + { "80", OPTION_VAL_80_RO }, + { "85", OPTION_VAL_85_RO }, + { "90", OPTION_VAL_90_RO }, + { "95", OPTION_VAL_95_RO }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_RO, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_RO, + NULL, + "input", + { + { "no", OPTION_VAL_NO_RO }, + { "yes", OPTION_VAL_YES_RO }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_RO, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_RO, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_RO }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_RO, + NULL, + MGBA_FORCE_GBP_INFO_0_RO, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_RO, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_RO, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_RO }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_RO }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_RO }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_RO, + NULL, + MGBA_FRAMESKIP_INFO_0_RO, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_RO }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_RO }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_RO }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_RO, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_RO, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_RO, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_RO, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_RU "Системные" +#define CATEGORY_SYSTEM_INFO_0_RU "Выбор модели устройства и базовые настройки BIOS." +#define CATEGORY_VIDEO_LABEL_RU "Видео" +#define CATEGORY_VIDEO_INFO_0_RU "Настройки палитры DMG, SGB-рамок, цветокоррекции, эффекта двоения ЖК-дисплея." +#define CATEGORY_VIDEO_INFO_1_RU "Настройка палитры DMG / рамок SGB." +#define CATEGORY_AUDIO_LABEL_RU "Аудио" +#define CATEGORY_AUDIO_INFO_0_RU "Настройки фильтрации звука." +#define CATEGORY_INPUT_LABEL_RU "Управление и вспом. устройства" +#define CATEGORY_INPUT_INFO_0_RU "Настройки параметров ввода, сенсора и отдачи контроллера." +#define CATEGORY_PERFORMANCE_LABEL_RU "Производительность" +#define CATEGORY_PERFORMANCE_INFO_0_RU "Настройки удаления циклов простоя / пропуска кадров." +#define MGBA_GB_MODEL_LABEL_RU "Модель Game Boy (перезапуск)" +#define MGBA_GB_MODEL_INFO_0_RU "Запуск загруженного контента на указанной модели Game Boy. В режиме 'Авто' будет установлена самая подходящая модель для текущей игры." +#define OPTION_VAL_AUTODETECT_RU "Авто" +#define OPTION_VAL_GAME_BOY_RU NULL +#define OPTION_VAL_SUPER_GAME_BOY_RU NULL +#define OPTION_VAL_GAME_BOY_COLOR_RU NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_RU NULL +#define MGBA_USE_BIOS_LABEL_RU "Использовать образ BIOS (перезапуск)" +#define MGBA_USE_BIOS_INFO_0_RU "Использовать для эмуляции консоли официальный BIOS/загрузчик, при наличии образа в системном каталоге RetroArch." +#define MGBA_SKIP_BIOS_LABEL_RU "Пропуск заставки BIOS (перезапуск)" +#define MGBA_SKIP_BIOS_INFO_0_RU "Пропускать начальную анимацию при использовании официального BIOS/загрузчика. Не работает, если выключена опция 'Использовать образ BIOS'." +#define MGBA_GB_COLORS_LABEL_RU "Стандартная палитра Game Boy" +#define MGBA_GB_COLORS_INFO_0_RU "Выбор палитры, используемой для игр Game Boy, несовместимых с Game Boy Color / Super Game Boy или в случае принудительного выбора модели Game Boy." +#define OPTION_VAL_GRAYSCALE_RU "Оттенки серого" +#define MGBA_SGB_BORDERS_LABEL_RU "Рамки Super Game Boy (перезапуск)" +#define MGBA_SGB_BORDERS_INFO_0_RU "Отображать рамки Super Game Boy при запуске игр, улучшенных для Super Game Boy." +#define MGBA_COLOR_CORRECTION_LABEL_RU "Коррекция цвета" +#define MGBA_COLOR_CORRECTION_INFO_0_RU "Настройка отображаемых цветов для соответствия дисплеям реальных GBA/GBC." +#define OPTION_VAL_AUTO_RU "Авто" +#define MGBA_INTERFRAME_BLENDING_LABEL_RU "Межкадровое смешение" +#define MGBA_INTERFRAME_BLENDING_INFO_0_RU "Имитирует эффект двоения ЖК-дисплея. 'Простое' смешивает текущие и предшествующие кадры в пропорции 50:50. 'Умное' пытается определять мерцание экрана и делает смешение 50:50 только для затрагиваемых пикселей. 'Двоение ЖК' имитирует естественное время отклика жк-дисплея объединением нескольких буферизованных кадров. 'Простое' или 'Умное' смешение требуется в играх, широко использующих двоение для эффектов прозрачности (Wave Racer, Chikyuu Kaihou Gun ZAS, F-Zero, серия Boktai...)." +#define OPTION_VAL_MIX_RU "Простое" +#define OPTION_VAL_MIX_SMART_RU "Умное" +#define OPTION_VAL_LCD_GHOSTING_RU "Двоение ЖК (точно)" +#define OPTION_VAL_LCD_GHOSTING_FAST_RU "Двоение ЖК (быстро)" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_RU "Аудиофильтр" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_RU "Фильтр нижних частот" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_RU "Включает низкочастотный аудиофильтр для смягчения воспроизводимого звука." +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_RU "Уровень аудиофильтра" +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_RU "Уровень фильтрации" +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_RU "Установка частоты среза для низкочастотного аудиофильтра. Большие значения усиливают эффект фильтрации за счёт влияния на более широкий диапазон высоких частот." +#define OPTION_VAL_5_RU NULL +#define OPTION_VAL_10_RU NULL +#define OPTION_VAL_15_RU NULL +#define OPTION_VAL_20_RU NULL +#define OPTION_VAL_25_RU NULL +#define OPTION_VAL_30_RU NULL +#define OPTION_VAL_35_RU NULL +#define OPTION_VAL_40_RU NULL +#define OPTION_VAL_45_RU NULL +#define OPTION_VAL_50_RU NULL +#define OPTION_VAL_55_RU NULL +#define OPTION_VAL_60_RU NULL +#define OPTION_VAL_65_RU NULL +#define OPTION_VAL_70_RU NULL +#define OPTION_VAL_75_RU NULL +#define OPTION_VAL_80_RU NULL +#define OPTION_VAL_85_RU NULL +#define OPTION_VAL_90_RU NULL +#define OPTION_VAL_95_RU NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_RU "Разрешать нажатия в разные стороны" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_RU "Позволяет нажимать / быстро менять / зажимать одновременно направления влево и вправо (или вверх и вниз). Может вызывать глитчи, связанные с перемещением." +#define OPTION_VAL_NO_RU "Да" +#define OPTION_VAL_YES_RU "Нет" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_RU "Уровень датчика света" +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_RU "Устанавливает интенсивность окружающего освещения. Может использоваться в играх с картриджами, оснащёнными датчиком света (напр. серия Boktai)." +#define OPTION_VAL_SENSOR_RU "Использовать датчик устройства" +#define MGBA_FORCE_GBP_LABEL_RU "Отдача Game Boy Player (перезапуск)" +#define MGBA_FORCE_GBP_INFO_0_RU "При включении активирует отдачу для совместимых игр с логотипом Game Boy Player на экране загрузки. Из-за особенностей реализации Nintendo, в некоторых играх данная функция может вызывать баги, такие как мерцание или подтормаживания." +#define MGBA_IDLE_OPTIMIZATION_LABEL_RU "Удаление циклов простоя" +#define MGBA_IDLE_OPTIMIZATION_INFO_0_RU "Уменьшает загруженность системы, оптимизируя т.н. 'циклы простоя' - части кода, в которых ничего не происходит, но которые CPU обрабатывает на полной скорости. Повышает производительность и рекомендуется для включения на слабых устройствах." +#define OPTION_VAL_REMOVE_KNOWN_RU "Удалять известные" +#define OPTION_VAL_DETECT_AND_REMOVE_RU "Определять и удалять" +#define OPTION_VAL_DON_T_REMOVE_RU "Не удалять" +#define MGBA_FRAMESKIP_LABEL_RU "Пропуск кадров" +#define MGBA_FRAMESKIP_INFO_0_RU "Пропускать кадры, чтобы избежать опустошения аудиобуфера (треск). Улучшает производительность, но снижает плавность изображения. В режиме 'Авто' пропуск кадров регулируется фронтендом. 'Авто (граница)' использует настройку 'Граница пропуска кадров (%)'. 'Фикс. интервал' использует настройку 'Интервал пропуска кадров'." +#define OPTION_VAL_AUTO_THRESHOLD_RU "Авто (граница)" +#define OPTION_VAL_FIXED_INTERVAL_RU "Фикс. интервал" +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_RU "Граница пропуска кадров (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_RU "Порог заполнения аудиобуфера (в процентах) ниже которого будет включаться пропуск кадров, если для параметра 'Пропуск кадров' выбран режим 'Авто (граница)'. Большие значения снижают вероятность появления треска за счёт более частого пропуска кадров." +#define MGBA_FRAMESKIP_INTERVAL_LABEL_RU "Интервал пропуска кадров" +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_RU "Количество кадров, пропускаемых после рендеринга, если для параметра 'Пропуск кадров' выбран режим 'Фикс. значение', напр. '0' = 60 кадр/с, '1' = 30 кадр/с, '2' = 15 кадр/с и т.д." + +struct retro_core_option_v2_category option_cats_ru[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_RU, + CATEGORY_SYSTEM_INFO_0_RU + }, + { + "video", + CATEGORY_VIDEO_LABEL_RU, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_RU +#else + CATEGORY_VIDEO_INFO_1_RU +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_RU, + CATEGORY_AUDIO_INFO_0_RU + }, + { + "input", + CATEGORY_INPUT_LABEL_RU, + CATEGORY_INPUT_INFO_0_RU + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_RU, + CATEGORY_PERFORMANCE_INFO_0_RU + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_ru[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_RU, + NULL, + MGBA_GB_MODEL_INFO_0_RU, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_RU }, + { "Game Boy", OPTION_VAL_GAME_BOY_RU }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_RU }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_RU }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_RU }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_RU, + NULL, + MGBA_USE_BIOS_INFO_0_RU, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_RU, + NULL, + MGBA_SKIP_BIOS_INFO_0_RU, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_RU, + NULL, + MGBA_GB_COLORS_INFO_0_RU, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_RU }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_RU, + NULL, + MGBA_SGB_BORDERS_INFO_0_RU, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_RU, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_RU, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_RU }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_RU }, + { "Auto", OPTION_VAL_AUTO_RU }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_RU, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_RU, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_RU }, + { "mix_smart", OPTION_VAL_MIX_SMART_RU }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_RU }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_RU }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_RU, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_RU, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_RU, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_RU, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_RU, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_RU, + NULL, + "audio", + { + { "5", OPTION_VAL_5_RU }, + { "10", OPTION_VAL_10_RU }, + { "15", OPTION_VAL_15_RU }, + { "20", OPTION_VAL_20_RU }, + { "25", OPTION_VAL_25_RU }, + { "30", OPTION_VAL_30_RU }, + { "35", OPTION_VAL_35_RU }, + { "40", OPTION_VAL_40_RU }, + { "45", OPTION_VAL_45_RU }, + { "50", OPTION_VAL_50_RU }, + { "55", OPTION_VAL_55_RU }, + { "60", OPTION_VAL_60_RU }, + { "65", OPTION_VAL_65_RU }, + { "70", OPTION_VAL_70_RU }, + { "75", OPTION_VAL_75_RU }, + { "80", OPTION_VAL_80_RU }, + { "85", OPTION_VAL_85_RU }, + { "90", OPTION_VAL_90_RU }, + { "95", OPTION_VAL_95_RU }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_RU, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_RU, + NULL, + "input", + { + { "no", OPTION_VAL_NO_RU }, + { "yes", OPTION_VAL_YES_RU }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_RU, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_RU, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_RU }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_RU, + NULL, + MGBA_FORCE_GBP_INFO_0_RU, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_RU, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_RU, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_RU }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_RU }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_RU }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_RU, + NULL, + MGBA_FRAMESKIP_INFO_0_RU, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_RU }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_RU }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_RU }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_RU, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_RU, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_RU, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_RU, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_SI NULL +#define CATEGORY_SYSTEM_INFO_0_SI NULL +#define CATEGORY_VIDEO_LABEL_SI NULL +#define CATEGORY_VIDEO_INFO_0_SI NULL +#define CATEGORY_VIDEO_INFO_1_SI NULL +#define CATEGORY_AUDIO_LABEL_SI NULL +#define CATEGORY_AUDIO_INFO_0_SI NULL +#define CATEGORY_INPUT_LABEL_SI NULL +#define CATEGORY_INPUT_INFO_0_SI NULL +#define CATEGORY_PERFORMANCE_LABEL_SI NULL +#define CATEGORY_PERFORMANCE_INFO_0_SI NULL +#define MGBA_GB_MODEL_LABEL_SI NULL +#define MGBA_GB_MODEL_INFO_0_SI NULL +#define OPTION_VAL_AUTODETECT_SI NULL +#define OPTION_VAL_GAME_BOY_SI NULL +#define OPTION_VAL_SUPER_GAME_BOY_SI NULL +#define OPTION_VAL_GAME_BOY_COLOR_SI NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_SI NULL +#define MGBA_USE_BIOS_LABEL_SI NULL +#define MGBA_USE_BIOS_INFO_0_SI NULL +#define MGBA_SKIP_BIOS_LABEL_SI NULL +#define MGBA_SKIP_BIOS_INFO_0_SI NULL +#define MGBA_GB_COLORS_LABEL_SI NULL +#define MGBA_GB_COLORS_INFO_0_SI NULL +#define OPTION_VAL_GRAYSCALE_SI NULL +#define MGBA_SGB_BORDERS_LABEL_SI NULL +#define MGBA_SGB_BORDERS_INFO_0_SI NULL +#define MGBA_COLOR_CORRECTION_LABEL_SI NULL +#define MGBA_COLOR_CORRECTION_INFO_0_SI NULL +#define OPTION_VAL_AUTO_SI NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_SI NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_SI NULL +#define OPTION_VAL_MIX_SI NULL +#define OPTION_VAL_MIX_SMART_SI NULL +#define OPTION_VAL_LCD_GHOSTING_SI NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_SI NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_SI NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_SI NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_SI NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_SI NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_SI NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_SI NULL +#define OPTION_VAL_5_SI NULL +#define OPTION_VAL_10_SI NULL +#define OPTION_VAL_15_SI NULL +#define OPTION_VAL_20_SI NULL +#define OPTION_VAL_25_SI NULL +#define OPTION_VAL_30_SI NULL +#define OPTION_VAL_35_SI NULL +#define OPTION_VAL_40_SI NULL +#define OPTION_VAL_45_SI NULL +#define OPTION_VAL_50_SI NULL +#define OPTION_VAL_55_SI NULL +#define OPTION_VAL_60_SI NULL +#define OPTION_VAL_65_SI NULL +#define OPTION_VAL_70_SI NULL +#define OPTION_VAL_75_SI NULL +#define OPTION_VAL_80_SI NULL +#define OPTION_VAL_85_SI NULL +#define OPTION_VAL_90_SI NULL +#define OPTION_VAL_95_SI NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_SI NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_SI NULL +#define OPTION_VAL_NO_SI NULL +#define OPTION_VAL_YES_SI NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_SI NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_SI NULL +#define OPTION_VAL_SENSOR_SI NULL +#define MGBA_FORCE_GBP_LABEL_SI NULL +#define MGBA_FORCE_GBP_INFO_0_SI NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_SI NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_SI NULL +#define OPTION_VAL_REMOVE_KNOWN_SI NULL +#define OPTION_VAL_DETECT_AND_REMOVE_SI NULL +#define OPTION_VAL_DON_T_REMOVE_SI NULL +#define MGBA_FRAMESKIP_LABEL_SI NULL +#define MGBA_FRAMESKIP_INFO_0_SI NULL +#define OPTION_VAL_AUTO_THRESHOLD_SI NULL +#define OPTION_VAL_FIXED_INTERVAL_SI NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_SI NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_SI NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_SI NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_SI NULL + +struct retro_core_option_v2_category option_cats_si[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_SI, + CATEGORY_SYSTEM_INFO_0_SI + }, + { + "video", + CATEGORY_VIDEO_LABEL_SI, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_SI +#else + CATEGORY_VIDEO_INFO_1_SI +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_SI, + CATEGORY_AUDIO_INFO_0_SI + }, + { + "input", + CATEGORY_INPUT_LABEL_SI, + CATEGORY_INPUT_INFO_0_SI + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_SI, + CATEGORY_PERFORMANCE_INFO_0_SI + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_si[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_SI, + NULL, + MGBA_GB_MODEL_INFO_0_SI, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_SI }, + { "Game Boy", OPTION_VAL_GAME_BOY_SI }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_SI }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_SI }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_SI }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_SI, + NULL, + MGBA_USE_BIOS_INFO_0_SI, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_SI, + NULL, + MGBA_SKIP_BIOS_INFO_0_SI, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_SI, + NULL, + MGBA_GB_COLORS_INFO_0_SI, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_SI }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_SI, + NULL, + MGBA_SGB_BORDERS_INFO_0_SI, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_SI, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_SI, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_SI }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_SI }, + { "Auto", OPTION_VAL_AUTO_SI }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_SI, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_SI, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_SI }, + { "mix_smart", OPTION_VAL_MIX_SMART_SI }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_SI }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_SI }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_SI, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_SI, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_SI, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_SI, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_SI, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_SI, + NULL, + "audio", + { + { "5", OPTION_VAL_5_SI }, + { "10", OPTION_VAL_10_SI }, + { "15", OPTION_VAL_15_SI }, + { "20", OPTION_VAL_20_SI }, + { "25", OPTION_VAL_25_SI }, + { "30", OPTION_VAL_30_SI }, + { "35", OPTION_VAL_35_SI }, + { "40", OPTION_VAL_40_SI }, + { "45", OPTION_VAL_45_SI }, + { "50", OPTION_VAL_50_SI }, + { "55", OPTION_VAL_55_SI }, + { "60", OPTION_VAL_60_SI }, + { "65", OPTION_VAL_65_SI }, + { "70", OPTION_VAL_70_SI }, + { "75", OPTION_VAL_75_SI }, + { "80", OPTION_VAL_80_SI }, + { "85", OPTION_VAL_85_SI }, + { "90", OPTION_VAL_90_SI }, + { "95", OPTION_VAL_95_SI }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_SI, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_SI, + NULL, + "input", + { + { "no", OPTION_VAL_NO_SI }, + { "yes", OPTION_VAL_YES_SI }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_SI, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_SI, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_SI }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_SI, + NULL, + MGBA_FORCE_GBP_INFO_0_SI, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_SI, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_SI, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_SI }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_SI }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_SI }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_SI, + NULL, + MGBA_FRAMESKIP_INFO_0_SI, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_SI }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_SI }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_SI }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_SI, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_SI, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_SI, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_SI, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_SK NULL +#define CATEGORY_SYSTEM_INFO_0_SK NULL +#define CATEGORY_VIDEO_LABEL_SK NULL +#define CATEGORY_VIDEO_INFO_0_SK NULL +#define CATEGORY_VIDEO_INFO_1_SK NULL +#define CATEGORY_AUDIO_LABEL_SK "Zvuk" +#define CATEGORY_AUDIO_INFO_0_SK NULL +#define CATEGORY_INPUT_LABEL_SK NULL +#define CATEGORY_INPUT_INFO_0_SK NULL +#define CATEGORY_PERFORMANCE_LABEL_SK NULL +#define CATEGORY_PERFORMANCE_INFO_0_SK NULL +#define MGBA_GB_MODEL_LABEL_SK NULL +#define MGBA_GB_MODEL_INFO_0_SK NULL +#define OPTION_VAL_AUTODETECT_SK NULL +#define OPTION_VAL_GAME_BOY_SK NULL +#define OPTION_VAL_SUPER_GAME_BOY_SK NULL +#define OPTION_VAL_GAME_BOY_COLOR_SK NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_SK NULL +#define MGBA_USE_BIOS_LABEL_SK NULL +#define MGBA_USE_BIOS_INFO_0_SK NULL +#define MGBA_SKIP_BIOS_LABEL_SK NULL +#define MGBA_SKIP_BIOS_INFO_0_SK NULL +#define MGBA_GB_COLORS_LABEL_SK NULL +#define MGBA_GB_COLORS_INFO_0_SK NULL +#define OPTION_VAL_GRAYSCALE_SK NULL +#define MGBA_SGB_BORDERS_LABEL_SK NULL +#define MGBA_SGB_BORDERS_INFO_0_SK NULL +#define MGBA_COLOR_CORRECTION_LABEL_SK NULL +#define MGBA_COLOR_CORRECTION_INFO_0_SK NULL +#define OPTION_VAL_AUTO_SK NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_SK NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_SK NULL +#define OPTION_VAL_MIX_SK NULL +#define OPTION_VAL_MIX_SMART_SK NULL +#define OPTION_VAL_LCD_GHOSTING_SK NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_SK NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_SK "Zvukový filter" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_SK NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_SK NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_SK NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_SK NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_SK NULL +#define OPTION_VAL_5_SK NULL +#define OPTION_VAL_10_SK NULL +#define OPTION_VAL_15_SK NULL +#define OPTION_VAL_20_SK NULL +#define OPTION_VAL_25_SK NULL +#define OPTION_VAL_30_SK NULL +#define OPTION_VAL_35_SK NULL +#define OPTION_VAL_40_SK NULL +#define OPTION_VAL_45_SK NULL +#define OPTION_VAL_50_SK NULL +#define OPTION_VAL_55_SK NULL +#define OPTION_VAL_60_SK NULL +#define OPTION_VAL_65_SK NULL +#define OPTION_VAL_70_SK NULL +#define OPTION_VAL_75_SK NULL +#define OPTION_VAL_80_SK NULL +#define OPTION_VAL_85_SK NULL +#define OPTION_VAL_90_SK NULL +#define OPTION_VAL_95_SK NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_SK NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_SK NULL +#define OPTION_VAL_NO_SK "nie" +#define OPTION_VAL_YES_SK "áno" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_SK NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_SK NULL +#define OPTION_VAL_SENSOR_SK NULL +#define MGBA_FORCE_GBP_LABEL_SK NULL +#define MGBA_FORCE_GBP_INFO_0_SK NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_SK NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_SK NULL +#define OPTION_VAL_REMOVE_KNOWN_SK NULL +#define OPTION_VAL_DETECT_AND_REMOVE_SK NULL +#define OPTION_VAL_DON_T_REMOVE_SK NULL +#define MGBA_FRAMESKIP_LABEL_SK NULL +#define MGBA_FRAMESKIP_INFO_0_SK NULL +#define OPTION_VAL_AUTO_THRESHOLD_SK NULL +#define OPTION_VAL_FIXED_INTERVAL_SK NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_SK NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_SK NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_SK NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_SK NULL + +struct retro_core_option_v2_category option_cats_sk[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_SK, + CATEGORY_SYSTEM_INFO_0_SK + }, + { + "video", + CATEGORY_VIDEO_LABEL_SK, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_SK +#else + CATEGORY_VIDEO_INFO_1_SK +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_SK, + CATEGORY_AUDIO_INFO_0_SK + }, + { + "input", + CATEGORY_INPUT_LABEL_SK, + CATEGORY_INPUT_INFO_0_SK + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_SK, + CATEGORY_PERFORMANCE_INFO_0_SK + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_sk[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_SK, + NULL, + MGBA_GB_MODEL_INFO_0_SK, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_SK }, + { "Game Boy", OPTION_VAL_GAME_BOY_SK }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_SK }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_SK }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_SK }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_SK, + NULL, + MGBA_USE_BIOS_INFO_0_SK, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_SK, + NULL, + MGBA_SKIP_BIOS_INFO_0_SK, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_SK, + NULL, + MGBA_GB_COLORS_INFO_0_SK, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_SK }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_SK, + NULL, + MGBA_SGB_BORDERS_INFO_0_SK, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_SK, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_SK, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_SK }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_SK }, + { "Auto", OPTION_VAL_AUTO_SK }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_SK, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_SK, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_SK }, + { "mix_smart", OPTION_VAL_MIX_SMART_SK }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_SK }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_SK }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_SK, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_SK, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_SK, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_SK, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_SK, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_SK, + NULL, + "audio", + { + { "5", OPTION_VAL_5_SK }, + { "10", OPTION_VAL_10_SK }, + { "15", OPTION_VAL_15_SK }, + { "20", OPTION_VAL_20_SK }, + { "25", OPTION_VAL_25_SK }, + { "30", OPTION_VAL_30_SK }, + { "35", OPTION_VAL_35_SK }, + { "40", OPTION_VAL_40_SK }, + { "45", OPTION_VAL_45_SK }, + { "50", OPTION_VAL_50_SK }, + { "55", OPTION_VAL_55_SK }, + { "60", OPTION_VAL_60_SK }, + { "65", OPTION_VAL_65_SK }, + { "70", OPTION_VAL_70_SK }, + { "75", OPTION_VAL_75_SK }, + { "80", OPTION_VAL_80_SK }, + { "85", OPTION_VAL_85_SK }, + { "90", OPTION_VAL_90_SK }, + { "95", OPTION_VAL_95_SK }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_SK, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_SK, + NULL, + "input", + { + { "no", OPTION_VAL_NO_SK }, + { "yes", OPTION_VAL_YES_SK }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_SK, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_SK, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_SK }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_SK, + NULL, + MGBA_FORCE_GBP_INFO_0_SK, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_SK, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_SK, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_SK }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_SK }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_SK }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_SK, + NULL, + MGBA_FRAMESKIP_INFO_0_SK, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_SK }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_SK }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_SK }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_SK, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_SK, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_SK, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_SK, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_SR NULL +#define CATEGORY_SYSTEM_INFO_0_SR NULL +#define CATEGORY_VIDEO_LABEL_SR NULL +#define CATEGORY_VIDEO_INFO_0_SR NULL +#define CATEGORY_VIDEO_INFO_1_SR NULL +#define CATEGORY_AUDIO_LABEL_SR "Zvuk" +#define CATEGORY_AUDIO_INFO_0_SR NULL +#define CATEGORY_INPUT_LABEL_SR NULL +#define CATEGORY_INPUT_INFO_0_SR NULL +#define CATEGORY_PERFORMANCE_LABEL_SR NULL +#define CATEGORY_PERFORMANCE_INFO_0_SR NULL +#define MGBA_GB_MODEL_LABEL_SR NULL +#define MGBA_GB_MODEL_INFO_0_SR NULL +#define OPTION_VAL_AUTODETECT_SR NULL +#define OPTION_VAL_GAME_BOY_SR NULL +#define OPTION_VAL_SUPER_GAME_BOY_SR NULL +#define OPTION_VAL_GAME_BOY_COLOR_SR NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_SR NULL +#define MGBA_USE_BIOS_LABEL_SR NULL +#define MGBA_USE_BIOS_INFO_0_SR NULL +#define MGBA_SKIP_BIOS_LABEL_SR NULL +#define MGBA_SKIP_BIOS_INFO_0_SR NULL +#define MGBA_GB_COLORS_LABEL_SR NULL +#define MGBA_GB_COLORS_INFO_0_SR NULL +#define OPTION_VAL_GRAYSCALE_SR NULL +#define MGBA_SGB_BORDERS_LABEL_SR NULL +#define MGBA_SGB_BORDERS_INFO_0_SR NULL +#define MGBA_COLOR_CORRECTION_LABEL_SR NULL +#define MGBA_COLOR_CORRECTION_INFO_0_SR NULL +#define OPTION_VAL_AUTO_SR NULL +#define MGBA_INTERFRAME_BLENDING_LABEL_SR NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_SR NULL +#define OPTION_VAL_MIX_SR NULL +#define OPTION_VAL_MIX_SMART_SR NULL +#define OPTION_VAL_LCD_GHOSTING_SR NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_SR NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_SR NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_SR NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_SR NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_SR NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_SR NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_SR NULL +#define OPTION_VAL_5_SR NULL +#define OPTION_VAL_10_SR NULL +#define OPTION_VAL_15_SR NULL +#define OPTION_VAL_20_SR NULL +#define OPTION_VAL_25_SR NULL +#define OPTION_VAL_30_SR NULL +#define OPTION_VAL_35_SR NULL +#define OPTION_VAL_40_SR NULL +#define OPTION_VAL_45_SR NULL +#define OPTION_VAL_50_SR NULL +#define OPTION_VAL_55_SR NULL +#define OPTION_VAL_60_SR NULL +#define OPTION_VAL_65_SR NULL +#define OPTION_VAL_70_SR NULL +#define OPTION_VAL_75_SR NULL +#define OPTION_VAL_80_SR NULL +#define OPTION_VAL_85_SR NULL +#define OPTION_VAL_90_SR NULL +#define OPTION_VAL_95_SR NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_SR NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_SR NULL +#define OPTION_VAL_NO_SR NULL +#define OPTION_VAL_YES_SR NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_SR NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_SR NULL +#define OPTION_VAL_SENSOR_SR NULL +#define MGBA_FORCE_GBP_LABEL_SR NULL +#define MGBA_FORCE_GBP_INFO_0_SR NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_SR NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_SR NULL +#define OPTION_VAL_REMOVE_KNOWN_SR NULL +#define OPTION_VAL_DETECT_AND_REMOVE_SR NULL +#define OPTION_VAL_DON_T_REMOVE_SR NULL +#define MGBA_FRAMESKIP_LABEL_SR NULL +#define MGBA_FRAMESKIP_INFO_0_SR NULL +#define OPTION_VAL_AUTO_THRESHOLD_SR NULL +#define OPTION_VAL_FIXED_INTERVAL_SR NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_SR NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_SR NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_SR NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_SR NULL + +struct retro_core_option_v2_category option_cats_sr[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_SR, + CATEGORY_SYSTEM_INFO_0_SR + }, + { + "video", + CATEGORY_VIDEO_LABEL_SR, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_SR +#else + CATEGORY_VIDEO_INFO_1_SR +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_SR, + CATEGORY_AUDIO_INFO_0_SR + }, + { + "input", + CATEGORY_INPUT_LABEL_SR, + CATEGORY_INPUT_INFO_0_SR + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_SR, + CATEGORY_PERFORMANCE_INFO_0_SR + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_sr[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_SR, + NULL, + MGBA_GB_MODEL_INFO_0_SR, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_SR }, + { "Game Boy", OPTION_VAL_GAME_BOY_SR }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_SR }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_SR }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_SR }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_SR, + NULL, + MGBA_USE_BIOS_INFO_0_SR, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_SR, + NULL, + MGBA_SKIP_BIOS_INFO_0_SR, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_SR, + NULL, + MGBA_GB_COLORS_INFO_0_SR, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_SR }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_SR, + NULL, + MGBA_SGB_BORDERS_INFO_0_SR, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_SR, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_SR, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_SR }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_SR }, + { "Auto", OPTION_VAL_AUTO_SR }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_SR, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_SR, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_SR }, + { "mix_smart", OPTION_VAL_MIX_SMART_SR }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_SR }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_SR }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_SR, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_SR, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_SR, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_SR, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_SR, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_SR, + NULL, + "audio", + { + { "5", OPTION_VAL_5_SR }, + { "10", OPTION_VAL_10_SR }, + { "15", OPTION_VAL_15_SR }, + { "20", OPTION_VAL_20_SR }, + { "25", OPTION_VAL_25_SR }, + { "30", OPTION_VAL_30_SR }, + { "35", OPTION_VAL_35_SR }, + { "40", OPTION_VAL_40_SR }, + { "45", OPTION_VAL_45_SR }, + { "50", OPTION_VAL_50_SR }, + { "55", OPTION_VAL_55_SR }, + { "60", OPTION_VAL_60_SR }, + { "65", OPTION_VAL_65_SR }, + { "70", OPTION_VAL_70_SR }, + { "75", OPTION_VAL_75_SR }, + { "80", OPTION_VAL_80_SR }, + { "85", OPTION_VAL_85_SR }, + { "90", OPTION_VAL_90_SR }, + { "95", OPTION_VAL_95_SR }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_SR, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_SR, + NULL, + "input", + { + { "no", OPTION_VAL_NO_SR }, + { "yes", OPTION_VAL_YES_SR }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_SR, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_SR, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_SR }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_SR, + NULL, + MGBA_FORCE_GBP_INFO_0_SR, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_SR, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_SR, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_SR }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_SR }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_SR }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_SR, + NULL, + MGBA_FRAMESKIP_INFO_0_SR, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_SR }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_SR }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_SR }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_SR, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_SR, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_SR, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_SR, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_SV NULL +#define CATEGORY_SYSTEM_INFO_0_SV NULL +#define CATEGORY_VIDEO_LABEL_SV "Bild" +#define CATEGORY_VIDEO_INFO_0_SV NULL +#define CATEGORY_VIDEO_INFO_1_SV NULL +#define CATEGORY_AUDIO_LABEL_SV "Ljud" +#define CATEGORY_AUDIO_INFO_0_SV NULL +#define CATEGORY_INPUT_LABEL_SV NULL +#define CATEGORY_INPUT_INFO_0_SV NULL +#define CATEGORY_PERFORMANCE_LABEL_SV NULL +#define CATEGORY_PERFORMANCE_INFO_0_SV NULL +#define MGBA_GB_MODEL_LABEL_SV NULL +#define MGBA_GB_MODEL_INFO_0_SV NULL +#define OPTION_VAL_AUTODETECT_SV NULL +#define OPTION_VAL_GAME_BOY_SV NULL +#define OPTION_VAL_SUPER_GAME_BOY_SV NULL +#define OPTION_VAL_GAME_BOY_COLOR_SV NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_SV NULL +#define MGBA_USE_BIOS_LABEL_SV NULL +#define MGBA_USE_BIOS_INFO_0_SV NULL +#define MGBA_SKIP_BIOS_LABEL_SV NULL +#define MGBA_SKIP_BIOS_INFO_0_SV NULL +#define MGBA_GB_COLORS_LABEL_SV NULL +#define MGBA_GB_COLORS_INFO_0_SV NULL +#define OPTION_VAL_GRAYSCALE_SV NULL +#define MGBA_SGB_BORDERS_LABEL_SV NULL +#define MGBA_SGB_BORDERS_INFO_0_SV NULL +#define MGBA_COLOR_CORRECTION_LABEL_SV NULL +#define MGBA_COLOR_CORRECTION_INFO_0_SV NULL +#define OPTION_VAL_AUTO_SV "Automatiskt" +#define MGBA_INTERFRAME_BLENDING_LABEL_SV NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_SV NULL +#define OPTION_VAL_MIX_SV NULL +#define OPTION_VAL_MIX_SMART_SV NULL +#define OPTION_VAL_LCD_GHOSTING_SV NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_SV NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_SV NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_SV NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_SV NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_SV NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_SV NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_SV NULL +#define OPTION_VAL_5_SV NULL +#define OPTION_VAL_10_SV NULL +#define OPTION_VAL_15_SV NULL +#define OPTION_VAL_20_SV NULL +#define OPTION_VAL_25_SV NULL +#define OPTION_VAL_30_SV NULL +#define OPTION_VAL_35_SV NULL +#define OPTION_VAL_40_SV NULL +#define OPTION_VAL_45_SV NULL +#define OPTION_VAL_50_SV NULL +#define OPTION_VAL_55_SV NULL +#define OPTION_VAL_60_SV NULL +#define OPTION_VAL_65_SV NULL +#define OPTION_VAL_70_SV NULL +#define OPTION_VAL_75_SV NULL +#define OPTION_VAL_80_SV NULL +#define OPTION_VAL_85_SV NULL +#define OPTION_VAL_90_SV NULL +#define OPTION_VAL_95_SV NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_SV NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_SV NULL +#define OPTION_VAL_NO_SV NULL +#define OPTION_VAL_YES_SV NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_SV NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_SV NULL +#define OPTION_VAL_SENSOR_SV NULL +#define MGBA_FORCE_GBP_LABEL_SV NULL +#define MGBA_FORCE_GBP_INFO_0_SV NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_SV NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_SV NULL +#define OPTION_VAL_REMOVE_KNOWN_SV NULL +#define OPTION_VAL_DETECT_AND_REMOVE_SV NULL +#define OPTION_VAL_DON_T_REMOVE_SV NULL +#define MGBA_FRAMESKIP_LABEL_SV NULL +#define MGBA_FRAMESKIP_INFO_0_SV NULL +#define OPTION_VAL_AUTO_THRESHOLD_SV NULL +#define OPTION_VAL_FIXED_INTERVAL_SV NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_SV NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_SV NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_SV NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_SV NULL + +struct retro_core_option_v2_category option_cats_sv[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_SV, + CATEGORY_SYSTEM_INFO_0_SV + }, + { + "video", + CATEGORY_VIDEO_LABEL_SV, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_SV +#else + CATEGORY_VIDEO_INFO_1_SV +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_SV, + CATEGORY_AUDIO_INFO_0_SV + }, + { + "input", + CATEGORY_INPUT_LABEL_SV, + CATEGORY_INPUT_INFO_0_SV + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_SV, + CATEGORY_PERFORMANCE_INFO_0_SV + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_sv[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_SV, + NULL, + MGBA_GB_MODEL_INFO_0_SV, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_SV }, + { "Game Boy", OPTION_VAL_GAME_BOY_SV }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_SV }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_SV }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_SV }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_SV, + NULL, + MGBA_USE_BIOS_INFO_0_SV, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_SV, + NULL, + MGBA_SKIP_BIOS_INFO_0_SV, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_SV, + NULL, + MGBA_GB_COLORS_INFO_0_SV, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_SV }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_SV, + NULL, + MGBA_SGB_BORDERS_INFO_0_SV, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_SV, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_SV, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_SV }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_SV }, + { "Auto", OPTION_VAL_AUTO_SV }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_SV, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_SV, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_SV }, + { "mix_smart", OPTION_VAL_MIX_SMART_SV }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_SV }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_SV }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_SV, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_SV, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_SV, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_SV, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_SV, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_SV, + NULL, + "audio", + { + { "5", OPTION_VAL_5_SV }, + { "10", OPTION_VAL_10_SV }, + { "15", OPTION_VAL_15_SV }, + { "20", OPTION_VAL_20_SV }, + { "25", OPTION_VAL_25_SV }, + { "30", OPTION_VAL_30_SV }, + { "35", OPTION_VAL_35_SV }, + { "40", OPTION_VAL_40_SV }, + { "45", OPTION_VAL_45_SV }, + { "50", OPTION_VAL_50_SV }, + { "55", OPTION_VAL_55_SV }, + { "60", OPTION_VAL_60_SV }, + { "65", OPTION_VAL_65_SV }, + { "70", OPTION_VAL_70_SV }, + { "75", OPTION_VAL_75_SV }, + { "80", OPTION_VAL_80_SV }, + { "85", OPTION_VAL_85_SV }, + { "90", OPTION_VAL_90_SV }, + { "95", OPTION_VAL_95_SV }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_SV, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_SV, + NULL, + "input", + { + { "no", OPTION_VAL_NO_SV }, + { "yes", OPTION_VAL_YES_SV }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_SV, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_SV, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_SV }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_SV, + NULL, + MGBA_FORCE_GBP_INFO_0_SV, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_SV, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_SV, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_SV }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_SV }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_SV }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_SV, + NULL, + MGBA_FRAMESKIP_INFO_0_SV, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_SV }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_SV }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_SV }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_SV, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_SV, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_SV, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_SV, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_TR "Sistem" +#define CATEGORY_SYSTEM_INFO_0_TR "Temel donanım seçimini/BIOS parametrelerini yapılandırın." +#define CATEGORY_VIDEO_LABEL_TR NULL +#define CATEGORY_VIDEO_INFO_0_TR NULL +#define CATEGORY_VIDEO_INFO_1_TR NULL +#define CATEGORY_AUDIO_LABEL_TR "Ses" +#define CATEGORY_AUDIO_INFO_0_TR "Ses filtrelemeyi yapılandırın." +#define CATEGORY_INPUT_LABEL_TR NULL +#define CATEGORY_INPUT_INFO_0_TR NULL +#define CATEGORY_PERFORMANCE_LABEL_TR "Performans" +#define CATEGORY_PERFORMANCE_INFO_0_TR NULL +#define MGBA_GB_MODEL_LABEL_TR "Game Boy Modeli (Yeniden Başlatılmalı)" +#define MGBA_GB_MODEL_INFO_0_TR "Yüklenen içeriği belirli bir Game Boy modeliyle çalıştırır. 'Otomatik Tespit' mevcut oyun için en uygun modeli seçecektir." +#define OPTION_VAL_AUTODETECT_TR "Otomatik Tespit" +#define OPTION_VAL_GAME_BOY_TR NULL +#define OPTION_VAL_SUPER_GAME_BOY_TR NULL +#define OPTION_VAL_GAME_BOY_COLOR_TR NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_TR NULL +#define MGBA_USE_BIOS_LABEL_TR "Bulunursa BIOS Dosyasını Kullan (Yeniden Başlatılmalı)" +#define MGBA_USE_BIOS_INFO_0_TR "RetroArch sistem dizininde varsa, taklit edilmiş donanım için resmi BIOS/önyükleyici kullanır." +#define MGBA_SKIP_BIOS_LABEL_TR "BIOS Sahnesini Atla (Yeniden Başlatılmalı)" +#define MGBA_SKIP_BIOS_INFO_0_TR "Resmi bir BIOS / önyükleyici kullanırken, başlangıç logosu animasyonunu atlayın. Bu ayar, 'Bulunursa BIOS Dosyasını Kullan' devre dışı bırakıldığında geçersiz sayılır." +#define MGBA_GB_COLORS_LABEL_TR "Varsayılan Game Boy Paleti" +#define MGBA_GB_COLORS_INFO_0_TR "Game Boy Color veya Super Game Boy uyumlu olmayan Game Boy oyunları için veya modelin Game Boy'a zorlanması durumunda hangi paletin kullanılacağını seçer." +#define OPTION_VAL_GRAYSCALE_TR "Gri Tonlama" +#define MGBA_SGB_BORDERS_LABEL_TR "Super Game Boy Sınırlarını Kullan (Yeniden Başlatılmalı)" +#define MGBA_SGB_BORDERS_INFO_0_TR "Super Game Boy geliştirilmiş oyunlarını çalıştırırken Super Game Boy sınırlarını görüntüleyin." +#define MGBA_COLOR_CORRECTION_LABEL_TR "Renk Düzeltmesi" +#define MGBA_COLOR_CORRECTION_INFO_0_TR "Çıktı renklerini gerçek GBA / GBC donanımının görüntüsüyle eşleşecek şekilde ayarlar." +#define OPTION_VAL_AUTO_TR "Otomatik" +#define MGBA_INTERFRAME_BLENDING_LABEL_TR "Çerçeveler Arası Karıştırma" +#define MGBA_INTERFRAME_BLENDING_INFO_0_TR "LCD gölgelenme efektlerini taklit eder. 'Basit', mevcut ve önceki karelerin 50:50'lik bir karışımını gerçekleştirir. 'Akıllı' ekran titremesini algılamaya çalışır ve etkilenen piksellerde yalnızca 50:50'lik bir karışım gerçekleştirir. 'LCD Gölgeleme', birden çok arabelleğe alınmış çerçeveyi birleştirerek doğal LCD yanıt sürelerini taklit eder. Şeffaflık efektleri için LCD gölgelenmesinden agresif bir şekilde yararlanan oyunlar oynarken 'Basit' veya 'Akıllı' karıştırma gereklidir (Wave Race, Chikyuu Kaihou Gun ZAS, F-Zero, Boktai serisi...)." +#define OPTION_VAL_MIX_TR "Basit" +#define OPTION_VAL_MIX_SMART_TR "Akıllı" +#define OPTION_VAL_LCD_GHOSTING_TR "LCD Gölgeleme (Tam)" +#define OPTION_VAL_LCD_GHOSTING_FAST_TR "LCD Gölgeleme (Hızlı)" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_TR "Ses Filtresi" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_TR "Düşük Geçiş Filtresi" +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_TR "Oluşturulan sesin \"sertliğini\" azaltmak için düşük geçişli bir ses filtresini etkinleştirir." +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_TR "Ses Filtresi Seviyesi" +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_TR "Filtre Seviyesi" +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_TR "Düşük ses geçiş filtresinin kesme frekansını belirtin. Daha yüksek bir değer, yüksek frekans spektrumunun daha geniş bir aralığı azaltıldığı için filtrenin algılanan gücünü arttırır." +#define OPTION_VAL_5_TR "%5" +#define OPTION_VAL_10_TR "%10" +#define OPTION_VAL_15_TR "%15" +#define OPTION_VAL_20_TR "%20" +#define OPTION_VAL_25_TR "%25" +#define OPTION_VAL_30_TR "%30" +#define OPTION_VAL_35_TR NULL +#define OPTION_VAL_40_TR "%40" +#define OPTION_VAL_45_TR "%45" +#define OPTION_VAL_50_TR "%50" +#define OPTION_VAL_55_TR "%55" +#define OPTION_VAL_60_TR "%60" +#define OPTION_VAL_65_TR "%65" +#define OPTION_VAL_70_TR "%70" +#define OPTION_VAL_75_TR "%75" +#define OPTION_VAL_80_TR "%80" +#define OPTION_VAL_85_TR "%85" +#define OPTION_VAL_90_TR "%90" +#define OPTION_VAL_95_TR "%95" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_TR "Karşı Yönlü Girdiye Çıkmaya İzin Ver" +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_TR "Bunu etkinleştirmek aynı anda hem sola hem de sağa (veya yukarı ve aşağı) yönlere basma / hızlı değiştirme / tutma imkanı sağlar. Bu harekete dayalı hatalara neden olabilir." +#define OPTION_VAL_NO_TR "hayır" +#define OPTION_VAL_YES_TR "evet" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_TR "Güneş Sensörü Seviyesi" +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_TR "Ortam güneş ışığının yoğunluğunu ayarlar. Boktai serisi, kartuşlarına güneş sensörü içeren oyunlar tarafından kullanılabilir." +#define OPTION_VAL_SENSOR_TR "Sensörü" +#define MGBA_FORCE_GBP_LABEL_TR NULL +#define MGBA_FORCE_GBP_INFO_0_TR NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_TR "Boşta Döngü Kaldırma" +#define MGBA_IDLE_OPTIMIZATION_INFO_0_TR "'Boşta döngüler' denilen sistemi optimize ederek sistem yükünü azaltın - hiçbir şeyin olmadığı koddaki bölümler için, CPU tam hızda çalıştırır (boşa dönen bir araba gibi). Performansı arttırır ve düşük kaliteli donanımlarda etkinleştirilmesi gerekir." +#define OPTION_VAL_REMOVE_KNOWN_TR "Bilinenleri Kaldır" +#define OPTION_VAL_DETECT_AND_REMOVE_TR "Algıla ve Kaldır" +#define OPTION_VAL_DON_T_REMOVE_TR "Kaldırma" +#define MGBA_FRAMESKIP_LABEL_TR "Kare Atlama" +#define MGBA_FRAMESKIP_INFO_0_TR NULL +#define OPTION_VAL_AUTO_THRESHOLD_TR NULL +#define OPTION_VAL_FIXED_INTERVAL_TR NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_TR "Kare Atlama Eşiği (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_TR NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_TR NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_TR NULL + +struct retro_core_option_v2_category option_cats_tr[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_TR, + CATEGORY_SYSTEM_INFO_0_TR + }, + { + "video", + CATEGORY_VIDEO_LABEL_TR, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_TR +#else + CATEGORY_VIDEO_INFO_1_TR +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_TR, + CATEGORY_AUDIO_INFO_0_TR + }, + { + "input", + CATEGORY_INPUT_LABEL_TR, + CATEGORY_INPUT_INFO_0_TR + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_TR, + CATEGORY_PERFORMANCE_INFO_0_TR + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_tr[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_TR, + NULL, + MGBA_GB_MODEL_INFO_0_TR, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_TR }, + { "Game Boy", OPTION_VAL_GAME_BOY_TR }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_TR }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_TR }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_TR }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_TR, + NULL, + MGBA_USE_BIOS_INFO_0_TR, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_TR, + NULL, + MGBA_SKIP_BIOS_INFO_0_TR, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_TR, + NULL, + MGBA_GB_COLORS_INFO_0_TR, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_TR }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_TR, + NULL, + MGBA_SGB_BORDERS_INFO_0_TR, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_TR, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_TR, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_TR }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_TR }, + { "Auto", OPTION_VAL_AUTO_TR }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_TR, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_TR, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_TR }, + { "mix_smart", OPTION_VAL_MIX_SMART_TR }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_TR }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_TR }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_TR, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_TR, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_TR, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_TR, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_TR, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_TR, + NULL, + "audio", + { + { "5", OPTION_VAL_5_TR }, + { "10", OPTION_VAL_10_TR }, + { "15", OPTION_VAL_15_TR }, + { "20", OPTION_VAL_20_TR }, + { "25", OPTION_VAL_25_TR }, + { "30", OPTION_VAL_30_TR }, + { "35", OPTION_VAL_35_TR }, + { "40", OPTION_VAL_40_TR }, + { "45", OPTION_VAL_45_TR }, + { "50", OPTION_VAL_50_TR }, + { "55", OPTION_VAL_55_TR }, + { "60", OPTION_VAL_60_TR }, + { "65", OPTION_VAL_65_TR }, + { "70", OPTION_VAL_70_TR }, + { "75", OPTION_VAL_75_TR }, + { "80", OPTION_VAL_80_TR }, + { "85", OPTION_VAL_85_TR }, + { "90", OPTION_VAL_90_TR }, + { "95", OPTION_VAL_95_TR }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_TR, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_TR, + NULL, + "input", + { + { "no", OPTION_VAL_NO_TR }, + { "yes", OPTION_VAL_YES_TR }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_TR, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_TR, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_TR }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_TR, + NULL, + MGBA_FORCE_GBP_INFO_0_TR, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_TR, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_TR, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_TR }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_TR }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_TR }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_TR, + NULL, + MGBA_FRAMESKIP_INFO_0_TR, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_TR }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_TR }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_TR }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_TR, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_TR, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_TR, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_TR, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_UK "Система" +#define CATEGORY_SYSTEM_INFO_0_UK NULL +#define CATEGORY_VIDEO_LABEL_UK "Відео" +#define CATEGORY_VIDEO_INFO_0_UK NULL +#define CATEGORY_VIDEO_INFO_1_UK NULL +#define CATEGORY_AUDIO_LABEL_UK "Аудіо" +#define CATEGORY_AUDIO_INFO_0_UK NULL +#define CATEGORY_INPUT_LABEL_UK NULL +#define CATEGORY_INPUT_INFO_0_UK NULL +#define CATEGORY_PERFORMANCE_LABEL_UK NULL +#define CATEGORY_PERFORMANCE_INFO_0_UK NULL +#define MGBA_GB_MODEL_LABEL_UK NULL +#define MGBA_GB_MODEL_INFO_0_UK NULL +#define OPTION_VAL_AUTODETECT_UK "Автовизначення" +#define OPTION_VAL_GAME_BOY_UK NULL +#define OPTION_VAL_SUPER_GAME_BOY_UK NULL +#define OPTION_VAL_GAME_BOY_COLOR_UK NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_UK NULL +#define MGBA_USE_BIOS_LABEL_UK NULL +#define MGBA_USE_BIOS_INFO_0_UK NULL +#define MGBA_SKIP_BIOS_LABEL_UK NULL +#define MGBA_SKIP_BIOS_INFO_0_UK NULL +#define MGBA_GB_COLORS_LABEL_UK NULL +#define MGBA_GB_COLORS_INFO_0_UK NULL +#define OPTION_VAL_GRAYSCALE_UK NULL +#define MGBA_SGB_BORDERS_LABEL_UK NULL +#define MGBA_SGB_BORDERS_INFO_0_UK NULL +#define MGBA_COLOR_CORRECTION_LABEL_UK NULL +#define MGBA_COLOR_CORRECTION_INFO_0_UK NULL +#define OPTION_VAL_AUTO_UK "Авто" +#define MGBA_INTERFRAME_BLENDING_LABEL_UK NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_UK NULL +#define OPTION_VAL_MIX_UK NULL +#define OPTION_VAL_MIX_SMART_UK NULL +#define OPTION_VAL_LCD_GHOSTING_UK NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_UK NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_UK "Аудіофільтр" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_UK NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_UK NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_UK NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_UK NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_UK NULL +#define OPTION_VAL_5_UK NULL +#define OPTION_VAL_10_UK NULL +#define OPTION_VAL_15_UK NULL +#define OPTION_VAL_20_UK NULL +#define OPTION_VAL_25_UK NULL +#define OPTION_VAL_30_UK NULL +#define OPTION_VAL_35_UK NULL +#define OPTION_VAL_40_UK NULL +#define OPTION_VAL_45_UK NULL +#define OPTION_VAL_50_UK NULL +#define OPTION_VAL_55_UK NULL +#define OPTION_VAL_60_UK NULL +#define OPTION_VAL_65_UK NULL +#define OPTION_VAL_70_UK NULL +#define OPTION_VAL_75_UK NULL +#define OPTION_VAL_80_UK NULL +#define OPTION_VAL_85_UK NULL +#define OPTION_VAL_90_UK NULL +#define OPTION_VAL_95_UK NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_UK NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_UK NULL +#define OPTION_VAL_NO_UK "ні" +#define OPTION_VAL_YES_UK "так" +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_UK NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_UK NULL +#define OPTION_VAL_SENSOR_UK NULL +#define MGBA_FORCE_GBP_LABEL_UK NULL +#define MGBA_FORCE_GBP_INFO_0_UK NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_UK NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_UK NULL +#define OPTION_VAL_REMOVE_KNOWN_UK NULL +#define OPTION_VAL_DETECT_AND_REMOVE_UK NULL +#define OPTION_VAL_DON_T_REMOVE_UK NULL +#define MGBA_FRAMESKIP_LABEL_UK NULL +#define MGBA_FRAMESKIP_INFO_0_UK NULL +#define OPTION_VAL_AUTO_THRESHOLD_UK NULL +#define OPTION_VAL_FIXED_INTERVAL_UK NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_UK "Межа пропуску кадрів (%)" +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_UK NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_UK NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_UK NULL + +struct retro_core_option_v2_category option_cats_uk[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_UK, + CATEGORY_SYSTEM_INFO_0_UK + }, + { + "video", + CATEGORY_VIDEO_LABEL_UK, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_UK +#else + CATEGORY_VIDEO_INFO_1_UK +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_UK, + CATEGORY_AUDIO_INFO_0_UK + }, + { + "input", + CATEGORY_INPUT_LABEL_UK, + CATEGORY_INPUT_INFO_0_UK + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_UK, + CATEGORY_PERFORMANCE_INFO_0_UK + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_uk[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_UK, + NULL, + MGBA_GB_MODEL_INFO_0_UK, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_UK }, + { "Game Boy", OPTION_VAL_GAME_BOY_UK }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_UK }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_UK }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_UK }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_UK, + NULL, + MGBA_USE_BIOS_INFO_0_UK, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_UK, + NULL, + MGBA_SKIP_BIOS_INFO_0_UK, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_UK, + NULL, + MGBA_GB_COLORS_INFO_0_UK, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_UK }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_UK, + NULL, + MGBA_SGB_BORDERS_INFO_0_UK, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_UK, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_UK, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_UK }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_UK }, + { "Auto", OPTION_VAL_AUTO_UK }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_UK, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_UK, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_UK }, + { "mix_smart", OPTION_VAL_MIX_SMART_UK }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_UK }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_UK }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_UK, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_UK, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_UK, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_UK, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_UK, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_UK, + NULL, + "audio", + { + { "5", OPTION_VAL_5_UK }, + { "10", OPTION_VAL_10_UK }, + { "15", OPTION_VAL_15_UK }, + { "20", OPTION_VAL_20_UK }, + { "25", OPTION_VAL_25_UK }, + { "30", OPTION_VAL_30_UK }, + { "35", OPTION_VAL_35_UK }, + { "40", OPTION_VAL_40_UK }, + { "45", OPTION_VAL_45_UK }, + { "50", OPTION_VAL_50_UK }, + { "55", OPTION_VAL_55_UK }, + { "60", OPTION_VAL_60_UK }, + { "65", OPTION_VAL_65_UK }, + { "70", OPTION_VAL_70_UK }, + { "75", OPTION_VAL_75_UK }, + { "80", OPTION_VAL_80_UK }, + { "85", OPTION_VAL_85_UK }, + { "90", OPTION_VAL_90_UK }, + { "95", OPTION_VAL_95_UK }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_UK, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_UK, + NULL, + "input", + { + { "no", OPTION_VAL_NO_UK }, + { "yes", OPTION_VAL_YES_UK }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_UK, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_UK, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_UK }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_UK, + NULL, + MGBA_FORCE_GBP_INFO_0_UK, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_UK, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_UK, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_UK }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_UK }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_UK }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_UK, + NULL, + MGBA_FRAMESKIP_INFO_0_UK, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_UK }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_UK }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_UK }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_UK, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_UK, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_UK, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_UK, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 CATEGORY_SYSTEM_LABEL_VN "Hệ thống" +#define CATEGORY_SYSTEM_INFO_0_VN NULL +#define CATEGORY_VIDEO_LABEL_VN "Hình ảnh" +#define CATEGORY_VIDEO_INFO_0_VN NULL +#define CATEGORY_VIDEO_INFO_1_VN NULL +#define CATEGORY_AUDIO_LABEL_VN "Âm thanh" +#define CATEGORY_AUDIO_INFO_0_VN NULL +#define CATEGORY_INPUT_LABEL_VN NULL +#define CATEGORY_INPUT_INFO_0_VN NULL +#define CATEGORY_PERFORMANCE_LABEL_VN NULL +#define CATEGORY_PERFORMANCE_INFO_0_VN NULL +#define MGBA_GB_MODEL_LABEL_VN NULL +#define MGBA_GB_MODEL_INFO_0_VN NULL +#define OPTION_VAL_AUTODETECT_VN "Tự động phát hiện" +#define OPTION_VAL_GAME_BOY_VN NULL +#define OPTION_VAL_SUPER_GAME_BOY_VN NULL +#define OPTION_VAL_GAME_BOY_COLOR_VN NULL +#define OPTION_VAL_GAME_BOY_ADVANCE_VN NULL +#define MGBA_USE_BIOS_LABEL_VN NULL +#define MGBA_USE_BIOS_INFO_0_VN NULL +#define MGBA_SKIP_BIOS_LABEL_VN NULL +#define MGBA_SKIP_BIOS_INFO_0_VN NULL +#define MGBA_GB_COLORS_LABEL_VN NULL +#define MGBA_GB_COLORS_INFO_0_VN NULL +#define OPTION_VAL_GRAYSCALE_VN NULL +#define MGBA_SGB_BORDERS_LABEL_VN NULL +#define MGBA_SGB_BORDERS_INFO_0_VN NULL +#define MGBA_COLOR_CORRECTION_LABEL_VN NULL +#define MGBA_COLOR_CORRECTION_INFO_0_VN NULL +#define OPTION_VAL_AUTO_VN "Tự động" +#define MGBA_INTERFRAME_BLENDING_LABEL_VN NULL +#define MGBA_INTERFRAME_BLENDING_INFO_0_VN NULL +#define OPTION_VAL_MIX_VN NULL +#define OPTION_VAL_MIX_SMART_VN NULL +#define OPTION_VAL_LCD_GHOSTING_VN NULL +#define OPTION_VAL_LCD_GHOSTING_FAST_VN NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_VN "Âm thanh Filter Danh mục" +#define MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_VN NULL +#define MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_VN NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_VN NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_VN NULL +#define MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_VN NULL +#define OPTION_VAL_5_VN NULL +#define OPTION_VAL_10_VN NULL +#define OPTION_VAL_15_VN NULL +#define OPTION_VAL_20_VN NULL +#define OPTION_VAL_25_VN NULL +#define OPTION_VAL_30_VN NULL +#define OPTION_VAL_35_VN NULL +#define OPTION_VAL_40_VN NULL +#define OPTION_VAL_45_VN NULL +#define OPTION_VAL_50_VN NULL +#define OPTION_VAL_55_VN NULL +#define OPTION_VAL_60_VN NULL +#define OPTION_VAL_65_VN NULL +#define OPTION_VAL_70_VN NULL +#define OPTION_VAL_75_VN NULL +#define OPTION_VAL_80_VN NULL +#define OPTION_VAL_85_VN NULL +#define OPTION_VAL_90_VN NULL +#define OPTION_VAL_95_VN NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_VN NULL +#define MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_VN NULL +#define OPTION_VAL_NO_VN NULL +#define OPTION_VAL_YES_VN NULL +#define MGBA_SOLAR_SENSOR_LEVEL_LABEL_VN NULL +#define MGBA_SOLAR_SENSOR_LEVEL_INFO_0_VN NULL +#define OPTION_VAL_SENSOR_VN NULL +#define MGBA_FORCE_GBP_LABEL_VN NULL +#define MGBA_FORCE_GBP_INFO_0_VN NULL +#define MGBA_IDLE_OPTIMIZATION_LABEL_VN NULL +#define MGBA_IDLE_OPTIMIZATION_INFO_0_VN NULL +#define OPTION_VAL_REMOVE_KNOWN_VN NULL +#define OPTION_VAL_DETECT_AND_REMOVE_VN NULL +#define OPTION_VAL_DON_T_REMOVE_VN NULL +#define MGBA_FRAMESKIP_LABEL_VN "Bỏ qua khung hình" +#define MGBA_FRAMESKIP_INFO_0_VN NULL +#define OPTION_VAL_AUTO_THRESHOLD_VN NULL +#define OPTION_VAL_FIXED_INTERVAL_VN NULL +#define MGBA_FRAMESKIP_THRESHOLD_LABEL_VN NULL +#define MGBA_FRAMESKIP_THRESHOLD_INFO_0_VN NULL +#define MGBA_FRAMESKIP_INTERVAL_LABEL_VN NULL +#define MGBA_FRAMESKIP_INTERVAL_INFO_0_VN NULL + +struct retro_core_option_v2_category option_cats_vn[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_VN, + CATEGORY_SYSTEM_INFO_0_VN + }, + { + "video", + CATEGORY_VIDEO_LABEL_VN, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + CATEGORY_VIDEO_INFO_0_VN +#else + CATEGORY_VIDEO_INFO_1_VN +#endif + }, + { + "audio", + CATEGORY_AUDIO_LABEL_VN, + CATEGORY_AUDIO_INFO_0_VN + }, + { + "input", + CATEGORY_INPUT_LABEL_VN, + CATEGORY_INPUT_INFO_0_VN + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_VN, + CATEGORY_PERFORMANCE_INFO_0_VN + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_vn[] = { + { + "mgba_gb_model", + MGBA_GB_MODEL_LABEL_VN, + NULL, + MGBA_GB_MODEL_INFO_0_VN, + NULL, + "system", + { + { "Autodetect", OPTION_VAL_AUTODETECT_VN }, + { "Game Boy", OPTION_VAL_GAME_BOY_VN }, + { "Super Game Boy", OPTION_VAL_SUPER_GAME_BOY_VN }, + { "Game Boy Color", OPTION_VAL_GAME_BOY_COLOR_VN }, + { "Game Boy Advance", OPTION_VAL_GAME_BOY_ADVANCE_VN }, + { NULL, NULL }, + }, + "Autodetect" + }, + { + "mgba_use_bios", + MGBA_USE_BIOS_LABEL_VN, + NULL, + MGBA_USE_BIOS_INFO_0_VN, + NULL, + "system", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, + { + "mgba_skip_bios", + MGBA_SKIP_BIOS_LABEL_VN, + NULL, + MGBA_SKIP_BIOS_INFO_0_VN, + NULL, + "system", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_gb_colors", + MGBA_GB_COLORS_LABEL_VN, + NULL, + MGBA_GB_COLORS_INFO_0_VN, + NULL, + "video", + { + /* This list is populated at runtime */ + { "Grayscale", OPTION_VAL_GRAYSCALE_VN }, + { NULL, NULL }, + }, + "Grayscale" + }, + { + "mgba_sgb_borders", + MGBA_SGB_BORDERS_LABEL_VN, + NULL, + MGBA_SGB_BORDERS_INFO_0_VN, + NULL, + "video", + { + { "ON", "enabled" }, + { "OFF", "disabled" }, + { NULL, NULL }, + }, + "ON" + }, +#if defined(COLOR_16_BIT) && defined(COLOR_5_6_5) + { + "mgba_color_correction", + MGBA_COLOR_CORRECTION_LABEL_VN, + NULL, + MGBA_COLOR_CORRECTION_INFO_0_VN, + NULL, + "video", + { + { "OFF", "disabled" }, + { "GBA", OPTION_VAL_GAME_BOY_ADVANCE_VN }, + { "GBC", OPTION_VAL_GAME_BOY_COLOR_VN }, + { "Auto", OPTION_VAL_AUTO_VN }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_interframe_blending", + MGBA_INTERFRAME_BLENDING_LABEL_VN, + NULL, + MGBA_INTERFRAME_BLENDING_INFO_0_VN, + NULL, + "video", + { + { "OFF", "disabled" }, + { "mix", OPTION_VAL_MIX_VN }, + { "mix_smart", OPTION_VAL_MIX_SMART_VN }, + { "lcd_ghosting", OPTION_VAL_LCD_GHOSTING_VN }, + { "lcd_ghosting_fast", OPTION_VAL_LCD_GHOSTING_FAST_VN }, + { NULL, NULL }, + }, + "OFF" + }, +#endif + { + "mgba_audio_low_pass_filter", + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_VN, + MGBA_AUDIO_LOW_PASS_FILTER_LABEL_CAT_VN, + MGBA_AUDIO_LOW_PASS_FILTER_INFO_0_VN, + NULL, + "audio", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_audio_low_pass_range", + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_VN, + MGBA_AUDIO_LOW_PASS_RANGE_LABEL_CAT_VN, + MGBA_AUDIO_LOW_PASS_RANGE_INFO_0_VN, + NULL, + "audio", + { + { "5", OPTION_VAL_5_VN }, + { "10", OPTION_VAL_10_VN }, + { "15", OPTION_VAL_15_VN }, + { "20", OPTION_VAL_20_VN }, + { "25", OPTION_VAL_25_VN }, + { "30", OPTION_VAL_30_VN }, + { "35", OPTION_VAL_35_VN }, + { "40", OPTION_VAL_40_VN }, + { "45", OPTION_VAL_45_VN }, + { "50", OPTION_VAL_50_VN }, + { "55", OPTION_VAL_55_VN }, + { "60", OPTION_VAL_60_VN }, + { "65", OPTION_VAL_65_VN }, + { "70", OPTION_VAL_70_VN }, + { "75", OPTION_VAL_75_VN }, + { "80", OPTION_VAL_80_VN }, + { "85", OPTION_VAL_85_VN }, + { "90", OPTION_VAL_90_VN }, + { "95", OPTION_VAL_95_VN }, + { NULL, NULL }, + }, + "60" + }, + { + "mgba_allow_opposing_directions", + MGBA_ALLOW_OPPOSING_DIRECTIONS_LABEL_VN, + NULL, + MGBA_ALLOW_OPPOSING_DIRECTIONS_INFO_0_VN, + NULL, + "input", + { + { "no", OPTION_VAL_NO_VN }, + { "yes", OPTION_VAL_YES_VN }, + { NULL, NULL }, + }, + "no" + }, + { + "mgba_solar_sensor_level", + MGBA_SOLAR_SENSOR_LEVEL_LABEL_VN, + NULL, + MGBA_SOLAR_SENSOR_LEVEL_INFO_0_VN, + NULL, + "input", + { + { "sensor", OPTION_VAL_SENSOR_VN }, + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { + "mgba_force_gbp", + MGBA_FORCE_GBP_LABEL_VN, + NULL, + MGBA_FORCE_GBP_INFO_0_VN, + NULL, + "input", + { + { "OFF", "disabled" }, + { "ON", "enabled" }, + { NULL, NULL }, + }, + "OFF" + }, + { + "mgba_idle_optimization", + MGBA_IDLE_OPTIMIZATION_LABEL_VN, + NULL, + MGBA_IDLE_OPTIMIZATION_INFO_0_VN, + NULL, + "performance", + { + { "Remove Known", OPTION_VAL_REMOVE_KNOWN_VN }, + { "Detect and Remove", OPTION_VAL_DETECT_AND_REMOVE_VN }, + { "Don't Remove", OPTION_VAL_DON_T_REMOVE_VN }, + { NULL, NULL }, + }, + "Remove Known" + }, + { + "mgba_frameskip", + MGBA_FRAMESKIP_LABEL_VN, + NULL, + MGBA_FRAMESKIP_INFO_0_VN, + NULL, + "performance", + { + { "disabled", NULL }, + { "auto", OPTION_VAL_AUTO_VN }, + { "auto_threshold", OPTION_VAL_AUTO_THRESHOLD_VN }, + { "fixed_interval", OPTION_VAL_FIXED_INTERVAL_VN }, + { NULL, NULL }, + }, + "disabled" + }, + { + "mgba_frameskip_threshold", + MGBA_FRAMESKIP_THRESHOLD_LABEL_VN, + NULL, + MGBA_FRAMESKIP_THRESHOLD_INFO_0_VN, + NULL, + "performance", + { + { "15", NULL }, + { "18", NULL }, + { "21", NULL }, + { "24", NULL }, + { "27", NULL }, + { "30", NULL }, + { "33", NULL }, + { "36", NULL }, + { "39", NULL }, + { "42", NULL }, + { "45", NULL }, + { "48", NULL }, + { "51", NULL }, + { "54", NULL }, + { "57", NULL }, + { "60", NULL }, + { NULL, NULL }, + }, + "33" + }, + { + "mgba_frameskip_interval", + MGBA_FRAMESKIP_INTERVAL_LABEL_VN, + NULL, + MGBA_FRAMESKIP_INTERVAL_INFO_0_VN, + NULL, + "performance", + { + { "0", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { "7", NULL }, + { "8", NULL }, + { "9", NULL }, + { "10", NULL }, + { NULL, NULL }, + }, + "0" + }, + { 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 +#endif \ No newline at end of file From 9878e2e780cd0f90f41b6197eda3cb3442be95f2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 12 Dec 2021 21:45:42 -0800 Subject: [PATCH 25/59] Libretro: Add support for GCB and SGB palette presets --- src/platform/libretro/libretro.c | 6 ++++++ src/platform/libretro/libretro_core_options.h | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index 66e650b72..3c5b278bb 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -288,6 +288,12 @@ static void _reloadSettings(void) { mCoreConfigSetDefaultIntValue(&core->config, "sgb.borders", strcmp(var.value, "ON") == 0); } + var.key = "mgba_gb_colors_preset"; + var.value = 0; + if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { + mCoreConfigSetDefaultIntValue(&core->config, "gb.colors", strtol(var.value, NULL, 10)); + } + _updateGbPal(); #endif diff --git a/src/platform/libretro/libretro_core_options.h b/src/platform/libretro/libretro_core_options.h index ca1b6514e..dba9078a4 100644 --- a/src/platform/libretro/libretro_core_options.h +++ b/src/platform/libretro/libretro_core_options.h @@ -138,6 +138,22 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "Grayscale" }, + { + "mgba_gb_colors_preset", + "Hardware Preset Game Boy Palettes (Restart)", + NULL, + "Use the palettes for Game Boy games that have presets on the Game Boy Color or Super Game Boy.", + NULL, + "video", + { + { "0", "" }, + { "1", "Game Boy Color presets only" }, + { "2", "Super Game Boy presets only" }, + { "3", "Any available presets" }, + { NULL, NULL }, + }, + "ON" + }, { "mgba_sgb_borders", "Use Super Game Boy Borders (Restart)", From a18f8d70631ab65579c4ad28254c80edf5f26ffc Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 15 Dec 2021 23:10:32 -0800 Subject: [PATCH 26/59] Res: Update patrons for November --- res/patrons.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/res/patrons.txt b/res/patrons.txt index 6d647f79b..4f2f167bd 100644 --- a/res/patrons.txt +++ b/res/patrons.txt @@ -1,13 +1,13 @@ +Akatsuki Benedikt Feih +Brandon Emily A. Bellows gocha Jaime J. Denizard -Jezzabel -Lucas Towers -MichaelK_ +MichaelK__ Miras Absar -NimbusFox Petru-Sebastian Toader SquidHominid Tyler Jenkins +William K. Leung Zach From 354f898a0353dfb41a07cfc6d01898fed18d4e03 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 17 Dec 2021 17:53:31 -0800 Subject: [PATCH 27/59] CHANGES: Release 0.9.3 --- CHANGES | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/CHANGES b/CHANGES index 6440ef013..ade29c80f 100644 --- a/CHANGES +++ b/CHANGES @@ -12,19 +12,31 @@ Features: - Additional scaling shaders Emulation fixes: - ARM7: Fix unsigned multiply timing - - GB I/O: Fix incrementing SGB controller when P14 is low (fixes mgba.io/i/2202) - GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032) - - GB Video: Render SGB border when unmasking with ATTR/PAL_SET (fixes mgba.io/i/2261) - GBA: Improve timing when not booting from BIOS - GBA I/O: Redo internal key input, enabling edge-based key IRQs - GBA Memory: Fix misaligned 32-bit I/O loads (fixes mgba.io/i/2307) +Other fixes: + - Core: Don't attempt to restore rewind diffs past start of rewind +Misc: + - Core: Suspend runloop when a core crashes + - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) + - Qt: Rearrange menus some + - Qt: Clean up cheats dialog + - Qt: Only set default controller bindings if loading fails (fixes mgba.io/i/799) + - Qt: Save converter now supports importing SharkPort saves + +0.9.3: (2021-12-17) +Emulation fixes: + - GB I/O: Fix incrementing SGB controller when P14 is low (fixes mgba.io/i/2202) + - GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032) + - GB Video: Render SGB border when unmasking with ATTR/PAL_SET (fixes mgba.io/i/2261) - GBA SIO: Fix SI value for unattached MULTI mode - GBA Video: Fix backdrop color if DISPCNT is first set to 0 (fixes mgba.io/i/2260) - GBA Video: Don't iterate affine backgrounds when disabled - GBA Video: Delay enabling backgrounds in bitmap modes (fixes mgba.io/i/1668) Other fixes: - ARM Decoder: Fix decoding of lsl r0 (fixes mgba.io/i/2349) - - Core: Don't attempt to restore rewind diffs past start of rewind - FFmpeg: Don't attempt to use YUV 4:2:0 for lossless videos (fixes mgba.io/i/2084) - GB Video: Fix memory leak when reseting SGB games - GBA: Fix out of bounds ROM accesses on patched ROMs smaller than 32 MiB @@ -32,16 +44,11 @@ Other fixes: - GBA Video: Fix cache updating with proxy and GL renderers - Libretro: Fix crash when using Game Boy codes (fixes mgba.io/i/2281) - mGUI: Fix crash if autosave file can't be opened (fixes mgba.io/i/2268) + - Qt: Remove potentially deadlocking optimization - Qt: Fix corrupted savestate and fatal error text - Qt: Fix sprite compositing when sprite tiles go out of bounds (fixes mgba.io/i/2348) Misc: - - Core: Suspend runloop when a core crashes - GBA I/O: Update KEYINPUT in internal I/O memory (fixes mgba.io/i/2235) - - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) - - Qt: Rearrange menus some - - Qt: Clean up cheats dialog - - Qt: Only set default controller bindings if loading fails (fixes mgba.io/i/799) - - Qt: Save converter now supports importing SharkPort saves - SDL: Use SDL_JoystickRumble where available - Wii: Add adjustable gyroscope settings (closes mgba.io/i/2245) From b5e94b0abb373e78a811f34967e9414301a7b91f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 18 Dec 2021 15:48:57 -0800 Subject: [PATCH 28/59] FFmpeg: Fix crash when encoding audio with some containers --- CHANGES | 1 + src/feature/ffmpeg/ffmpeg-encoder.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index ade29c80f..2d131b40b 100644 --- a/CHANGES +++ b/CHANGES @@ -18,6 +18,7 @@ Emulation fixes: - GBA Memory: Fix misaligned 32-bit I/O loads (fixes mgba.io/i/2307) Other fixes: - Core: Don't attempt to restore rewind diffs past start of rewind + - FFmpeg: Fix crash when encoding audio with some containers Misc: - Core: Suspend runloop when a core crashes - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) diff --git a/src/feature/ffmpeg/ffmpeg-encoder.c b/src/feature/ffmpeg/ffmpeg-encoder.c index 21f298157..55c874692 100644 --- a/src/feature/ffmpeg/ffmpeg-encoder.c +++ b/src/feature/ffmpeg/ffmpeg-encoder.c @@ -737,7 +737,7 @@ bool _ffmpegWriteAudioFrame(struct FFmpegEncoder* encoder, struct AVFrame* audio #ifdef FFMPEG_USE_PACKET_UNREF av_packet_move_ref(packet, tempPacket); - av_packet_free(&packet); + av_packet_free(&tempPacket); #else av_free_packet(packet); av_freep(&packet); From a1641f7fae9d53829ef3084be9da3387d6320c0d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 21 Dec 2021 20:36:18 -0800 Subject: [PATCH 29/59] GBA Savedata: Add GSV importing --- CHANGES | 3 +- include/mgba/internal/gba/sharkport.h | 6 +- src/gba/sharkport.c | 180 ++++++++++++++++++++------ src/platform/qt/CoreController.cpp | 1 + src/platform/qt/SaveConverter.cpp | 32 ++++- src/platform/qt/SaveConverter.h | 3 +- src/platform/qt/Window.cpp | 2 +- 7 files changed, 180 insertions(+), 47 deletions(-) diff --git a/CHANGES b/CHANGES index 2d131b40b..398df1445 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,7 @@ Features: - Support for 64 kiB SRAM saves used in some bootlegs - Discord Rich Presence now supports time elapsed - Additional scaling shaders + - Support for GameShark Advance SP (.gsv) save file importing Emulation fixes: - ARM7: Fix unsigned multiply timing - GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032) @@ -25,7 +26,7 @@ Misc: - Qt: Rearrange menus some - Qt: Clean up cheats dialog - Qt: Only set default controller bindings if loading fails (fixes mgba.io/i/799) - - Qt: Save converter now supports importing SharkPort saves + - Qt: Save converter now supports importing GameShark Advance saves 0.9.3: (2021-12-17) Emulation fixes: diff --git a/include/mgba/internal/gba/sharkport.h b/include/mgba/internal/gba/sharkport.h index 7c689d7b7..c6b986707 100644 --- a/include/mgba/internal/gba/sharkport.h +++ b/include/mgba/internal/gba/sharkport.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015 Jeffrey Pfau +/* Copyright (c) 2013-2021 Jeffrey Pfau * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this @@ -18,6 +18,10 @@ void* GBASavedataSharkPortGetPayload(struct VFile* vf, size_t* size, uint8_t* he bool GBASavedataImportSharkPort(struct GBA* gba, struct VFile* vf, bool testChecksum); bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf); +int GBASavedataGSVPayloadSize(struct VFile* vf); +void* GBASavedataGSVGetPayload(struct VFile* vf, size_t* size, uint8_t* ident, bool testChecksum); +bool GBASavedataImportGSV(struct GBA* gba, struct VFile* vf, bool testChecksum); + CXX_GUARD_END #endif diff --git a/src/gba/sharkport.c b/src/gba/sharkport.c index 3de45e1c5..9922f425f 100644 --- a/src/gba/sharkport.c +++ b/src/gba/sharkport.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015 Jeffrey Pfau +/* Copyright (c) 2013-2021 Jeffrey Pfau * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this @@ -10,6 +10,50 @@ #include static const char* const SHARKPORT_HEADER = "SharkPortSave"; +static const char* const GSV_HEADER = "ADVSAVEG"; +static const char* const GSV_FOOTER = "xV4\x12"; +static const int GSV_IDENT_OFFSET = 0xC; +static const int GSV_PAYLOAD_OFFSET = 0x430; + +static bool _importSavedata(struct GBA* gba, void* payload, size_t size) { + bool success = false; + switch (gba->memory.savedata.type) { + case SAVEDATA_FLASH512: + if (size > SIZE_CART_FLASH512) { + GBASavedataForceType(&gba->memory.savedata, SAVEDATA_FLASH1M); + } + // Fall through + default: + if (size > GBASavedataSize(&gba->memory.savedata)) { + size = GBASavedataSize(&gba->memory.savedata); + } + break; + case SAVEDATA_FORCE_NONE: + case SAVEDATA_AUTODETECT: + goto cleanup; + } + + if (size == SIZE_CART_EEPROM || size == SIZE_CART_EEPROM512) { + size_t i; + for (i = 0; i < size; i += 8) { + uint32_t lo, hi; + LOAD_32BE(lo, i, payload); + LOAD_32BE(hi, i + 4, payload); + STORE_32LE(hi, i, gba->memory.savedata.data); + STORE_32LE(lo, i + 4, gba->memory.savedata.data); + } + } else { + memcpy(gba->memory.savedata.data, payload, size); + } + if (gba->memory.savedata.vf) { + gba->memory.savedata.vf->sync(gba->memory.savedata.vf, gba->memory.savedata.data, size); + } + success = true; + +cleanup: + free(payload); + return success; +} int GBASavedataSharkPortPayloadSize(struct VFile* vf) { union { @@ -121,7 +165,6 @@ cleanup: return NULL; } - bool GBASavedataImportSharkPort(struct GBA* gba, struct VFile* vf, bool testChecksum) { uint8_t buffer[0x1C]; uint8_t header[0x1C]; @@ -132,7 +175,6 @@ bool GBASavedataImportSharkPort(struct GBA* gba, struct VFile* vf, bool testChec return false; } - bool success = false; struct GBACartridge* cart = (struct GBACartridge*) gba->memory.rom; memcpy(buffer, &cart->title, 16); buffer[0x10] = 0; @@ -148,46 +190,11 @@ bool GBASavedataImportSharkPort(struct GBA* gba, struct VFile* vf, bool testChec buffer[0x1A] = 0; buffer[0x1B] = 0; if (memcmp(buffer, header, testChecksum ? 0x1C : 0xF) != 0) { - goto cleanup; + free(payload); + return false; } - switch (gba->memory.savedata.type) { - case SAVEDATA_FLASH512: - if (size > SIZE_CART_FLASH512) { - GBASavedataForceType(&gba->memory.savedata, SAVEDATA_FLASH1M); - } - // Fall through - default: - if (size > GBASavedataSize(&gba->memory.savedata)) { - size = GBASavedataSize(&gba->memory.savedata); - } - break; - case SAVEDATA_FORCE_NONE: - case SAVEDATA_AUTODETECT: - goto cleanup; - } - - - if (size == SIZE_CART_EEPROM || size == SIZE_CART_EEPROM512) { - size_t i; - for (i = 0; i < size; i += 8) { - uint32_t lo, hi; - LOAD_32BE(lo, i, payload); - LOAD_32BE(hi, i + 4, payload); - STORE_32LE(hi, i, gba->memory.savedata.data); - STORE_32LE(lo, i + 4, gba->memory.savedata.data); - } - } else { - memcpy(gba->memory.savedata.data, payload, size); - } - if (gba->memory.savedata.vf) { - gba->memory.savedata.vf->sync(gba->memory.savedata.vf, gba->memory.savedata.data, size); - } - success = true; - -cleanup: - free(payload); - return success; + return _importSavedata(gba, payload, size); } bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf) { @@ -269,7 +276,6 @@ bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf) { checksum += buffer.c[i] << (checksum % 24); } - if (gba->memory.savedata.type == SAVEDATA_EEPROM) { for (i = 0; i < size; ++i) { char byte = gba->memory.savedata.data[i ^ 7]; @@ -291,3 +297,93 @@ bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf) { return true; } + +int GBASavedataGSVPayloadSize(struct VFile* vf) { + union { + char c[8]; + int32_t i; + } buffer; + vf->seek(vf, 0, SEEK_SET); + if (vf->read(vf, &buffer.c, 8) < 8) { + return 0; + } + if (memcmp(GSV_HEADER, buffer.c, 8) != 0) { + return 0; + } + + // Skip the checksum + if (vf->read(vf, &buffer.i, 4) < 4) { + return 0; + } + + struct { + char name[12]; + int padding; + int type; + int unk[3]; + char description[0x400]; + char footer[4]; + } header; + + if (vf->read(vf, &header, sizeof(header)) < (ssize_t) sizeof(header)) { + return 0; + } + if (memcmp(GSV_FOOTER, header.footer, 4) != 0) { + return 0; + } + + int type; + LOAD_32(type, 0, &header.type); + switch (type) { + case 2: + return SIZE_CART_SRAM; + case 3: + return SIZE_CART_EEPROM512; + case 4: + return SIZE_CART_EEPROM; + case 5: + return SIZE_CART_FLASH512; + case 6: + return SIZE_CART_FLASH1M; // Unconfirmed + default: + return vf->size(vf) - GSV_PAYLOAD_OFFSET; + } +} + +void* GBASavedataGSVGetPayload(struct VFile* vf, size_t* osize, uint8_t* ident, bool testChecksum) { + int32_t size = GBASavedataGSVPayloadSize(vf); + if (!size || size > SIZE_CART_FLASH1M) { + return NULL; + } + + vf->seek(vf, GSV_IDENT_OFFSET, SEEK_SET); + if (ident && vf->read(vf, ident, 12) != 12) { + return NULL; + } + vf->seek(vf, GSV_PAYLOAD_OFFSET, SEEK_SET); + + int8_t* payload = malloc(size); + if (vf->read(vf, payload, size) != size) { + free(payload); + return NULL; + } + UNUSED(testChecksum); // The checksum format is currently unknown + *osize = size; + return payload; +} + +bool GBASavedataImportGSV(struct GBA* gba, struct VFile* vf, bool testChecksum) { + size_t size; + uint8_t ident[12]; + void* payload = GBASavedataGSVGetPayload(vf, &size, ident, testChecksum); + if (!payload) { + return false; + } + struct GBACartridge* cart = (struct GBACartridge*) gba->memory.rom; + if (memcmp(ident, cart->title, sizeof(ident)) != 0) { + free(payload); + return false; + } + + return _importSavedata(gba, payload, size); +} diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index fd99cf4ee..d4715620d 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -852,6 +852,7 @@ void CoreController::importSharkport(const QString& path) { } Interrupter interrupter(this); GBASavedataImportSharkPort(static_cast(m_threadContext.core->board), vf, false); + GBASavedataImportGSV(static_cast(m_threadContext.core->board), vf, false); vf->close(vf); #endif } diff --git a/src/platform/qt/SaveConverter.cpp b/src/platform/qt/SaveConverter.cpp index 050da9be9..d904ed957 100644 --- a/src/platform/qt/SaveConverter.cpp +++ b/src/platform/qt/SaveConverter.cpp @@ -35,7 +35,7 @@ SaveConverter::SaveConverter(std::shared_ptr controller, QWidget connect(m_ui.inputFile, &QLineEdit::textEdited, this, &SaveConverter::refreshInputTypes); connect(m_ui.inputBrowse, &QAbstractButton::clicked, this, [this]() { - QStringList formats{"*.sav", "*.sgm", "*.sps", "*.ss0", "*.ss1", "*.ss2", "*.ss3", "*.ss4", "*.ss5", "*.ss6", "*.ss7", "*.ss8", "*.ss9", "*.xps"}; + QStringList formats{"*.gsv", "*.sav", "*.sgm", "*.sps", "*.ss0", "*.ss1", "*.ss2", "*.ss3", "*.ss4", "*.ss5", "*.ss6", "*.ss7", "*.ss8", "*.ss9", "*.xps"}; QString filter = tr("Save games and save states (%1)").arg(formats.join(QChar(' '))); QString filename = GBAApp::app()->getOpenFileName(this, tr("Select save game or save state"), filter); if (!filename.isEmpty()) { @@ -256,6 +256,7 @@ void SaveConverter::detectFromSize(std::shared_ptr vf) { void SaveConverter::detectFromHeaders(std::shared_ptr vf) { const QByteArray sharkport("\xd\0\0\0SharkPortSave", 0x11); + const QByteArray gsv("ADVSAVEG", 8); QByteArray buffer; vf->seek(0); @@ -276,6 +277,32 @@ void SaveConverter::detectFromHeaders(std::shared_ptr vf) { } free(data); } + } else if (buffer.left(gsv.count()) == gsv) { + size_t size; + void* data = GBASavedataGSVGetPayload(*vf, &size, nullptr, false); + if (data) { + QByteArray bytes = QByteArray::fromRawData(static_cast(data), size); + bytes.data(); // Trigger a deep copy before we delete the backing + switch (size) { + case SIZE_CART_FLASH1M: + m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH1M, std::make_shared(bytes), Endian::NONE, Container::GSV}); + break; + case SIZE_CART_FLASH512: + m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH512, std::make_shared(bytes), Endian::NONE, Container::GSV}); + m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH1M, std::make_shared(bytes), Endian::NONE, Container::GSV}); + break; + case SIZE_CART_SRAM: + m_validSaves.append(AnnotatedSave{SAVEDATA_SRAM, std::make_shared(bytes.left(SIZE_CART_SRAM)), Endian::NONE, Container::GSV}); + break; + case SIZE_CART_EEPROM: + m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM, std::make_shared(bytes.left(SIZE_CART_EEPROM)), Endian::BIG, Container::GSV}); + break; + case SIZE_CART_EEPROM512: + m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM512, std::make_shared(bytes.left(SIZE_CART_EEPROM512)), Endian::BIG, Container::GSV}); + break; + } + free(data); + } } } @@ -501,6 +528,9 @@ SaveConverter::AnnotatedSave::operator QString() const { case Container::SHARKPORT: format = QCoreApplication::translate("SaveConverter", "%1 SharkPort %2 save game"); break; + case Container::GSV: + format = QCoreApplication::translate("SaveConverter", "%1 GameShark Advance SP %2 save game"); + break; case Container::NONE: break; } diff --git a/src/platform/qt/SaveConverter.h b/src/platform/qt/SaveConverter.h index 5a94c4804..6b9f3df62 100644 --- a/src/platform/qt/SaveConverter.h +++ b/src/platform/qt/SaveConverter.h @@ -59,7 +59,8 @@ private: enum class Container { NONE = 0, SAVESTATE, - SHARKPORT + SHARKPORT, + GSV }; struct AnnotatedSave { AnnotatedSave(); diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index fb85c8990..a57106152 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -492,7 +492,7 @@ void Window::loadCamImage() { } void Window::importSharkport() { - QString filename = GBAApp::app()->getOpenFileName(this, tr("Select save"), tr("GameShark saves (*.sps *.xps)")); + QString filename = GBAApp::app()->getOpenFileName(this, tr("Select save"), tr("GameShark saves (*.gsv *.sps *.xps)")); if (!filename.isEmpty()) { m_controller->importSharkport(filename); } From 6c42e2a834d794c5e85a0d34c241da517083aa11 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 21 Dec 2021 20:39:38 -0800 Subject: [PATCH 30/59] Qt: Update translations --- src/platform/qt/ts/mgba-de.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-en.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-es.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-fi.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-fr.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-hu.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-it.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-ja.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-ko.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-ms.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-nb_NO.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-nl.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-pl.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-pt_BR.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-ru.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-template.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-tr.ts | 84 +++++++++++++++++------------ src/platform/qt/ts/mgba-zh_CN.ts | 84 +++++++++++++++++------------ 18 files changed, 882 insertions(+), 630 deletions(-) diff --git a/src/platform/qt/ts/mgba-de.ts b/src/platform/qt/ts/mgba-de.ts index f4445a375..5d24de585 100644 --- a/src/platform/qt/ts/mgba-de.ts +++ b/src/platform/qt/ts/mgba-de.ts @@ -1296,27 +1296,27 @@ Download-Größe: %3 QGBA::CoreController - + Failed to open save file: %1 Fehler beim Öffnen der Speicherdatei: %1 - + Failed to open game file: %1 Fehler beim Öffnen der Spieldatei: %1 - + Can't yank pack in unexpected platform! Das GamePak kann nur auf unterstützten Plattformen herausgezogen werden! - + Failed to open snapshot file for reading: %1 Konnte Snapshot-Datei %1 nicht zum Lesen öffnen - + Failed to open snapshot file for writing: %1 Konnte Snapshot-Datei %1 nicht zum Schreiben öffnen @@ -3533,39 +3533,39 @@ Download-Größe: %3 Spiegel - + None Keiner - + Both Beidseitig - + Horizontal Horizontal - + Vertical Vertikal - - - + + + N/A Nicht verfügbar - + Export map Map exportieren - + Portable Network Graphics (*.png) Portable Network Graphics (*.png) @@ -3864,22 +3864,22 @@ Download-Größe: %3 Datei konnte nicht geöffnet werden - + No valid formats found Keine gültigen Formate gefunden - + Please select a valid input file Bitte wähle eine gültige Eingabedatei - + No valid conversions found Keine gültigen Konvertierungen gefunden - + Cannot convert save games between platforms Der Spielstand konnte nicht zwischen verschiedenen Plattformen konvertiert werden @@ -4159,7 +4159,6 @@ Download-Größe: %3 Bild-Datei (*.png *.gif *.jpg *.jpeg);;Alle Dateien (*) - GameShark saves (*.sps *.xps) GameShark-Speicherdaten (*.sps *.xps) @@ -4645,6 +4644,11 @@ Download-Größe: %3 e-Reader card (*.raw *.bin *.bmp) e-Reader-Karte (*.raw *.bin *.bmp) + + + GameShark saves (*.gsv *.sps *.xps) + + Couldn't Start @@ -4987,85 +4991,95 @@ Download-Größe: %3 Ausgabedatei - + %1 %2 save game Spielstand %1 %2 - + little endian little-endian - + big endian big-endian - + SRAM SRAM - + %1 flash %1 Flash - + %1 EEPROM %1 EEPROM - + %1 SRAM + RTC %1 SRAM + RTC - + %1 SRAM %1 SRAM - + packed MBC2 MBC2, komprimiert - + unpacked MBC2 MBC2, entpackt - + MBC6 flash MBC6 Flash-Speicher - + MBC6 combined SRAM + flash MBC6 SRAM + Flash-Speicher - + MBC6 SRAM MBC6 SRAM - + TAMA5 TAMA5 - + %1 (%2) %1 (%2) - + %1 save state with embedded %2 save game Savestate %1 mit eingebettetem Spielstand %2 + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-en.ts b/src/platform/qt/ts/mgba-en.ts index 86d41d2a8..72643bad4 100644 --- a/src/platform/qt/ts/mgba-en.ts +++ b/src/platform/qt/ts/mgba-en.ts @@ -1292,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3529,39 +3529,39 @@ Download size: %3 - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) @@ -3860,22 +3860,22 @@ Download size: %3 - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4150,7 +4150,6 @@ Download size: %3 - GameShark saves (*.sps *.xps) @@ -4419,6 +4418,11 @@ Download size: %3 Convert save game... + + + GameShark saves (*.gsv *.sps *.xps) + + Import GameShark Save... @@ -4981,85 +4985,95 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-es.ts b/src/platform/qt/ts/mgba-es.ts index b6cc3dc95..6f364eb7c 100644 --- a/src/platform/qt/ts/mgba-es.ts +++ b/src/platform/qt/ts/mgba-es.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Error al abrir el archivo de guardado: %1 - + Failed to open game file: %1 Error al abrir el archivo del juego: %1 - + Can't yank pack in unexpected platform! ¡No se puede remover el cartucho en esta plataforma! - + Failed to open snapshot file for reading: %1 Error al leer del archivo de captura: %1 - + Failed to open snapshot file for writing: %1 Error al escribir al archivo de captura: %1 @@ -3530,39 +3530,39 @@ Download size: %3 Espejar - + None Ninguno - + Both Ambos - + Horizontal Horizontal - + Vertical Vertical - - - + + + N/A n/d - + Export map Exportar mapa - + Portable Network Graphics (*.png) Gráficos de red portátiles (*.png) @@ -3861,22 +3861,22 @@ Download size: %3 Error al abrir el archivo - + No valid formats found No se encontraron formatos válidos - + Please select a valid input file Seleccione un archivo de entrada válido - + No valid conversions found No se encontraron conversiones validas - + Cannot convert save games between platforms No se pueden convertir los estados guardados entre plataformas distintas @@ -4151,7 +4151,6 @@ Download size: %3 Archivo de imagen (*.png *.gif *.jpg *.jpeg);;Todos los archivos (*) - GameShark saves (*.sps *.xps) Guardados de GameShark (*.sps *.xps) @@ -4427,6 +4426,11 @@ Download size: %3 Convert save game... Convertir juego guardado... + + + GameShark saves (*.gsv *.sps *.xps) + + New multiplayer window @@ -4984,85 +4988,95 @@ Download size: %3 Archivo de salida - + %1 %2 save game %1 %2 juego guardado - + little endian little-endian - + big endian big-endian - + SRAM SRAM - + %1 flash %1 flash - + %1 EEPROM %1 EEPROM - + %1 SRAM + RTC %1 SRAM + RTC - + %1 SRAM %1 SRAM - + packed MBC2 MBC2 empacado - + unpacked MBC2 MBC2 desempacado - + MBC6 flash flash MBC6 - + MBC6 combined SRAM + flash SRAM + flash combinados MBC6 - + MBC6 SRAM SRAM MBC6 - + TAMA5 TAMA5 - + %1 (%2) %1 (%2) - + %1 save state with embedded %2 save game %1 estado guardado con juego guardado %2 integrado + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-fi.ts b/src/platform/qt/ts/mgba-fi.ts index b4b69e759..9dd83e89a 100644 --- a/src/platform/qt/ts/mgba-fi.ts +++ b/src/platform/qt/ts/mgba-fi.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3530,39 +3530,39 @@ Download size: %3 - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) @@ -3861,22 +3861,22 @@ Download size: %3 - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4151,7 +4151,6 @@ Download size: %3 - GameShark saves (*.sps *.xps) @@ -4415,6 +4414,11 @@ Download size: %3 %1 of %2 e-Reader cards converted successfully. + + + GameShark saves (*.gsv *.sps *.xps) + + Convert e-Reader card image to raw... @@ -4982,85 +4986,95 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index 9679b2bc9..39f67cc30 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -1294,27 +1294,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Échec de l'ouverture du fichier de sauvegarde : %1 - + Failed to open game file: %1 Échec de l'ouverture du fichier de jeu : %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 Échec de l'ouverture de l'instantané pour lire : %1 - + Failed to open snapshot file for writing: %1 Échec de l'ouverture de l'instantané pour écrire : %1 @@ -3549,39 +3549,39 @@ Download size: %3 Miroir - + None Aucun - + Both Les deux - + Horizontal Horizontal - + Vertical Vertical - - - + + + N/A s.o. - + Export map Exporter la map - + Portable Network Graphics (*.png) Portable Network Graphics (*.png) @@ -3880,22 +3880,22 @@ Download size: %3 - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4190,7 +4190,6 @@ Download size: %3 Image (*.png *.gif *.jpg *.jpeg);;Tous les fichiers (*) - GameShark saves (*.sps *.xps) Sauvegardes GameShark (*.sps *.xps) @@ -4631,6 +4630,11 @@ Download size: %3 Select save state + + + GameShark saves (*.gsv *.sps *.xps) + + Could not start game. @@ -5003,85 +5007,95 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-hu.ts b/src/platform/qt/ts/mgba-hu.ts index 9f63f36a9..b88a2ae3c 100644 --- a/src/platform/qt/ts/mgba-hu.ts +++ b/src/platform/qt/ts/mgba-hu.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Nem sikerült a mentésfájl megnyitása: %1 - + Failed to open game file: %1 Nem sikerült a játékfájl megnyitása: %1 - + Can't yank pack in unexpected platform! A játékkazettát nem lehet kirántani ismeretlen platformon! - + Failed to open snapshot file for reading: %1 A pillanatkép fájljának olvasásra való megnyitása sikertelen: %1 - + Failed to open snapshot file for writing: %1 A pillanatkép fájljának írásra való megnyitása sikertelen: %1 @@ -3530,39 +3530,39 @@ Download size: %3 - + None Nincs - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) Portable Network Graphics (*.png) @@ -3861,22 +3861,22 @@ Download size: %3 - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4149,7 +4149,6 @@ Download size: %3 - GameShark saves (*.sps *.xps) @@ -4418,6 +4417,11 @@ Download size: %3 Convert save game... + + + GameShark saves (*.gsv *.sps *.xps) + + Import GameShark Save... @@ -4980,85 +4984,95 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-it.ts b/src/platform/qt/ts/mgba-it.ts index 172340855..aabda7fe9 100644 --- a/src/platform/qt/ts/mgba-it.ts +++ b/src/platform/qt/ts/mgba-it.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Impossibile aprire il file di salvataggio: %1 - + Failed to open game file: %1 Impossibile aprire il file di gioco: %1 - + Can't yank pack in unexpected platform! Non riesco a strappare il pacchetto in una piattaforma inaspettata! - + Failed to open snapshot file for reading: %1 Impossibile aprire il file snapshot per la lettura: %1 - + Failed to open snapshot file for writing: %1 Impossibile aprire il file snapshot per la scrittura: %1 @@ -3530,39 +3530,39 @@ Download size: %3 Speculare - + None Nessuno - + Both Entrambi - + Horizontal Orizzontale - + Vertical Verticale - - - + + + N/A N/D - + Export map Esporta Mappa - + Portable Network Graphics (*.png) Portable Network Graphics (*.png) @@ -3861,22 +3861,22 @@ Download size: %3 Non è stato possibile aprire il file - + No valid formats found Nessun formato valido trovato - + Please select a valid input file Si prega di selezionare un file di input valido - + No valid conversions found Nessune conversioni valide trovate - + Cannot convert save games between platforms Impossibile convertire salvataggi tra piattaforme @@ -4166,7 +4166,6 @@ Download size: %3 File immagine (*.png *.gif *.jpg *.jpeg);;Tutti i file (*) - GameShark saves (*.sps *.xps) Salvataggi GameShark (*.sps *.xps) @@ -4361,6 +4360,11 @@ Download size: %3 Convert save game... Converti salvataggi... + + + GameShark saves (*.gsv *.sps *.xps) + + New multiplayer window @@ -4984,85 +4988,95 @@ Download size: %3 File output - + %1 %2 save game %1 %2 salvataggio - + little endian little endian - + big endian big endian - + SRAM SRAM - + %1 flash %1 flash - + %1 EEPROM %1 EEPROM - + %1 SRAM + RTC %1 SRAM + OTR - + %1 SRAM %1 SRAM - + packed MBC2 MBC2 compresso - + unpacked MBC2 MBC2 non compresso - + MBC6 flash MBC6 flash - + MBC6 combined SRAM + flash MBC6 combinato con la SRAM + flash - + MBC6 SRAM SRAM MBC6 - + TAMA5 TAMA5 - + %1 (%2) %1 (%2) - + %1 save state with embedded %2 save game %1 stato di salvataggio incorporato con il salvataggio %2 + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index 04de1273a..c236db9c2 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 セーブファイルを開けませんでした: %1 - + Failed to open game file: %1 ゲームファイルを開けませんでした: %1 - + Can't yank pack in unexpected platform! 予期しないプラットフォームでパックをヤンクすることはできません! - + Failed to open snapshot file for reading: %1 読み取り用のスナップショットファイルを開けませんでした: %1 - + Failed to open snapshot file for writing: %1 書き込み用のスナップショットファイルを開けませんでした: %1 @@ -3530,39 +3530,39 @@ Download size: %3 ミラー - + None なし - + Both 両方 - + Horizontal - + Vertical - - - + + + N/A N/A - + Export map マップを書き出す - + Portable Network Graphics (*.png) Portable Network Graphics (*.png) @@ -3861,22 +3861,22 @@ Download size: %3 - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4149,7 +4149,6 @@ Download size: %3 画像ファイル (*.png *.gif *.jpg *.jpeg);;すべてのファイル (*) - GameShark saves (*.sps *.xps) GameSharkセーブファイル (*.sps *.xps) @@ -4445,6 +4444,11 @@ Download size: %3 Convert save game... + + + GameShark saves (*.gsv *.sps *.xps) + + Import GameShark Save... @@ -4982,85 +4986,95 @@ Download size: %3 - + %1 %2 save game - + little endian リトルエンディアン - + big endian ビッグエンディアン - + SRAM SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-ko.ts b/src/platform/qt/ts/mgba-ko.ts index 883e1f4a8..e6cbab94c 100644 --- a/src/platform/qt/ts/mgba-ko.ts +++ b/src/platform/qt/ts/mgba-ko.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 저장 파일을 열지 못했습니다: %1 - + Failed to open game file: %1 게임 파일을 열지 못했습니다: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 읽기 용 스냅샷 파일을 열지 못했습니다: %1 - + Failed to open snapshot file for writing: %1 쓰기 용 스냅샷 파일을 열지 못했습니다: %1 @@ -3530,39 +3530,39 @@ Download size: %3 미러링 - + None 없음 - + Both 둘 다 - + Horizontal 수평 - + Vertical 수직 - - - + + + N/A N/A - + Export map 맵 내보내기 - + Portable Network Graphics (*.png) 휴대용 네트워크 그래픽 (*.png) @@ -3861,22 +3861,22 @@ Download size: %3 - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4164,7 +4164,6 @@ Download size: %3 이미지 파일 (*.png *.gif *.jpg *.jpeg);;모든 파일 (*) - GameShark saves (*.sps *.xps) 게임샤크 저장 파일 (*.sps *.xps) @@ -4359,6 +4358,11 @@ Download size: %3 Convert save game... + + + GameShark saves (*.gsv *.sps *.xps) + + New multiplayer window @@ -4982,85 +4986,95 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-ms.ts b/src/platform/qt/ts/mgba-ms.ts index d9a1bb9db..cbf9418f1 100644 --- a/src/platform/qt/ts/mgba-ms.ts +++ b/src/platform/qt/ts/mgba-ms.ts @@ -1292,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Gagal membuka fail tersimpan: %1 - + Failed to open game file: %1 Gagal membuka fail permainan: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 Gagal membuka fail snapshot untuk baca: %1 - + Failed to open snapshot file for writing: %1 Gagal membuka fail snapshot untuk menulis: %1 @@ -3529,39 +3529,39 @@ Download size: %3 Cermin - + None Tiada - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map Eksport peta - + Portable Network Graphics (*.png) Grafik Rangkaian Mudah Alih (*.png) @@ -3860,22 +3860,22 @@ Download size: %3 Tidak dapat membuka fail - + No valid formats found Tiada format yang sah ditemui - + Please select a valid input file Sila pilih fail input yang sah - + No valid conversions found Tiada penukaran yang sah ditemui - + Cannot convert save games between platforms Tidak boleh menukar simpanan permainan antara platform @@ -4148,7 +4148,6 @@ Download size: %3 Fail gambar (*.png *.gif *.jpg *.jpeg);;Semua fail (*) - GameShark saves (*.sps *.xps) Simpanan GameShark (*.sps *.xps) @@ -4419,6 +4418,11 @@ Download size: %3 Convert save game... Tukar simpanan permainan... + + + GameShark saves (*.gsv *.sps *.xps) + + Import GameShark Save... @@ -4981,85 +4985,95 @@ Download size: %3 Fail output - + %1 %2 save game Simpanan permainan %1 %2 - + little endian little-endian - + big endian big-endian - + SRAM SRAM - + %1 flash %1 kilat - + %1 EEPROM %1 EEPROM - + %1 SRAM + RTC %1 SRAM + RTC - + %1 SRAM %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash Kilat MBC6 - + MBC6 combined SRAM + flash MBC6 bergabung SRAM + kilat - + MBC6 SRAM SRAM MBC6 - + TAMA5 TAMA5 - + %1 (%2) %1 (%2) - + %1 save state with embedded %2 save game Keadaan tersimpan %1 dgn simpanan permainan terbenam %2 + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-nb_NO.ts b/src/platform/qt/ts/mgba-nb_NO.ts index fd2a3c03a..91ebef059 100644 --- a/src/platform/qt/ts/mgba-nb_NO.ts +++ b/src/platform/qt/ts/mgba-nb_NO.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 Klarte ikke å åpne spillfil: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3530,39 +3530,39 @@ Download size: %3 - + None Ingen - + Both Begge - + Horizontal - + Vertical - - - + + + N/A I/T - + Export map - + Portable Network Graphics (*.png) @@ -3861,22 +3861,22 @@ Download size: %3 Kunne ikke åpne fil - + No valid formats found - + Please select a valid input file Velg en gyldig inndatafil - + No valid conversions found - + Cannot convert save games between platforms @@ -4151,7 +4151,6 @@ Download size: %3 Bildefil (*.png *.gif *.jpg *.jpeg);;All filer (*) - GameShark saves (*.sps *.xps) @@ -4420,6 +4419,11 @@ Download size: %3 Convert save game... + + + GameShark saves (*.gsv *.sps *.xps) + + Import GameShark Save... @@ -4982,85 +4986,95 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-nl.ts b/src/platform/qt/ts/mgba-nl.ts index 5fb62eb12..7e2d1a629 100644 --- a/src/platform/qt/ts/mgba-nl.ts +++ b/src/platform/qt/ts/mgba-nl.ts @@ -1292,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3529,39 +3529,39 @@ Download size: %3 - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) @@ -3860,22 +3860,22 @@ Download size: %3 - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4150,7 +4150,6 @@ Download size: %3 - GameShark saves (*.sps *.xps) @@ -4419,6 +4418,11 @@ Download size: %3 Convert save game... + + + GameShark saves (*.gsv *.sps *.xps) + + Import GameShark Save... @@ -4981,85 +4985,95 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index e307eac3e..c60e57a8a 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -1292,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3529,39 +3529,39 @@ Download size: %3 - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) @@ -3860,22 +3860,22 @@ Download size: %3 - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4152,7 +4152,6 @@ Download size: %3 - GameShark saves (*.sps *.xps) @@ -4421,6 +4420,11 @@ Download size: %3 Convert save game... + + + GameShark saves (*.gsv *.sps *.xps) + + Import GameShark Save... @@ -4983,85 +4987,95 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-pt_BR.ts b/src/platform/qt/ts/mgba-pt_BR.ts index 1faa0e005..fd70cd5cc 100644 --- a/src/platform/qt/ts/mgba-pt_BR.ts +++ b/src/platform/qt/ts/mgba-pt_BR.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Falhou em abrir o arquivo do save: %1 - + Failed to open game file: %1 Falhou em abrir o arquivo do jogo: %1 - + Can't yank pack in unexpected platform! Não pode arrancar o pacote numa plataforma inesperada! - + Failed to open snapshot file for reading: %1 Falhou em abrir o arquivo do snapshot pra leitura: %1 - + Failed to open snapshot file for writing: %1 Falhou em abrir o arquivo do snapshot pra gravação: %1 @@ -3530,39 +3530,39 @@ Download size: %3 Espelho - + None Nenhum - + Both Ambos - + Horizontal Horizontal - + Vertical Vertical - - - + + + N/A N/D - + Export map Exportar mapa - + Portable Network Graphics (*.png) Gráficos Portáteis da Rede (*.png) @@ -3861,22 +3861,22 @@ Download size: %3 Não pôde abrir o arquivo - + No valid formats found Nenhum formato válido encontrado - + Please select a valid input file Por favor selecione um arquivo de entrada válido - + No valid conversions found Nenhuma conversão válida encontrada - + Cannot convert save games between platforms Não pôde converter os saves do jogo entre as plataformas @@ -4151,7 +4151,6 @@ Download size: %3 Arquivo de imagem (*.png *.gif *.jpg *.jpeg);;Todos os arquivos (*) - GameShark saves (*.sps *.xps) Saves do GameShark (*.sps *.xps) @@ -4427,6 +4426,11 @@ Download size: %3 Convert save game... Converter save do jogo... + + + GameShark saves (*.gsv *.sps *.xps) + + New multiplayer window @@ -4984,85 +4988,95 @@ Download size: %3 Arquivo de saída - + %1 %2 save game %1 %2 save do jogo - + little endian little endian - + big endian big endian - + SRAM SRAM - + %1 flash %1 flash - + %1 EEPROM %1 EEPROM - + %1 SRAM + RTC %1 SRAM + RTC - + %1 SRAM %1 SRAM - + packed MBC2 empacotou o MBC2 - + unpacked MBC2 desempacotou o MBC2 - + MBC6 flash Flash do MBC6 - + MBC6 combined SRAM + flash MBC6 SRAM combinado + flash - + MBC6 SRAM MBC6 SRAM - + TAMA5 TAMA5 - + %1 (%2) %1 (%2) - + %1 save state with embedded %2 save game %1 save state com %2 saves dos jogos embutidos + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 67f332099..2e15cc873 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -1296,27 +1296,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Не удалось открыть файл сохранения: %1 - + Failed to open game file: %1 Не удалось открыть файл игры: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 Не удалось открыть файл изображения для считывания: %1 - + Failed to open snapshot file for writing: %1 Не удалось открыть файл изображения для записи: %1 @@ -3533,39 +3533,39 @@ Download size: %3 Зеркально - + None Нет - + Both Оба - + Horizontal - + Vertical - - - + + + N/A Н/Д - + Export map Экспорт карты - + Portable Network Graphics (*.png) Portable Network Graphics (*.png) @@ -3864,22 +3864,22 @@ Download size: %3 Не удалось открыть файл - + No valid formats found Совместимые форматы не найдены - + Please select a valid input file Пожалуйста, выберите совместимый входной файл - + No valid conversions found Совместимые конверсии не найдены - + Cannot convert save games between platforms Нельзя сконвертировать сохранения для разных платформ @@ -4156,7 +4156,6 @@ Download size: %3 Файл изображения (*.png *.gif *.jpg *.jpeg);;All files (*) - GameShark saves (*.sps *.xps) Сохранения GameShark (*.sps *.xps) @@ -4427,6 +4426,11 @@ Download size: %3 Convert save game... + + + GameShark saves (*.gsv *.sps *.xps) + + Import GameShark Save... @@ -4989,85 +4993,95 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-template.ts b/src/platform/qt/ts/mgba-template.ts index 6ec6eb304..9728a5d2f 100644 --- a/src/platform/qt/ts/mgba-template.ts +++ b/src/platform/qt/ts/mgba-template.ts @@ -1292,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3529,39 +3529,39 @@ Download size: %3 - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) @@ -3860,22 +3860,22 @@ Download size: %3 - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4148,7 +4148,6 @@ Download size: %3 - GameShark saves (*.sps *.xps) @@ -4417,6 +4416,11 @@ Download size: %3 Convert save game... + + + GameShark saves (*.gsv *.sps *.xps) + + Import GameShark Save... @@ -4979,85 +4983,95 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM - + %1 flash - + %1 EEPROM - + %1 SRAM + RTC - + %1 SRAM - + packed MBC2 - + unpacked MBC2 - + MBC6 flash - + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts index 1aed94c88..2ce027593 100644 --- a/src/platform/qt/ts/mgba-tr.ts +++ b/src/platform/qt/ts/mgba-tr.ts @@ -1293,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 Kayıt dosyası açılamadı: %1 - + Failed to open game file: %1 Oyun dosyası açılamadı: %1 - + Can't yank pack in unexpected platform! Beklenmedik bir platformda kartı çıkaramazsın! - + Failed to open snapshot file for reading: %1 Anlık görüntü dosyası okuma için açılamadı: %1 - + Failed to open snapshot file for writing: %1 Anlık görüntü dosyası yazma için açılamadı: %1 @@ -3530,39 +3530,39 @@ Download size: %3 Ayna - + None Hiçbiri - + Both - + Horizontal Yatay - + Vertical Dikey - - - + + + N/A N/A - + Export map Haritayı dışarı aktar - + Portable Network Graphics (*.png) @@ -3861,22 +3861,22 @@ Download size: %3 Dosya açılamadı - + No valid formats found Geçerli türler bulunamadı - + Please select a valid input file Lütfen geçerli bir giriş dosyası seç - + No valid conversions found Geçerli dönüştürme bulunamadı - + Cannot convert save games between platforms Kayıtlı oyunlar platformlar arasında dönüştürülemez @@ -4169,7 +4169,6 @@ Download size: %3 Resim dosyası (*.png *.gif *.jpg *.jpeg);;All files (*) - GameShark saves (*.sps *.xps) GameShark kayıtları (*.sps *.xps) @@ -4374,6 +4373,11 @@ Download size: %3 Convert save game... Kayıtlı oyun dömnüştürülüyor... + + + GameShark saves (*.gsv *.sps *.xps) + + New multiplayer window @@ -4982,85 +4986,95 @@ Download size: %3 Çıkış dosyası - + %1 %2 save game %1 %2 kayıtlı oyun - + little endian little endian - + big endian big endian - + SRAM SRAM - + %1 flash %1 flash - + %1 EEPROM %1 EEPROM - + %1 SRAM + RTC %1 SRAM + RTC - + %1 SRAM %1 SRAM - + packed MBC2 paketli MBC2 - + unpacked MBC2 paketlenmemiş MBC2 - + MBC6 flash MBC6 flash - + MBC6 combined SRAM + flash MBC6 ile birleştirilmiş SRAM + flash - + MBC6 SRAM MBC6 SRAM - + TAMA5 TAMA5 - + %1 (%2) %1 (%2) - + %1 save state with embedded %2 save game Gömülü %2 kayıtlı oyunla %1 kayıt durumu + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView diff --git a/src/platform/qt/ts/mgba-zh_CN.ts b/src/platform/qt/ts/mgba-zh_CN.ts index a6eeb6719..80f150a15 100644 --- a/src/platform/qt/ts/mgba-zh_CN.ts +++ b/src/platform/qt/ts/mgba-zh_CN.ts @@ -1296,27 +1296,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 打开存档失败: %1 - + Failed to open game file: %1 打开游戏文件失败: %1 - + Can't yank pack in unexpected platform! 无法在意外平台上抽出卡带! - + Failed to open snapshot file for reading: %1 读取快照文件失败: %1 - + Failed to open snapshot file for writing: %1 写入快照文件失败: %1 @@ -3533,39 +3533,39 @@ Download size: %3 镜像 - + None - + Both 两者 - + Horizontal 水平 - + Vertical 垂直 - - - + + + N/A - + Export map 导出映射 - + Portable Network Graphics (*.png) 便携式网络图形 (*.png) @@ -3864,22 +3864,22 @@ Download size: %3 无法打开文件 - + No valid formats found 未找到有效格式 - + Please select a valid input file 请选择一个有效的输入文件 - + No valid conversions found 未发现有效转换 - + Cannot convert save games between platforms 无法在平台之间转换保存游戏 @@ -4152,7 +4152,6 @@ Download size: %3 图像文件 (*.png *.gif *.jpg *.jpeg);;所有文件 (*) - GameShark saves (*.sps *.xps) GameShark 存档 (*.sps *.xps) @@ -4423,6 +4422,11 @@ Download size: %3 Convert save game... 转换保存游戏... + + + GameShark saves (*.gsv *.sps *.xps) + + Import GameShark Save... @@ -4985,85 +4989,95 @@ Download size: %3 输出文件 - + %1 %2 save game %1 %2 保存游戏 - + little endian 小端 - + big endian 大端 - + SRAM SRAM - + %1 flash %1 闪存 - + %1 EEPROM %1 EEPROM - + %1 SRAM + RTC %1 SRAM + RTC - + %1 SRAM %1 SRAM - + packed MBC2 包装的MBC2 - + unpacked MBC2 未包装的 MBC2 - + MBC6 flash MBC6 闪存 - + MBC6 combined SRAM + flash MBC6组合SRAM+闪存 - + MBC6 SRAM MBC6 SRAM - + TAMA5 TAMA5 - + %1 (%2) %1(%2) - + %1 save state with embedded %2 save game 带嵌入的 %2 保存游戏的 %1 保存状态 + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + SensorView From cb9f736f2a770d1cac515a00eda0837e62f0114c Mon Sep 17 00:00:00 2001 From: Alexey Date: Sat, 21 Aug 2021 15:26:03 +0000 Subject: [PATCH 31/59] Qt: Update translation (Russian) Translation: mGBA/Qt Translate-URL: https://hosted.weblate.org/projects/mgba/mgba-qt/ru/ --- src/platform/qt/ts/mgba-ru.ts | 62 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 2e15cc873..6db47cc61 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -4313,118 +4313,118 @@ Download size: %3 Load alternate save game... - + Загрузить альтернативное сохранение... Load temporary save game... - + Загрузить временное сохранение... Load &patch... - + Загрузить &патч... Boot BIOS - + Загрузиться в BIOS Replace ROM... - + Заменить ROM... Scan e-Reader dotcodes... - + Сканировать dot-коды e-Reader... Convert e-Reader card image to raw... - + Конвертировать карту e-Reader в raw... ROM &info... - + Информация об &игре... Recent - + Недавние Make portable - + Портативный режим &Load state - + &Загрузить состояние Load state file... - + Загрузить состояние из файла... &Save state - + &Сохранить состояние Save state file... - + Сохранить состояние в файл... Quick load - + Быстрая загрузка Quick save - + Быстрое сохранение Load recent - + Загрузить недавнее Save recent - + Сохранить в недавнее Undo load state - + Отмена загрузки состояния Undo save state - + Отмена сохранения состояния State &%1 - + Слот &%1 Load camera image... - + Загрузить изображение с камеры... Convert save game... - + Конвертировать игровое сохранение... @@ -4434,42 +4434,42 @@ Download size: %3 Import GameShark Save... - + Импорт сохранения GameShark... Export GameShark Save... - + Экспорт сохранения GameShark... New multiplayer window - + Новое окно мультиплеера Connect to Dolphin... - + Соединение с Dolphin... Report bug... - + Сообщить об ошибке... About... - + О программе... E&xit - + &Выход &Emulation - + &Эмуляция From 23a815b99c95b7c3330974c6d5cbece1619f1e80 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 28 Dec 2021 15:22:24 -0800 Subject: [PATCH 32/59] GB I/O: Add placeholder names for some unimplemented registers --- include/mgba/internal/gb/io.h | 7 ++++--- src/gb/io.c | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/include/mgba/internal/gb/io.h b/include/mgba/internal/gb/io.h index 44d83290c..ada06dcb1 100644 --- a/include/mgba/internal/gb/io.h +++ b/include/mgba/internal/gb/io.h @@ -100,9 +100,10 @@ enum GBIORegisters { GB_REG_OCPD = 0x6B, GB_REG_OPRI = 0x6C, GB_REG_SVBK = 0x70, - GB_REG_UNK72 = 0x72, - GB_REG_UNK73 = 0x73, - GB_REG_UNK74 = 0x74, + GB_REG_PSM = 0x71, + GB_REG_PSWX = 0x72, + GB_REG_PSWY = 0x73, + GB_REG_PSW = 0x74, GB_REG_UNK75 = 0x75, GB_REG_PCM12 = 0x76, GB_REG_PCM34 = 0x77, diff --git a/src/gb/io.c b/src/gb/io.c index 74ce4caee..affa99a51 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -687,8 +687,10 @@ uint8_t GBIORead(struct GB* gb, unsigned address) { case GB_REG_OCPS: case GB_REG_OCPD: case GB_REG_SVBK: - case GB_REG_UNK72: - case GB_REG_UNK73: + case GB_REG_PSM: + case GB_REG_PSWX: + case GB_REG_PSWY: + case GB_REG_PSW: case GB_REG_UNK75: // Handled transparently by the registers if (gb->model < GB_MODEL_CGB) { From ee610db141499fb7d8ebae3901838a7e893adcd2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 28 Dec 2021 17:12:22 -0800 Subject: [PATCH 33/59] GBA BIOS: Work around IRQ handling hiccup in Mario & Luigi (fixes #1059) --- CHANGES | 1 + src/gba/hle-bios.c | 12 ++++++------ src/gba/hle-bios.s | 14 +++++++------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/CHANGES b/CHANGES index 398df1445..62f6daa64 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ Emulation fixes: - ARM7: Fix unsigned multiply timing - GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032) - GBA: Improve timing when not booting from BIOS + - GBA BIOS: Work around IRQ handling hiccup in Mario & Luigi (fixes mgba.io/i/1059) - GBA I/O: Redo internal key input, enabling edge-based key IRQs - GBA Memory: Fix misaligned 32-bit I/O loads (fixes mgba.io/i/2307) Other fixes: diff --git a/src/gba/hle-bios.c b/src/gba/hle-bios.c index 05223b937..9ee6dd5b1 100644 --- a/src/gba/hle-bios.c +++ b/src/gba/hle-bios.c @@ -9,17 +9,17 @@ const uint8_t hleBios[SIZE_BIOS] = { 0x03, 0x10, 0xd0, 0xe5, 0xea, 0x00, 0x51, 0xe3, 0x4c, 0x01, 0x9f, 0x15, 0x10, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x29, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe3, 0x01, 0xd3, 0xa0, 0x03, - 0x20, 0xd0, 0x4d, 0x02, 0x00, 0x58, 0x2d, 0xe9, 0x02, 0xb0, 0x5e, 0xe5, - 0xd4, 0xc0, 0xa0, 0xe3, 0x0b, 0xb1, 0x9c, 0xe7, 0xd2, 0xcf, 0xa0, 0xe3, - 0x0b, 0x00, 0x5c, 0xe1, 0x00, 0xc0, 0x4f, 0xe1, 0x00, 0x10, 0x2d, 0xe9, + 0x20, 0xd0, 0x4d, 0x02, 0x10, 0x50, 0x2d, 0xe9, 0x02, 0x40, 0x5e, 0xe5, + 0xd4, 0xc0, 0xa0, 0xe3, 0x04, 0x41, 0x9c, 0xe7, 0xd2, 0xcf, 0xa0, 0xe3, + 0x04, 0x00, 0x5c, 0xe1, 0x00, 0xc0, 0x4f, 0xe1, 0x00, 0x10, 0x2d, 0xe9, 0x80, 0xc0, 0x0c, 0xe2, 0x1f, 0xc0, 0x8c, 0xe3, 0x0c, 0xf0, 0x21, 0xe1, - 0x00, 0x00, 0xf0, 0x0f, 0x04, 0x40, 0x2d, 0xe9, 0x00, 0x00, 0x5b, 0xe3, + 0x00, 0x00, 0xf0, 0x0f, 0x04, 0x40, 0x2d, 0xe9, 0x00, 0x00, 0x54, 0xe3, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, - 0x0f, 0xe0, 0xa0, 0xe1, 0x1b, 0xff, 0x2f, 0x11, 0x00, 0x00, 0xa0, 0xe1, + 0x0f, 0xe0, 0xa0, 0xe1, 0x14, 0xff, 0x2f, 0x11, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x04, 0x40, 0xbd, 0xe8, 0x93, 0xf0, 0x29, 0xe3, 0x00, 0x10, 0xbd, 0xe8, 0x0c, 0xf0, 0x69, 0xe1, - 0x00, 0x58, 0xbd, 0xe8, 0x0e, 0xf0, 0xb0, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x50, 0xbd, 0xe8, 0x0e, 0xf0, 0xb0, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0xa0, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0x48, 0x03, 0x00, 0x00, diff --git a/src/gba/hle-bios.s b/src/gba/hle-bios.s index 8234b9e45..be0d81703 100644 --- a/src/gba/hle-bios.s +++ b/src/gba/hle-bios.s @@ -31,12 +31,12 @@ swiBase: cmp sp, #0 moveq sp, #0x04000000 subeq sp, #0x20 -stmfd sp!, {r11-r12, lr} -ldrb r11, [lr, #-2] +stmfd sp!, {r4, r12, lr} +ldrb r4, [lr, #-2] mov r12, #swiTable -ldr r11, [r12, r11, lsl #2] +ldr r4, [r12, r4, lsl #2] mov r12, #StallCall -cmp r12, r11 +cmp r12, r4 mrs r12, spsr stmfd sp!, {r12} and r12, #0x80 @@ -44,7 +44,7 @@ orr r12, #0x1F msr cpsr_c, r12 swieq 0xF00000 @ Special mGBA-internal call to load the stall count into r12 stmfd sp!, {r2, lr} -cmp r11, #0 +cmp r4, #0 nop nop nop @@ -52,7 +52,7 @@ nop nop nop mov lr, pc -bxne r11 +bxne r4 nop nop nop @@ -60,7 +60,7 @@ ldmfd sp!, {r2, lr} msr cpsr, #0x93 ldmfd sp!, {r12} msr spsr, r12 -ldmfd sp!, {r11-r12, lr} +ldmfd sp!, {r4, r12, lr} movs pc, lr .word 0 .word 0xE3A02004 From 0313fedf1068d982285572f1bad2bd9bb5efbd15 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 28 Dec 2021 17:56:43 -0800 Subject: [PATCH 34/59] Qt: Save positions of multiplayer windows (closes #2128) --- CHANGES | 1 + src/platform/qt/GBAApp.cpp | 2 +- src/platform/qt/Window.cpp | 19 +++++++++++++++---- src/platform/qt/Window.h | 3 ++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 62f6daa64..6caf301f1 100644 --- a/CHANGES +++ b/CHANGES @@ -28,6 +28,7 @@ Misc: - Qt: Clean up cheats dialog - Qt: Only set default controller bindings if loading fails (fixes mgba.io/i/799) - Qt: Save converter now supports importing GameShark Advance saves + - Qt: Save positions of multiplayer windows (closes mgba.io/i/2128) 0.9.3: (2021-12-17) Emulation fixes: diff --git a/src/platform/qt/GBAApp.cpp b/src/platform/qt/GBAApp.cpp index 7d4252841..466cefa9f 100644 --- a/src/platform/qt/GBAApp.cpp +++ b/src/platform/qt/GBAApp.cpp @@ -120,7 +120,7 @@ Window* GBAApp::newWindow() { if (m_windows.count() >= MAX_GBAS) { return nullptr; } - Window* w = new Window(&m_manager, m_configController, m_multiplayer.attached()); + Window* w = new Window(&m_manager, m_configController, m_windows.count()); connect(w, &Window::destroyed, [this, w]() { m_windows.removeAll(w); for (Window* w : m_windows) { diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index a57106152..ef47b4945 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -88,6 +88,7 @@ Window::Window(CoreManager* manager, ConfigController* config, int playerId, QWi , m_config(config) , m_inputController(playerId, this) , m_shortcutController(new ShortcutController(this)) + , m_playerId(playerId) { setFocusPolicy(Qt::StrongFocus); setAcceptDrops(true); @@ -217,6 +218,16 @@ void Window::resizeFrame(const QSize& size) { } } +void Window::updateMultiplayerStatus(bool canOpenAnother) { + m_multiWindow->setEnabled(canOpenAnother); + if (m_controller) { + MultiplayerController* multiplayer = m_controller->multiplayerController(); + if (multiplayer) { + m_playerId = multiplayer->playerId(m_controller.get()); + } + } +} + void Window::updateMultiplayerActive(bool active) { m_multiActive = active; updateMute(); @@ -678,7 +689,7 @@ void Window::showEvent(QShowEvent* event) { } m_wasOpened = true; resizeFrame(m_screenWidget->sizeHint()); - QVariant windowPos = m_config->getQtOption("windowPos"); + QVariant windowPos = m_config->getQtOption("windowPos", m_playerId > 0 ? QString("player%0").arg(m_playerId) : QString()); bool maximized = m_config->getQtOption("maximized").toBool(); QRect geom = windowHandle()->screen()->availableGeometry(); if (!windowPos.isNull() && geom.contains(windowPos.toPoint())) { @@ -719,7 +730,7 @@ void Window::hideEvent(QHideEvent* event) { void Window::closeEvent(QCloseEvent* event) { emit shutdown(); - m_config->setQtOption("windowPos", pos()); + m_config->setQtOption("windowPos", pos(), m_playerId > 0 ? QString("player%0").arg(m_playerId) : QString()); m_config->setQtOption("maximized", isMaximized()); if (m_savedScale > 0) { @@ -1098,7 +1109,7 @@ void Window::updateTitle(float fps) { MultiplayerController* multiplayer = m_controller->multiplayerController(); if (multiplayer && multiplayer->attached() > 1) { - title += tr(" - Player %1 of %2").arg(multiplayer->playerId(m_controller.get()) + 1).arg(multiplayer->attached()); + title += tr(" - Player %1 of %2").arg(m_playerId + 1).arg(multiplayer->attached()); for (Action* action : m_nonMpActions) { action->setEnabled(false); } @@ -2023,7 +2034,7 @@ void Window::updateMute() { QString multiplayerAudio = m_config->getQtOption("multiplayerAudio").toString(); if (multiplayerAudio == QLatin1String("p1")) { MultiplayerController* multiplayer = m_controller->multiplayerController(); - mute = multiplayer && multiplayer->attached() > 1 && multiplayer->playerId(m_controller.get()); + mute = multiplayer && multiplayer->attached() > 1 && m_playerId; } else if (multiplayerAudio == QLatin1String("active")) { mute = !m_multiActive; } diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 6d93948a1..a99a882b5 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -63,7 +63,7 @@ public: void resizeFrame(const QSize& size); - void updateMultiplayerStatus(bool canOpenAnother) { m_multiWindow->setEnabled(canOpenAnother); } + void updateMultiplayerStatus(bool canOpenAnother); void updateMultiplayerActive(bool active); signals: @@ -230,6 +230,7 @@ private: bool m_inactiveMute = false; bool m_multiActive = true; + int m_playerId; std::unique_ptr m_overrideView; std::unique_ptr m_sensorView; From 398ee0c827869f9a746279a96634c0a10fbf453a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 4 Jan 2022 03:49:43 -0800 Subject: [PATCH 35/59] GB I/O: Fix erroneously added registers --- include/mgba/internal/gb/io.h | 1 - src/gb/io.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/include/mgba/internal/gb/io.h b/include/mgba/internal/gb/io.h index ada06dcb1..172b93f41 100644 --- a/include/mgba/internal/gb/io.h +++ b/include/mgba/internal/gb/io.h @@ -100,7 +100,6 @@ enum GBIORegisters { GB_REG_OCPD = 0x6B, GB_REG_OPRI = 0x6C, GB_REG_SVBK = 0x70, - GB_REG_PSM = 0x71, GB_REG_PSWX = 0x72, GB_REG_PSWY = 0x73, GB_REG_PSW = 0x74, diff --git a/src/gb/io.c b/src/gb/io.c index affa99a51..61a1b7c93 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -687,10 +687,8 @@ uint8_t GBIORead(struct GB* gb, unsigned address) { case GB_REG_OCPS: case GB_REG_OCPD: case GB_REG_SVBK: - case GB_REG_PSM: case GB_REG_PSWX: case GB_REG_PSWY: - case GB_REG_PSW: case GB_REG_UNK75: // Handled transparently by the registers if (gb->model < GB_MODEL_CGB) { From ea1abe2fcc3e99913e67f7722788e5c75550db8a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 4 Jan 2022 03:55:28 -0800 Subject: [PATCH 36/59] Core: Add creator metadata extdata to savestates --- include/mgba/core/serialize.h | 1 + src/core/serialize.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/include/mgba/core/serialize.h b/include/mgba/core/serialize.h index 968f3f16f..5f0780157 100644 --- a/include/mgba/core/serialize.h +++ b/include/mgba/core/serialize.h @@ -17,6 +17,7 @@ enum mStateExtdataTag { EXTDATA_CHEATS = 3, EXTDATA_RTC = 4, EXTDATA_META_TIME = 0x101, + EXTDATA_META_CREATOR = 0x102, EXTDATA_MAX }; diff --git a/src/core/serialize.c b/src/core/serialize.c index 446152e04..2e352435c 100644 --- a/src/core/serialize.c +++ b/src/core/serialize.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -386,6 +387,15 @@ bool mCoreSaveStateNamed(struct mCore* core, struct VFile* vf, int flags) { }; mStateExtdataPut(&extdata, EXTDATA_META_TIME, &item); } + + char creator[256]; + snprintf(creator, sizeof(creator), "%s %s", projectName, projectVersion); + struct mStateExtdataItem item = { + .size = strlen(creator) + 1, + .data = strdup(creator), + .clean = free + }; + mStateExtdataPut(&extdata, EXTDATA_META_CREATOR, &item); } if (flags & SAVESTATE_SAVEDATA) { From 13fab18fcc44992629c62f47dfba41d3820c9e8f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 4 Jan 2022 03:57:41 -0800 Subject: [PATCH 37/59] Libretro: Fix invalid options --- src/platform/libretro/libretro_core_options.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/libretro/libretro_core_options.h b/src/platform/libretro/libretro_core_options.h index dba9078a4..76ca634f9 100644 --- a/src/platform/libretro/libretro_core_options.h +++ b/src/platform/libretro/libretro_core_options.h @@ -146,13 +146,13 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "video", { - { "0", "" }, + { "0", "Default Game Boy preset" }, { "1", "Game Boy Color presets only" }, { "2", "Super Game Boy presets only" }, { "3", "Any available presets" }, { NULL, NULL }, }, - "ON" + "0" }, { "mgba_sgb_borders", From d96a19420daf4848362321af53b166b51c2676a9 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 4 Jan 2022 16:43:22 -0800 Subject: [PATCH 38/59] GBA I/O: Disable open bus behavior on invalid register 06A --- CHANGES | 1 + src/gba/io.c | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index 6caf301f1..1f39c97b1 100644 --- a/CHANGES +++ b/CHANGES @@ -17,6 +17,7 @@ Emulation fixes: - GBA: Improve timing when not booting from BIOS - GBA BIOS: Work around IRQ handling hiccup in Mario & Luigi (fixes mgba.io/i/1059) - GBA I/O: Redo internal key input, enabling edge-based key IRQs + - GBA I/O: Disable open bus behavior on invalid register 06A - GBA Memory: Fix misaligned 32-bit I/O loads (fixes mgba.io/i/2307) Other fixes: - Core: Don't attempt to restore rewind diffs past start of rewind diff --git a/src/gba/io.c b/src/gba/io.c index 8c6bbb5ad..0cd3c4e25 100644 --- a/src/gba/io.c +++ b/src/gba/io.c @@ -922,6 +922,7 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) { // Handled transparently by registers break; case 0x066: + case 0x06A: case 0x06E: case 0x076: case 0x07A: From f176c096b095d2ce602ed4356ccf7aafbbff8923 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 9 Sep 2021 14:28:15 -0700 Subject: [PATCH 39/59] Wii: Initial OSK implementation --- include/mgba-util/gui.h | 26 +++ include/mgba-util/gui/font.h | 13 ++ res/icons.png | Bin 663 -> 761 bytes res/icons2x.png | Bin 1494 -> 1717 bytes src/platform/wii/main.c | 432 +++++++++++++++++++++++++++++++++++ src/util/gui/font-metrics.c | 12 + src/util/gui/font.c | 25 ++ 7 files changed, 508 insertions(+) diff --git a/include/mgba-util/gui.h b/include/mgba-util/gui.h index ec2a00b9e..05f31d4e1 100644 --- a/include/mgba-util/gui.h +++ b/include/mgba-util/gui.h @@ -48,6 +48,17 @@ enum GUIKeyboardStatus { GUI_KEYBOARD_CANCEL, }; +enum GUIKeyFunction { + GUI_KEYFUNC_INPUT_DATA = 0, + GUI_KEYFUNC_CHANGE_KB, + GUI_KEYFUNC_SHIFT_KB, + GUI_KEYFUNC_BACKSPACE, + GUI_KEYFUNC_ENTER, + GUI_KEYFUNC_CANCEL, + GUI_KEYFUNC_LEFT, + GUI_KEYFUNC_RIGHT, +}; + enum { BATTERY_EMPTY = 0, BATTERY_LOW = 25, @@ -72,6 +83,21 @@ struct GUIKeyboardParams { bool multiline; }; +struct GUIKey { + const char* name; + const void* data; + int width; + enum GUIKeyFunction function; +}; + +struct GUIKeyboard { + struct { + int offset; + struct GUIKey* keys; + } rows[5]; + int width; +}; + struct GUIParams { unsigned width; unsigned height; diff --git a/include/mgba-util/gui/font.h b/include/mgba-util/gui/font.h index 5ad318e65..a4e74d89a 100644 --- a/include/mgba-util/gui/font.h +++ b/include/mgba-util/gui/font.h @@ -84,6 +84,18 @@ enum GUIIcon { GUI_ICON_9SLICE_CAP_SWW, GUI_ICON_9SLICE_CAP_SSE, GUI_ICON_9SLICE_CAP_SEE, + GUI_ICON_9SLICE_FILL_ONLY_NW, + GUI_ICON_9SLICE_FILL_ONLY_N, + GUI_ICON_9SLICE_FILL_ONLY_NE, + GUI_ICON_9SLICE_FILL_ONLY_W, + GUI_ICON_9SLICE_FILL_ONLY_C, + GUI_ICON_9SLICE_FILL_ONLY_E, + GUI_ICON_9SLICE_FILL_ONLY_SW, + GUI_ICON_9SLICE_FILL_ONLY_S, + GUI_ICON_9SLICE_FILL_ONLY_SE, + GUI_ICON_BACKSPACE, + GUI_ICON_KBD_SHIFT, + GUI_ICON_CAPSLOCK, GUI_ICON_MAX, }; @@ -109,6 +121,7 @@ enum GUI9SliceStyle { GUI_9SLICE_FILLED, GUI_9SLICE_EMPTY, GUI_9SLICE_EMPTY_CAPPED, + GUI_9SLICE_FILL_ONLY, }; unsigned GUIFontHeight(const struct GUIFont*); diff --git a/res/icons.png b/res/icons.png index 1b75cddd9aea8606378eab9000b6d1919ae55c5c..acb5091418c066dea3a3a72af5c177fb4a83d6ae 100644 GIT binary patch delta 690 zcmV;j0!{sw1^ES#Q-6_3L_t(|+U=U#vV$NDMcMiPkM09rNCxv|R8ld;2!2$pQ0qyXS3|DOrKi~%AjYD)l#>P!V7 zmw;FzH-7*yvcSH19n6=_Aj%r*c0bb9L3L$uF#tmcm}@*vniv7ma?z zf8duGEQGoN43*jqQu*-!MgU#_7JvnyQ3)z>8=nGzxH|n7fbG>!uKn>SN4TIEI)$wl z=B)mCJpjV_a_%NeSqtF(00@U1-#L_t(|+U=T)a)clZMZNt0N4L9FB@c|);U&pTr*`AIn*#|q z&~0;@!Jt@)KfUkn^D&Me2#TF|SpMWmzb~r*wD%9=$2S^o=Pj21&J2(bAOQRN^_+IH07@I9_W>~8uhZagtiPuRz;EI_n7?IyHA#Ut199zC>!s<)&ss!1XdYjuPa`Pbk57K_4-d5NZwhfmC*Lb91X#pp?43R7u(w zw`FTG{z(4ylWKpgGZDDdkHVbvKd%Sy8F8X?LAL6=X=dBgx6)H_U|qBG^km#D)cRrP9~V34*I1tM>0syt6P?g zlDP7I;D*#zSg%^O<%XM0L!QqvdwClPrseXXx6Wqnd>Zst?XEq#yd?j5Frvrd3(Ff| zn1uR?TI08X^%r08=a0V|C*Bfgi;C4UW_{~BZ&cP?$0#pE9})UYV0yu;9aUj%I~N&M z;hQ1Sv{7;2-L(6)L8?UoFE97TOwaMV9fwXQ$u+%fEDWq;7eM$III!XRYHX0eG)Mg9 z5}gwUBxVod01`hqJYc#53}cue+XIF!>hK@%|11CJIU10OjYLRdg?}L;7|#_1^jE*F z1VCvZSks&R%@KfE^J3Z@ijI;2uyRD!uZ4p$=h&{3+?NTVKO=Pqz`rZImjq^rz}kU; z?$79x@2zD8>9$j`ESvZ9U(+}&2wvKlLE@u#Wh9s&qAJoBcGH!8d(vEs28d_q@GIUp zAX$|HPt9JgL`z#P&3tr=Q}6!X>yxUrG%5Xf0QBPRQd4X=d7)B66UKupO`{xknZz~~l$FhmfH7v_}QZb7ey zX#x$$3_#ZR5&3|HAjS<8t7v?sm*oJg2Broi#m7W|Y|)y&Jh-C;=(l}L`Rab~ zh%O>ZAjFlBa@UYE8NB$1E@L*R;FEdwBUj3$<7ip(lW zX5tUTLWe?J;k`8|$3v9IXKzRzGQ8-tB9e|3pJHh!WByt@H@D%jf5;2N?? z|CBabdLBE!9Hr{6-2A*{J3FWPYjsviz|dtzGn)b3)Nu&mL;O~Waa0`GQ_-gb%T{ZN zFoc&x;LgKI&pB+XM1Nb+iS=`xxz{EK_touaFWZoYQlObKnBJrYGNrR6pB24?VMH>| zAlH>gA5n)0y_7e%cGs)IQD#&7xkGqXp-JdQkU1+klTaEl71n#{nE_eoG;NZ2?b*y`cAbYXwv%5}<2CJP;!5T)c>Q8RgH+7-KHscVP z(|mq@>r%m-#eP#Y^E(0;M0P?R=-Fj{tVX0DO@+d2+45*_pW)Rc58R4*3%D3g%^;gi zJP;S+VBQLH9~tc{PWLRO(*_qo`**_xz0aLTLMqcXeZ8Y$TsyIja&GknUnZG*1^Y!6 z$bU(TzV=q^Ky!_|+30=D|M^E|R>*9!9HatAqI1kcopKj5PM07C6B6 jYdzGBUw43uiSke&_WS)Kzn!b2J=?C(mUH&sQk%kJ delta 1430 zcmY*Zc{G#@9Q}PWW8e3rVMdf9gQ%W$Xr#OzLWvYoqAc-L_V2TtPL}9I2`#qw(Bxrc z$#M{BQ$r7B6w{Cj!(^E(>3jO~-E;2W_uO-rI+;PKYp$qB=mCbUdlZL%r!T35B5f~& z<9(|}!>VRFMS;g2KcY=#cE7&mCQjwnQ&Z%d=!*Tvg_Wxx^X^5UFLg_Vosg06gCo?| zcC~YzH9lK~JE6J6_BCPncPsCx$~7}!*pOqN;EQkn?VV!j^J$X=;Kqa92s18<4|im$ z2M?1An#$vu6^qla0!FIkE@a2ZX=>de&roL($|$i=n&2Xe=p{prEqGZ)c~l=Jx~w32 zAn=EU@iV3nqi73)Y*?@i0swTK{|6QX6qVa*uqAnguSSB^QgD%<%d`TZ%YvR{JX;fh zLWIBv^FK7FIYm4486;eill-dbezD=E1QmaLrN@xD4}Pv z900Z{mGVpQs5;o}Ct~O{kh-JC!1R(Qf`vJYUe%2-hrrWR;5M8g(h%;qhP!O1G=K#{ zp&~_b6qkf8B<^y$M`im^%svuO<|yOPo{D{N3W96$7>m|yDf=6X|8qZn-kMWQdt^W%;WcYUyt?5($AXN%`2lssFV2cb!G zo?FMZ`m|OXrNCXFZ@|!X(V~GTBa9%-PKK95* z{Z9*6EU01aPs7Oh$q*cmwQG6z*vj~9+gNA8?xbfOl*O^mzdaplCLc|p zG@|dqvK)sd({AjHT1FfAeu@5^9-7&T0}Dp6V>|V#d7w6ay`J zGxSXA^^?l}O%a}OQANV526bB8`E}&I3{D7i(+NP~!qlIwoiKp2(O+TGfG*L`~B|`|fOXsDQ z%0gOWjU+@yBF<0sNhB|9yF~O0d!$|3ma7ZXs@Aj4BPQgXf8@W#|rYpNCFpQ|Gl8`_@it%}Luo$_q>6~8$3Vf(wX z@Zb|yB4iWzW@eVmQn(Tm?0xw7rQ2xzX?MfhVbZ+(8Jw9 z28ewv(PjMOM>1jo8ONb_0hAZ(7_q?7=qOx9^ok9#_CWQ*#q}{lBoc{`5=n{DL@I?0 zI!S|~n7e=jM(PiD!9lSq84#hqBo>kzs_cfqCF|--7eiR^pEA#pz`ARqsq5ZS0tRjT YD;@KjfbWidth * guiScale * wAdjust, vmode->efbHeight * guiScale * hAdjust); } +static const struct GUIKeyboard qwertyLower; +static const struct GUIKeyboard qwertyUpper; +static const struct GUIKeyboard symbols; + +static const struct GUIKeyboard qwertyLower = { + .rows = { + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "1", "1" }, + { "2", "2" }, + { "3", "3" }, + { "4", "4" }, + { "5", "5" }, + { "6", "6" }, + { "7", "7" }, + { "8", "8" }, + { "9", "9" }, + { "0", "0" }, + { "-", "-" }, + { "⌫", NULL, 2, GUI_KEYFUNC_BACKSPACE }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "q", "q" }, + { "w", "w" }, + { "e", "e" }, + { "r", "r" }, + { "t", "t" }, + { "y", "y" }, + { "u", "u" }, + { "i", "i" }, + { "o", "o" }, + { "p", "p" }, + { "[", "[" }, + { "]", "]" }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "a", "a" }, + { "s", "s" }, + { "d", "d" }, + { "f", "f" }, + { "g", "g" }, + { "h", "h" }, + { "j", "j" }, + { "k", "k" }, + { "l", "l" }, + { ";", ";" }, + { "'", "'" }, + { "\\", "\\" }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "z", "z" }, + { "x", "x" }, + { "c", "c" }, + { "v", "v" }, + { "b", "b" }, + { "n", "n" }, + { "m", "m" }, + { ",", "," }, + { ".", "." }, + { "/", "/" }, + { "←", NULL, 2, GUI_KEYFUNC_LEFT }, + { "→", NULL, 2, GUI_KEYFUNC_RIGHT }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "⇧", &qwertyUpper, 3, GUI_KEYFUNC_SHIFT_KB }, + { "!@#", &symbols, 3, GUI_KEYFUNC_CHANGE_KB }, + { "Space", " ", 10 }, + { "OK", NULL, 4, GUI_KEYFUNC_ENTER }, + { "Cancel", NULL, 4, GUI_KEYFUNC_CANCEL }, + {} + } + }, + }, + .width = 24 +}; + +static const struct GUIKeyboard qwertyUpper = { + .rows = { + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "1", "1" }, + { "2", "2" }, + { "3", "3" }, + { "4", "4" }, + { "5", "5" }, + { "6", "6" }, + { "7", "7" }, + { "8", "8" }, + { "9", "9" }, + { "0", "0" }, + { "_", "_" }, + { "⌫", NULL, 2, GUI_KEYFUNC_BACKSPACE }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "Q", "Q" }, + { "W", "W" }, + { "E", "E" }, + { "R", "R" }, + { "T", "T" }, + { "Y", "Y" }, + { "U", "U" }, + { "I", "I" }, + { "O", "O" }, + { "P", "P" }, + { "{", "}" }, + { "{", "}" }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "A", "A" }, + { "S", "S" }, + { "D", "D" }, + { "F", "F" }, + { "G", "G" }, + { "H", "H" }, + { "J", "J" }, + { "K", "K" }, + { "L", "L" }, + { ":", ":" }, + { "\"", "\"" }, + { "|", "|" }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "Z", "Z" }, + { "X", "X" }, + { "C", "C" }, + { "V", "V" }, + { "B", "B" }, + { "N", "N" }, + { "M", "M" }, + { "<", "<" }, + { ">", ">" }, + { "?", "?" }, + { "←", NULL, 2, GUI_KEYFUNC_LEFT }, + { "→", NULL, 2, GUI_KEYFUNC_RIGHT }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "⇪", &qwertyUpper, 3, GUI_KEYFUNC_CHANGE_KB }, + { "!@#", &symbols, 3, GUI_KEYFUNC_CHANGE_KB }, + { "Space", " ", 10 }, + { "OK", NULL, 4, GUI_KEYFUNC_ENTER }, + { "Cancel", NULL, 4, GUI_KEYFUNC_CANCEL }, + {} + } + }, + }, + .width = 24 +}; + +static const struct GUIKeyboard symbols = { + .rows = { + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "1", "1" }, + { "2", "2" }, + { "3", "3" }, + { "4", "4" }, + { "5", "5" }, + { "6", "6" }, + { "7", "7" }, + { "8", "8" }, + { "9", "9" }, + { "0", "0" }, + { "-", "-" }, + { "⌫", NULL, 2, GUI_KEYFUNC_BACKSPACE }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { ".", "." }, + { ",", "," }, + { ":", ":" }, + { ";", ";" }, + { "?", "?" }, + { "!", "!" }, + { "'", "'" }, + { "\"", "\"" }, + { "*", "*" }, + { "`", "`" }, + { "~", "~" }, + { "_", "_" }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "<", "<" }, + { ">", ">" }, + { "{", "{" }, + { "}", "}" }, + { "+", "+" }, + { "=", "=" }, + { "#", "#" }, + { "&", "&" }, + { "$", "$" }, + {} + } + }, + { + .offset = 0, + .keys = (struct GUIKey[]) { + { "(", "(" }, + { ")", ")" }, + { "[", "[" }, + { "]", "]" }, + { "/", "/" }, + { "|", "|" }, + { "\\", "\\" }, + { "%", "%" }, + { "@", "@" }, + { "^", "^" }, + { "←", NULL, 2, GUI_KEYFUNC_LEFT }, + { "→", NULL, 2, GUI_KEYFUNC_RIGHT }, + {} + } + }, + { + .offset = 3, + .keys = (struct GUIKey[]) { + { "abc", &qwertyLower, 3, GUI_KEYFUNC_CHANGE_KB }, + { "Space", " ", 10 }, + { "OK", NULL, 4, GUI_KEYFUNC_ENTER }, + { "Cancel", NULL, 4, GUI_KEYFUNC_CANCEL }, + {} + } + }, + }, + .width = 24 +}; + +static void _backspace(char* string) { + size_t len = strlen(string); + if (len) { + string[len - 1] = '\0'; + } +} + +enum GUIKeyboardStatus _keyboardRun(struct GUIKeyboardParams* keyboard) { + GUIInvalidateKeys(params); + int curX = 0; + int curY = 0; + const struct GUIKey* curKey = NULL; + const struct GUIKeyboard* currentKbd = &qwertyLower; + const struct GUIKeyboard* prevKbd = currentKbd; + bool tempKbd = false; + while (true) { + uint32_t newInput = 0; + GUIPollInput(params, &newInput, 0); + unsigned cx, cy; + enum GUICursorState cursor = GUIPollCursor(params, &cx, &cy); + + if (newInput & (1 << GUI_INPUT_UP)) { + --curY; + if (curY < 0) { + curY = 4; + } + curKey = NULL; + } + if (newInput & (1 << GUI_INPUT_DOWN)) { + ++curY; + if (curY > 4) { + curY = 0; + } + curKey = NULL; + } + if (newInput & (1 << GUI_INPUT_LEFT)) { + --curX; + if (curX < 0) { + curX = currentKbd->width / 2; + } + curKey = NULL; + } + if (newInput & (1 << GUI_INPUT_RIGHT)) { + if (curKey) { + curX += curKey->width ? (curKey->width + 1) / 2 : 1; + } else { + ++curX; + } + if (curX >= currentKbd->width / 2) { + curX = 0; + } + curKey = NULL; + } + if (newInput & (1 << GUI_INPUT_BACK)) { + _backspace(keyboard->result); + } + if (newInput & (1 << GUI_INPUT_CANCEL)) { + return GUI_KEYBOARD_CANCEL; + } + + params->drawStart(); + if (params->guiPrepare) { + params->guiPrepare(); + } + + GUIFontPrint(params->font, 8, GUIFontHeight(params->font), GUI_ALIGN_LEFT, 0xFFFFFFFF, keyboard->title); + + unsigned height = GUIFontHeight(params->font) * 2; + unsigned width = (GUIFontGlyphWidth(params->font, 'W') | 1) + 1; // Round up + + int offset = (params->width - (width + 32) / 2 * currentKbd->width) / 2; + int row; + int col; + for (row = 0; row < 5; ++row) { + int y = params->height / 2 + (height + 16) * (row - 1); + int x = currentKbd->rows[row].offset; + for (col = 0; currentKbd->rows[row].keys[col].name; ++col) { + const struct GUIKey* key = ¤tKbd->rows[row].keys[col]; + int w = key->width ? key->width : 2; + if (row == curY) { + if (curX >= x / 2 && curX < (x + w) / 2) { + curKey = key; + } else if (col == 0 && curX < x / 2) { + curKey = key; + } else if (!currentKbd->rows[row].keys[col + 1].name && curX >= x / 2) { + curKey = key; + } + } + if (key->name[0]) { + int xOff = offset + x * (width + 32) / 2; + if (curKey == key) { + curX = x / 2; + GUIFontDraw9Slice(params->font, xOff, y, (width + 4) * w, height + 12, 0xFFFFFFFF, GUI_9SLICE_FILLED); + } else { + uint32_t fill = 0xFF606060; + if (key->function != GUI_KEYFUNC_INPUT_DATA) { + fill = 0xFFD0D0D0; + } + GUIFontDraw9Slice(params->font, xOff - 2, y - 2, (width + 4) * w + 4, height + 16, fill, GUI_9SLICE_FILL_ONLY); + } + GUIFontPrint(params->font, offset + (x * 2 + w) * (width + 32) / 4, y + height * 3 / 4 + 1, GUI_ALIGN_HCENTER | GUI_ALIGN_VCENTER, 0xFFFFFFFF, key->name); + } + x += w; + } + } + + if (newInput & (1 << GUI_INPUT_SELECT) && curKey) { + switch (curKey->function) { + case GUI_KEYFUNC_INPUT_DATA: + strncat(keyboard->result, curKey->data, keyboard->maxLen + 1); + if (tempKbd) { + tempKbd = false; + currentKbd = prevKbd; + } + break; + case GUI_KEYFUNC_BACKSPACE: + _backspace(keyboard->result); + break; + case GUI_KEYFUNC_SHIFT_KB: + tempKbd = true; + prevKbd = currentKbd; + currentKbd = curKey->data; + break; + case GUI_KEYFUNC_CHANGE_KB: + if (currentKbd == curKey->data) { + // Switching to itself while temporary removes temporary status; + // then switching once more goes back to previous keyboard + if (!tempKbd) { + currentKbd = prevKbd; + } + } else { + currentKbd = curKey->data; + } + tempKbd = false; + break; + case GUI_KEYFUNC_ENTER: + return GUI_KEYBOARD_DONE; + case GUI_KEYFUNC_CANCEL: + return GUI_KEYBOARD_CANCEL; + } + } + + int inputSize = keyboard->maxLen; + if (inputSize * width > params->width) { + inputSize = params->width / width - 2; + } + GUIFontDraw9Slice(params->font, (params->width - width * inputSize) / 2 - 8, height * 3, width * inputSize + 16, height + 8, 0xFFFFFFFF, GUI_9SLICE_EMPTY); + GUIFontPrint(params->font, (params->width - width * inputSize) / 2, height * 4 - 8, GUI_ALIGN_LEFT, 0xFFFFFFFF, keyboard->result); + + GUIDrawBattery(params); + GUIDrawClock(params); + + if (params->guiFinish) { + params->guiFinish(); + } + params->drawEnd(); + } +} + void _setup(struct mGUIRunner* runner) { runner->core->setPeripheral(runner->core, mPERIPH_ROTATION, &rotation); runner->core->setPeripheral(runner->core, mPERIPH_RUMBLE, &rumble); diff --git a/src/util/gui/font-metrics.c b/src/util/gui/font-metrics.c index bf30cb4f0..8abc2968d 100644 --- a/src/util/gui/font-metrics.c +++ b/src/util/gui/font-metrics.c @@ -183,4 +183,16 @@ const struct GUIIconMetric defaultIconMetrics[] = { [GUI_ICON_9SLICE_CAP_SWW] = { 226, 8, 6, 8 }, [GUI_ICON_9SLICE_CAP_SSE] = { 232, 24, 8, 7 }, [GUI_ICON_9SLICE_CAP_SEE] = { 248, 8, 6, 8 }, + [GUI_ICON_9SLICE_FILL_ONLY_NW] = { 194, 33, 8, 8 }, + [GUI_ICON_9SLICE_FILL_ONLY_N] = { 202, 33, 12, 8 }, + [GUI_ICON_9SLICE_FILL_ONLY_NE] = { 214, 33, 8, 8 }, + [GUI_ICON_9SLICE_FILL_ONLY_W] = { 194, 41, 8, 12 }, + [GUI_ICON_9SLICE_FILL_ONLY_C] = { 202, 41, 12, 12 }, + [GUI_ICON_9SLICE_FILL_ONLY_E] = { 214, 41, 8, 12 }, + [GUI_ICON_9SLICE_FILL_ONLY_SW] = { 194, 55, 8, 8 }, + [GUI_ICON_9SLICE_FILL_ONLY_S] = { 202, 55, 12, 8 }, + [GUI_ICON_9SLICE_FILL_ONLY_SE] = { 214, 55, 8, 8 }, + [GUI_ICON_BACKSPACE] = { 82, 18, 12, 12 }, + [GUI_ICON_KBD_SHIFT] = { 114, 18, 12, 12 }, + [GUI_ICON_CAPSLOCK] = { 130, 18, 12, 12 }, }; diff --git a/src/util/gui/font.c b/src/util/gui/font.c index fbebd7937..0ad1cde4a 100644 --- a/src/util/gui/font.c +++ b/src/util/gui/font.c @@ -55,10 +55,22 @@ void GUIFontPrint(struct GUIFont* font, int x, int y, enum GUIAlignment align, u c = GUI_ICON_LEFT + c - 0x2190; icon = true; break; + case 0x232B: + c = GUI_ICON_BACKSPACE; + icon = true; + break; case 0x23E9: c = GUI_ICON_STATUS_FAST_FORWARD; icon = true; break; + case 0x21E7: + c = GUI_ICON_KBD_SHIFT; + icon = true; + break; + case 0x21EA: + c = GUI_ICON_CAPSLOCK; + icon = true; + break; case 0x1F507: c = GUI_ICON_STATUS_MUTE; icon = true; @@ -102,6 +114,12 @@ void GUIFontDraw9Slice(struct GUIFont* font, int x, int y, int width, int height GUIFontDrawIcon(font, x , y + height, GUI_ALIGN_LEFT | GUI_ALIGN_BOTTOM, GUI_ORIENT_0, color, GUI_ICON_9SLICE_FILLED_SW); GUIFontDrawIcon(font, x + width, y + height, GUI_ALIGN_RIGHT | GUI_ALIGN_BOTTOM, GUI_ORIENT_0, color, GUI_ICON_9SLICE_FILLED_SE); break; + case GUI_9SLICE_FILL_ONLY: + GUIFontDrawIcon(font, x , y , GUI_ALIGN_LEFT | GUI_ALIGN_TOP , GUI_ORIENT_0, color, GUI_ICON_9SLICE_FILL_ONLY_NW); + GUIFontDrawIcon(font, x + width, y , GUI_ALIGN_RIGHT | GUI_ALIGN_TOP , GUI_ORIENT_0, color, GUI_ICON_9SLICE_FILL_ONLY_NE); + GUIFontDrawIcon(font, x , y + height, GUI_ALIGN_LEFT | GUI_ALIGN_BOTTOM, GUI_ORIENT_0, color, GUI_ICON_9SLICE_FILL_ONLY_SW); + GUIFontDrawIcon(font, x + width, y + height, GUI_ALIGN_RIGHT | GUI_ALIGN_BOTTOM, GUI_ORIENT_0, color, GUI_ICON_9SLICE_FILL_ONLY_SE); + break; } unsigned offX, offY; @@ -123,6 +141,13 @@ void GUIFontDraw9Slice(struct GUIFont* font, int x, int y, int width, int height GUIFontDrawIconSize(font, x + width - endX, y + offY, offX, height - offY - endY, color, GUI_ICON_9SLICE_FILLED_E); GUIFontDrawIconSize(font, x + offX, y + offY, width - offX - endX, height - offY - endY, color, GUI_ICON_9SLICE_FILLED_C); break; + case GUI_9SLICE_FILL_ONLY: + GUIFontDrawIconSize(font, x + offX, y, width - offX - endX, offY, color, GUI_ICON_9SLICE_FILL_ONLY_N); + GUIFontDrawIconSize(font, x, y + offY, offX, height - offY - endY, color, GUI_ICON_9SLICE_FILL_ONLY_W); + GUIFontDrawIconSize(font, x + offX, y + height - endY, width - offX - endX, offY, color, GUI_ICON_9SLICE_FILL_ONLY_S); + GUIFontDrawIconSize(font, x + width - endX, y + offY, offX, height - offY - endY, color, GUI_ICON_9SLICE_FILL_ONLY_E); + GUIFontDrawIconSize(font, x + offX, y + offY, width - offX - endX, height - offY - endY, color, GUI_ICON_9SLICE_FILL_ONLY_C); + break; case GUI_9SLICE_EMPTY_CAPPED: GUIFontDrawIcon(font, x + offX, y, GUI_ALIGN_LEFT | GUI_ALIGN_TOP, GUI_ORIENT_0, color, GUI_ICON_9SLICE_CAP_NNW); GUIFontDrawIcon(font, x, y + offY, GUI_ALIGN_LEFT | GUI_ALIGN_TOP, GUI_ORIENT_0, color, GUI_ICON_9SLICE_CAP_NWW); From 9f0d184e4b4fea7954a35c3e34986e07ed6b628d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 5 Jan 2022 22:10:01 -0800 Subject: [PATCH 40/59] Wii: Add text cursor --- include/mgba-util/gui/font.h | 2 ++ src/platform/wii/main.c | 59 +++++++++++++++++++++++++++++++----- src/util/gui/font-metrics.c | 1 + src/util/gui/font.c | 6 +++- 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/include/mgba-util/gui/font.h b/include/mgba-util/gui/font.h index a4e74d89a..1257137ef 100644 --- a/include/mgba-util/gui/font.h +++ b/include/mgba-util/gui/font.h @@ -96,6 +96,7 @@ enum GUIIcon { GUI_ICON_BACKSPACE, GUI_ICON_KBD_SHIFT, GUI_ICON_CAPSLOCK, + GUI_ICON_TEXT_CURSOR, GUI_ICON_MAX, }; @@ -127,6 +128,7 @@ enum GUI9SliceStyle { unsigned GUIFontHeight(const struct GUIFont*); unsigned GUIFontGlyphWidth(const struct GUIFont*, uint32_t glyph); unsigned GUIFontSpanWidth(const struct GUIFont*, const char* text); +unsigned GUIFontSpanCountWidth(const struct GUIFont*, const char* text, size_t len); void GUIFontIconMetrics(const struct GUIFont*, enum GUIIcon icon, unsigned* w, unsigned* h); ATTRIBUTE_FORMAT(printf, 6, 7) diff --git a/src/platform/wii/main.c b/src/platform/wii/main.c index 587f096e3..cb78b7ba6 100644 --- a/src/platform/wii/main.c +++ b/src/platform/wii/main.c @@ -1117,17 +1117,35 @@ static const struct GUIKeyboard symbols = { .width = 24 }; -static void _backspace(char* string) { +static size_t _backspace(char* string, size_t position) { size_t len = strlen(string); - if (len) { - string[len - 1] = '\0'; + if (position == 0) { + return position; } + size_t newPos = position - 1; + char byte = string[newPos]; + if (byte & 0x80) { // In a UTF-8 character + while (newPos > 0) { + --newPos; + if ((string[newPos] & 0xC0) != 0x80) { + // Found beginning of UTF-8 character + break; + } + } + } + if (len == position) { + string[newPos] = '\0'; + } else if (position > 0 && position < len) { + memmove(&string[newPos], &string[position], len + 1 - position); + } + return newPos; } enum GUIKeyboardStatus _keyboardRun(struct GUIKeyboardParams* keyboard) { GUIInvalidateKeys(params); int curX = 0; int curY = 0; + size_t position = strlen(keyboard->result); const struct GUIKey* curKey = NULL; const struct GUIKeyboard* currentKbd = &qwertyLower; const struct GUIKeyboard* prevKbd = currentKbd; @@ -1171,7 +1189,7 @@ enum GUIKeyboardStatus _keyboardRun(struct GUIKeyboardParams* keyboard) { curKey = NULL; } if (newInput & (1 << GUI_INPUT_BACK)) { - _backspace(keyboard->result); + position = _backspace(keyboard->result, position); } if (newInput & (1 << GUI_INPUT_CANCEL)) { return GUI_KEYBOARD_CANCEL; @@ -1225,15 +1243,28 @@ enum GUIKeyboardStatus _keyboardRun(struct GUIKeyboardParams* keyboard) { if (newInput & (1 << GUI_INPUT_SELECT) && curKey) { switch (curKey->function) { - case GUI_KEYFUNC_INPUT_DATA: - strncat(keyboard->result, curKey->data, keyboard->maxLen + 1); + case GUI_KEYFUNC_INPUT_DATA: { + size_t dataLen = strlen(curKey->data); + size_t followingLen = strlen(&keyboard->result[position]); + size_t copySize = followingLen; + if (position + copySize > keyboard->maxLen) { + copySize = keyboard->maxLen - position; + } + memmove(&keyboard->result[position + dataLen], &keyboard->result[position], copySize + 1); + copySize = dataLen; + if (position + copySize > keyboard->maxLen) { + copySize = keyboard->maxLen - position; + } + memcpy(&keyboard->result[position], curKey->data, copySize); + position += copySize; if (tempKbd) { tempKbd = false; currentKbd = prevKbd; } break; + } case GUI_KEYFUNC_BACKSPACE: - _backspace(keyboard->result); + position = _backspace(keyboard->result, position); break; case GUI_KEYFUNC_SHIFT_KB: tempKbd = true; @@ -1256,6 +1287,16 @@ enum GUIKeyboardStatus _keyboardRun(struct GUIKeyboardParams* keyboard) { return GUI_KEYBOARD_DONE; case GUI_KEYFUNC_CANCEL: return GUI_KEYBOARD_CANCEL; + case GUI_KEYFUNC_LEFT: + if (position > 0) { + --position; + } + break; + case GUI_KEYFUNC_RIGHT: + if (position < strlen(keyboard->result)) { + ++position; + } + break; } } @@ -1264,7 +1305,9 @@ enum GUIKeyboardStatus _keyboardRun(struct GUIKeyboardParams* keyboard) { inputSize = params->width / width - 2; } GUIFontDraw9Slice(params->font, (params->width - width * inputSize) / 2 - 8, height * 3, width * inputSize + 16, height + 8, 0xFFFFFFFF, GUI_9SLICE_EMPTY); - GUIFontPrint(params->font, (params->width - width * inputSize) / 2, height * 4 - 8, GUI_ALIGN_LEFT, 0xFFFFFFFF, keyboard->result); + GUIFontPrint(params->font, (params->width - width * inputSize) / 2 + 8, height * 4 - 8, GUI_ALIGN_LEFT, 0xFFFFFFFF, keyboard->result); + unsigned cursorWidth = GUIFontSpanCountWidth(params->font, keyboard->result, position); + GUIFontDrawIcon(params->font, (params->width - width * inputSize) / 2 + 8 + cursorWidth, height * 4 - 4, GUI_ALIGN_HCENTER | GUI_ALIGN_BOTTOM, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_TEXT_CURSOR); GUIDrawBattery(params); GUIDrawClock(params); diff --git a/src/util/gui/font-metrics.c b/src/util/gui/font-metrics.c index 8abc2968d..5569b3708 100644 --- a/src/util/gui/font-metrics.c +++ b/src/util/gui/font-metrics.c @@ -195,4 +195,5 @@ const struct GUIIconMetric defaultIconMetrics[] = { [GUI_ICON_BACKSPACE] = { 82, 18, 12, 12 }, [GUI_ICON_KBD_SHIFT] = { 114, 18, 12, 12 }, [GUI_ICON_CAPSLOCK] = { 130, 18, 12, 12 }, + [GUI_ICON_TEXT_CURSOR] = { 103, 16, 3, 16 }, }; diff --git a/src/util/gui/font.c b/src/util/gui/font.c index 0ad1cde4a..a41469445 100644 --- a/src/util/gui/font.c +++ b/src/util/gui/font.c @@ -8,8 +8,12 @@ #include unsigned GUIFontSpanWidth(const struct GUIFont* font, const char* text) { - unsigned width = 0; size_t len = strlen(text); + return GUIFontSpanCountWidth(font, text, len); +} + +unsigned GUIFontSpanCountWidth(const struct GUIFont* font, const char* text, size_t len) { + unsigned width = 0; while (len) { uint32_t c = utf8Char(&text, &len); if (c == '\1') { From 46a3f9ead8892ce11da488f1323ea0d5acdcfb6e Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 5 Jan 2022 22:46:29 -0800 Subject: [PATCH 41/59] Wii: Cursor support in OSK --- src/platform/wii/main.c | 44 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/src/platform/wii/main.c b/src/platform/wii/main.c index cb78b7ba6..8b3ed8226 100644 --- a/src/platform/wii/main.c +++ b/src/platform/wii/main.c @@ -1205,11 +1205,41 @@ enum GUIKeyboardStatus _keyboardRun(struct GUIKeyboardParams* keyboard) { unsigned height = GUIFontHeight(params->font) * 2; unsigned width = (GUIFontGlyphWidth(params->font, 'W') | 1) + 1; // Round up - int offset = (params->width - (width + 32) / 2 * currentKbd->width) / 2; + unsigned originX = (params->width - (width + 32) / 2 * currentKbd->width) / 2; + unsigned originY = params->height / 2 - (height + 16); + + bool cursorOverKey = false; + + if (cx >= originX && cy >= originY) { + unsigned xOff = cx - originX; + unsigned yOff = cy - originY; + int row = yOff / (height + 16); + int x = xOff * 2 / (width + 32); + int accumX = 0; + if (row < 5 && x < currentKbd->width) { + x -= currentKbd->rows[row].offset; + accumX += currentKbd->rows[row].offset; + int col; + for (col = 0; currentKbd->rows[row].keys[col].name; ++col) { + const struct GUIKey* key = ¤tKbd->rows[row].keys[col]; + int w = key->width ? key->width : 2; + if (x < w) { + curX = accumX; + curY = row; + curKey = key; + cursorOverKey = cursor == GUI_CURSOR_CLICKED; + break; + } + x -= w; + accumX += w; + } + } + } + int row; int col; for (row = 0; row < 5; ++row) { - int y = params->height / 2 + (height + 16) * (row - 1); + int y = originY + (height + 16) * row; int x = currentKbd->rows[row].offset; for (col = 0; currentKbd->rows[row].keys[col].name; ++col) { const struct GUIKey* key = ¤tKbd->rows[row].keys[col]; @@ -1224,7 +1254,7 @@ enum GUIKeyboardStatus _keyboardRun(struct GUIKeyboardParams* keyboard) { } } if (key->name[0]) { - int xOff = offset + x * (width + 32) / 2; + int xOff = originX + x * (width + 32) / 2; if (curKey == key) { curX = x / 2; GUIFontDraw9Slice(params->font, xOff, y, (width + 4) * w, height + 12, 0xFFFFFFFF, GUI_9SLICE_FILLED); @@ -1235,13 +1265,13 @@ enum GUIKeyboardStatus _keyboardRun(struct GUIKeyboardParams* keyboard) { } GUIFontDraw9Slice(params->font, xOff - 2, y - 2, (width + 4) * w + 4, height + 16, fill, GUI_9SLICE_FILL_ONLY); } - GUIFontPrint(params->font, offset + (x * 2 + w) * (width + 32) / 4, y + height * 3 / 4 + 1, GUI_ALIGN_HCENTER | GUI_ALIGN_VCENTER, 0xFFFFFFFF, key->name); + GUIFontPrint(params->font, originX + (x * 2 + w) * (width + 32) / 4, y + height * 3 / 4 + 1, GUI_ALIGN_HCENTER | GUI_ALIGN_VCENTER, 0xFFFFFFFF, key->name); } x += w; } } - if (newInput & (1 << GUI_INPUT_SELECT) && curKey) { + if ((newInput & (1 << GUI_INPUT_SELECT) || cursorOverKey) && curKey) { switch (curKey->function) { case GUI_KEYFUNC_INPUT_DATA: { size_t dataLen = strlen(curKey->data); @@ -1312,6 +1342,10 @@ enum GUIKeyboardStatus _keyboardRun(struct GUIKeyboardParams* keyboard) { GUIDrawBattery(params); GUIDrawClock(params); + if (cursor != GUI_CURSOR_NOT_PRESENT) { + GUIFontDrawIcon(params->font, cx, cy, GUI_ALIGN_HCENTER | GUI_ALIGN_TOP, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_CURSOR); + } + if (params->guiFinish) { params->guiFinish(); } From 899fbdf1e40a085204dfbbc61bb8d541724b0f33 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 9 Jan 2022 00:11:53 -0800 Subject: [PATCH 42/59] 3DS: Fix warnings --- src/platform/3ds/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/3ds/main.c b/src/platform/3ds/main.c index fb4152867..71fcc1aa2 100644 --- a/src/platform/3ds/main.c +++ b/src/platform/3ds/main.c @@ -190,7 +190,7 @@ static void _cleanup(void) { mcuHwcExit(); } -static void _map3DSKey(struct mInputMap* map, int ctrKey, enum GBAKey key) { +static void _map3DSKey(struct mInputMap* map, int ctrKey, int key) { mInputBindKey(map, _3DS_INPUT, __builtin_ctz(ctrKey), key); } From 27d59e5ed6bf2c94032078e23b555772789bea79 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 9 Jan 2022 15:05:57 -0800 Subject: [PATCH 43/59] mGUI: Add read-only menu items --- include/mgba-util/gui/menu.h | 1 + src/feature/gui/remap.c | 4 ++-- src/util/gui/menu.c | 38 +++++++++++++++++++----------------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/include/mgba-util/gui/menu.h b/include/mgba-util/gui/menu.h index 55cbad5d3..399ddd8c3 100644 --- a/include/mgba-util/gui/menu.h +++ b/include/mgba-util/gui/menu.h @@ -61,6 +61,7 @@ struct GUIMenuItem { const struct GUIVariant* stateMappings; unsigned nStates; struct GUIMenu* submenu; + bool readonly; }; DECLARE_VECTOR(GUIMenuItemList, struct GUIMenuItem); diff --git a/src/feature/gui/remap.c b/src/feature/gui/remap.c index 5f7da0f01..b0a22d72a 100644 --- a/src/feature/gui/remap.c +++ b/src/feature/gui/remap.c @@ -21,7 +21,7 @@ void mGUIRemapKeys(struct GUIParams* params, struct mInputMap* map, const struct size_t i; *GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) { .title = "Game keys:", - .data = GUI_V_V, + .readonly = true, }; for (i = 0; i < map->info->nKeys; ++i) { *GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) { @@ -35,7 +35,7 @@ void mGUIRemapKeys(struct GUIParams* params, struct mInputMap* map, const struct } *GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) { .title = "Interface keys:", - .data = GUI_V_V, + .readonly = true, }; for (i = 0; i < params->keyMap.info->nKeys; ++i) { if (!params->keyMap.info->keyId[i]) { diff --git a/src/util/gui/menu.c b/src/util/gui/menu.c index 9e9227540..e70323d37 100644 --- a/src/util/gui/menu.c +++ b/src/util/gui/menu.c @@ -122,7 +122,7 @@ static enum GUIMenuExitReason GUIMenuPollInput(struct GUIParams* params, struct } if (newInput & (1 << GUI_INPUT_LEFT)) { struct GUIMenuItem* item = GUIMenuItemListGetPointer(&menu->items, menu->index); - if (item->validStates) { + if (item->validStates && !item->readonly) { _itemPrev(item, false); } else if (menu->index >= pageSize) { menu->index -= pageSize; @@ -132,7 +132,7 @@ static enum GUIMenuExitReason GUIMenuPollInput(struct GUIParams* params, struct } if (newInput & (1 << GUI_INPUT_RIGHT)) { struct GUIMenuItem* item = GUIMenuItemListGetPointer(&menu->items, menu->index); - if (item->validStates) { + if (item->validStates && !item->readonly) { _itemNext(item, false); } else if (menu->index + pageSize < GUIMenuItemListSize(&menu->items)) { menu->index += pageSize; @@ -184,17 +184,19 @@ static enum GUIMenuExitReason GUIMenuPollInput(struct GUIParams* params, struct } if (newInput & (1 << GUI_INPUT_SELECT) || (state->cursorOverItem == 2 && state->cursor == GUI_CURSOR_CLICKED)) { struct GUIMenuItem* item = GUIMenuItemListGetPointer(&menu->items, menu->index); - if (item->submenu) { - // Selected menus get shown inline - state->resultItem = item; - return GUI_MENU_ENTER; - } else if (item->validStates && GUIVariantIsString(item->data)) { - // Selected items with multiple (named) states get scrolled through - _itemNext(item, true); - } else { - // Otherwise tell caller item was accepted - state->resultItem = item; - return GUI_MENU_EXIT_ACCEPT; + if (!item->readonly) { + if (item->submenu) { + // Selected menus get shown inline + state->resultItem = item; + return GUI_MENU_ENTER; + } else if (item->validStates && GUIVariantIsString(item->data)) { + // Selected items with multiple (named) states get scrolled through + _itemNext(item, true); + } else { + // Otherwise tell caller item was accepted + state->resultItem = item; + return GUI_MENU_EXIT_ACCEPT; + } } } if (state->cursorOverItem == 1 && (state->cursor == GUI_CURSOR_UP || state->cursor == GUI_CURSOR_NOT_PRESENT)) { @@ -229,12 +231,12 @@ static void GUIMenuDraw(struct GUIParams* params, const struct GUIMenu* menu, co size_t i; for (i = state->start; i < GUIMenuItemListSize(&menu->items); ++i) { int color = 0xE0A0A0A0; - if (i == menu->index) { - color = 0xFFFFFFFF; - GUIFontDrawIcon(params->font, lineHeight * 0.8f, y, GUI_ALIGN_BOTTOM | GUI_ALIGN_RIGHT, GUI_ORIENT_0, 0xFFFFFFFF, GUI_ICON_POINTER); - } const struct GUIMenuItem* item = GUIMenuItemListGetConstPointer(&menu->items, i); - GUIFontPrint(params->font, lineHeight, y, GUI_ALIGN_LEFT, color, item->title); + if (i == menu->index) { + color = item->readonly ? 0xD0909090 : 0xFFFFFFFF; + GUIFontDrawIcon(params->font, lineHeight * 0.8f, y, GUI_ALIGN_BOTTOM | GUI_ALIGN_RIGHT, GUI_ORIENT_0, color, GUI_ICON_POINTER); + } + GUIFontPrint(params->font, item->readonly ? lineHeight * 3 / 2 : lineHeight, y, GUI_ALIGN_LEFT, color, item->title); if (item->validStates && item->validStates[item->state]) { GUIFontPrintf(params->font, params->width - right - 8, y, GUI_ALIGN_RIGHT, color, "%s ", item->validStates[item->state]); } From 0d34386e7a9c2371c78bdbc4bd6fad31a9e66884 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 9 Jan 2022 15:06:24 -0800 Subject: [PATCH 44/59] mGUI: Add way of viewing entered code in cheat view --- src/feature/gui/cheats.c | 44 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/feature/gui/cheats.c b/src/feature/gui/cheats.c index 1b06afa0a..821aede5f 100644 --- a/src/feature/gui/cheats.c +++ b/src/feature/gui/cheats.c @@ -11,6 +11,7 @@ #include enum mGUICheatAction { + CHEAT_BACK = 0, CHEAT_ADD_LINE = 1, CHEAT_RENAME, CHEAT_DELETE, @@ -18,15 +19,37 @@ enum mGUICheatAction { static const char* const offOn[] = { "Off", "On" }; +static void _rebuildCheatView(struct GUIMenuItemList* items, const struct mCheatSet* set) { + GUIMenuItemListClear(items); + size_t i; + for (i = 0; i < StringListSize(&set->lines); ++i) { + *GUIMenuItemListAppend(items) = (struct GUIMenuItem) { + .title = *StringListGetConstPointer(&set->lines, i), + .readonly = true + }; + } + *GUIMenuItemListAppend(items) = (struct GUIMenuItem) { + .title = "Back", + .data = GUI_V_U(CHEAT_BACK), + }; +} + static void mGUIShowCheatSet(struct mGUIRunner* runner, struct mCheatDevice* device, struct mCheatSet* set) { - char cheatName[64]; - snprintf(cheatName, sizeof(cheatName), "Edit cheat: %s", set->name); struct GUIMenu menu = { - .title = cheatName, + .title = "Edit cheat", + .subtitle = set->name, .index = 0, .background = &runner->background.d }; GUIMenuItemListInit(&menu.items, 0); + + struct GUIMenu view = { + .title = "View cheat", + .subtitle = set->name, + .index = 0, + .background = &runner->background.d + }; + *GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) { .title = "Enable", .state = set->enabled, @@ -37,6 +60,10 @@ static void mGUIShowCheatSet(struct mGUIRunner* runner, struct mCheatDevice* dev .title = "Add line", .data = GUI_V_U(CHEAT_ADD_LINE), }; + *GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) { + .title = "View lines", + .submenu = &view, + }; *GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) { .title = "Rename", .data = GUI_V_U(CHEAT_RENAME), @@ -50,6 +77,9 @@ static void mGUIShowCheatSet(struct mGUIRunner* runner, struct mCheatDevice* dev .data = GUI_V_V, }; + GUIMenuItemListInit(&view.items, 0); + _rebuildCheatView(&view.items, set); + while (true) { struct GUIKeyboardParams keyboard; GUIKeyboardParamsInit(&keyboard); @@ -67,6 +97,7 @@ static void mGUIShowCheatSet(struct mGUIRunner* runner, struct mCheatDevice* dev keyboard.maxLen = 12; if (runner->params.getText(&keyboard) == GUI_KEYBOARD_DONE) { mCheatAddLine(set, keyboard.result, 0); + _rebuildCheatView(&view.items, set); } break; case CHEAT_RENAME: @@ -75,12 +106,16 @@ static void mGUIShowCheatSet(struct mGUIRunner* runner, struct mCheatDevice* dev keyboard.maxLen = 50; if (runner->params.getText(&keyboard) == GUI_KEYBOARD_DONE) { mCheatSetRename(set, keyboard.result); - snprintf(cheatName, sizeof(cheatName), "Edit cheat: %s", set->name); + menu.subtitle = set->name; + view.subtitle = set->name; } break; case CHEAT_DELETE: mCheatRemoveSet(device, set); break; + case CHEAT_BACK: + // Used by submenus to return to the top menu + break; } if (action == CHEAT_DELETE) { @@ -88,6 +123,7 @@ static void mGUIShowCheatSet(struct mGUIRunner* runner, struct mCheatDevice* dev } } GUIMenuItemListDeinit(&menu.items); + GUIMenuItemListDeinit(&view.items); } void mGUIShowCheats(struct mGUIRunner* runner) { From 3402c151e6c8d2ed114e28b71f40d05c48b05fa3 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 9 Jan 2022 19:24:17 -0800 Subject: [PATCH 45/59] Qt: Rephrase save fail error --- src/platform/qt/CoreManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/qt/CoreManager.cpp b/src/platform/qt/CoreManager.cpp index 98403216a..05fccf1c2 100644 --- a/src/platform/qt/CoreManager.cpp +++ b/src/platform/qt/CoreManager.cpp @@ -112,7 +112,7 @@ CoreController* CoreManager::loadGame(VFile* vf, const QString& path, const QStr bytes = info.dir().canonicalPath().toUtf8(); mDirectorySetAttachBase(&core->dirs, VDirOpen(bytes.constData())); if (!mCoreAutoloadSave(core)) { - LOG(QT, ERROR) << tr("Failed to open save file. Is the save directory writable?"); + LOG(QT, ERROR) << tr("Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows)."); } mCoreAutoloadCheats(core); From 9335a82afb0d7444532ba6c19da4d724abf3b812 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 9 Jan 2022 19:38:06 -0800 Subject: [PATCH 46/59] Qt: Use appropriate update dialog for if stuff can auto-update --- src/platform/qt/ApplicationUpdatePrompt.cpp | 12 +++++++++--- src/platform/qt/ApplicationUpdater.cpp | 2 -- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/platform/qt/ApplicationUpdatePrompt.cpp b/src/platform/qt/ApplicationUpdatePrompt.cpp index 36e9e88d4..7f7b375c7 100644 --- a/src/platform/qt/ApplicationUpdatePrompt.cpp +++ b/src/platform/qt/ApplicationUpdatePrompt.cpp @@ -23,8 +23,15 @@ ApplicationUpdatePrompt::ApplicationUpdatePrompt(QWidget* parent) ApplicationUpdater* updater = GBAApp::app()->updater(); ApplicationUpdater::UpdateInfo info = updater->updateInfo(); - m_ui.text->setText(tr("An update to %1 is available.\nDo you want to download and install it now? You will need to restart the emulator when the download is complete.") - .arg(QLatin1String(projectName))); + QString updateText(tr("An update to %1 is available.\n").arg(QLatin1String(projectName))); +#if defined(Q_OS_WIN) || defined(Q_OS_MAC) + updateText += tr("\nDo you want to download and install it now? You will need to restart the emulator when the download is complete."); + m_okDownload = connect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, &ApplicationUpdatePrompt::startUpdate); +#else + updateText += tr("\nAuto-update is not available on this platform. If you wish to update you will need to do it manually."); + connect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, &QWidget::close); +#endif + m_ui.text->setText(updateText); m_ui.details->setText(tr("Current version: %1\nNew version: %2\nDownload size: %3") .arg(QLatin1String(projectVersion)) .arg(info) @@ -34,7 +41,6 @@ ApplicationUpdatePrompt::ApplicationUpdatePrompt(QWidget* parent) connect(updater, &AbstractUpdater::updateProgress, this, [this](float progress) { m_ui.progressBar->setValue(progress * 100); }); - m_okDownload = connect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, &ApplicationUpdatePrompt::startUpdate); connect(updater, &AbstractUpdater::updateDone, this, &ApplicationUpdatePrompt::promptRestart); } diff --git a/src/platform/qt/ApplicationUpdater.cpp b/src/platform/qt/ApplicationUpdater.cpp index 9895711e0..15334361e 100644 --- a/src/platform/qt/ApplicationUpdater.cpp +++ b/src/platform/qt/ApplicationUpdater.cpp @@ -44,12 +44,10 @@ ApplicationUpdater::ApplicationUpdater(ConfigController* config, QObject* parent config->setQtOption("lastUpdateCheck", m_lastCheck); if (available && currentVersion() < updateInfo()) { -#if defined(Q_OS_WIN) || defined(Q_OS_MAC) ApplicationUpdatePrompt* prompt = new ApplicationUpdatePrompt; connect(prompt, &QDialog::accepted, GBAApp::app(), &GBAApp::restartForUpdate); prompt->setAttribute(Qt::WA_DeleteOnClose); prompt->show(); -#endif } }); From 554019c6e8ea43fd76277dbe1ff0faee2dd9f336 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 9 Jan 2022 19:39:08 -0800 Subject: [PATCH 47/59] Qt: Update translations --- src/platform/qt/ts/mgba-de.ts | 345 ++++++++++++++-------------- src/platform/qt/ts/mgba-en.ts | 340 ++++++++++++++------------- src/platform/qt/ts/mgba-es.ts | 342 ++++++++++++++------------- src/platform/qt/ts/mgba-fi.ts | 340 ++++++++++++++------------- src/platform/qt/ts/mgba-fr.ts | 342 ++++++++++++++------------- src/platform/qt/ts/mgba-hu.ts | 342 ++++++++++++++------------- src/platform/qt/ts/mgba-it.ts | 342 ++++++++++++++------------- src/platform/qt/ts/mgba-ja.ts | 342 ++++++++++++++------------- src/platform/qt/ts/mgba-ko.ts | 340 ++++++++++++++------------- src/platform/qt/ts/mgba-ms.ts | 342 ++++++++++++++------------- src/platform/qt/ts/mgba-nb_NO.ts | 340 ++++++++++++++------------- src/platform/qt/ts/mgba-nl.ts | 340 ++++++++++++++------------- src/platform/qt/ts/mgba-pl.ts | 340 ++++++++++++++------------- src/platform/qt/ts/mgba-pt_BR.ts | 342 ++++++++++++++------------- src/platform/qt/ts/mgba-ru.ts | 345 ++++++++++++++-------------- src/platform/qt/ts/mgba-template.ts | 340 ++++++++++++++------------- src/platform/qt/ts/mgba-tr.ts | 342 ++++++++++++++------------- src/platform/qt/ts/mgba-zh_CN.ts | 345 ++++++++++++++-------------- 18 files changed, 3182 insertions(+), 2969 deletions(-) diff --git a/src/platform/qt/ts/mgba-de.ts b/src/platform/qt/ts/mgba-de.ts index 5d24de585..544d11693 100644 --- a/src/platform/qt/ts/mgba-de.ts +++ b/src/platform/qt/ts/mgba-de.ts @@ -1198,12 +1198,23 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. - Eine Update auf %1 ist verfügbar. -Möchtest Du das Update jetzt herunterladen und installeren? Du wirst den Emulator nach dem Download des Updates einmal neustarten müssen. + + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 @@ -1212,17 +1223,17 @@ Neue Version: %2 Download-Größe: %3 - + Downloading update... Update wird heruntergeladen... - + Downloading failed. Please update manually. Download fehlgeschlagen. Bitte führe das Update manuell durch. - + Downloading done. Press OK to restart %1 and install the update. Download abgeschlossen. Klicke auf OK, um %1 neuzustarten und das Update zu installieren. @@ -1230,22 +1241,22 @@ Download-Größe: %3 QGBA::ApplicationUpdater - + Stable Stabil - + Development Entwicklung - + Unknown Unbekannt - + (None) (keiner) @@ -1335,8 +1346,8 @@ Download-Größe: %3 - Failed to open save file. Is the save directory writable? - Fehler beim Öffnen der Speicherdatei. Ist das Zielverzeichnis beschreibbar? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4081,105 +4092,105 @@ Download-Größe: %3 QGBA::Window - + Game Boy Advance ROMs (%1) Game Boy Advance-ROMs (%1) - + Game Boy ROMs (%1) Game Boy-ROMs (%1) - + All ROMs (%1) Alle ROMs (%1) - + %1 Video Logs (*.mvl) %1 Video-Logs (*.mvl) - + Archives (%1) Archive (%1) - - - + + + Select ROM ROM auswählen - - + + Select save Speicherdatei wählen - + Select patch Patch wählen - + Patches (*.ips *.ups *.bps) Korrekturen (*.ips *.ups *.bps) - + Select e-Reader card images Bilder der Lesegerät-Karte auswählen - + Image file (*.png *.jpg *.jpeg) Bilddatei (*.png *.jpg *.jpeg) - + Conversion finished Konvertierung abgeschlossen - + %1 of %2 e-Reader cards converted successfully. %1 von %2 Lesegerät-Karten erfolgreich konvertiert. - + Select image Bild auswählen - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Bild-Datei (*.png *.gif *.jpg *.jpeg);;Alle Dateien (*) - + GameShark saves (*.sps *.xps) GameShark-Speicherdaten (*.sps *.xps) - + Select video log Video-Log auswählen - + Video logs (*.mvl) Video-Logs (*.mvl) - + Crash Absturz - + The game has crashed with the following error: %1 @@ -4188,654 +4199,654 @@ Download-Größe: %3 %1 - + Unimplemented BIOS call Nicht implementierter BIOS-Aufruf - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Dieses Spiel verwendet einen BIOS-Aufruf, der nicht implementiert ist. Bitte verwenden Sie für die beste Spielerfahrung das offizielle BIOS. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Es konnte kein geeignetes Ausgabegerät erstellt werden, stattdessen wird Software-Rendering als Rückfalloption genutzt. Spiele laufen möglicherweise langsamer, besonders innerhalb großer Fenster. - + Really make portable? Portablen Modus wirklich aktivieren? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Diese Einstellung wird den Emulator so konfigurieren, dass er seine Konfiguration aus dem gleichen Verzeichnis wie die Programmdatei lädt. Möchten Sie fortfahren? - + Restart needed Neustart benötigt - + Some changes will not take effect until the emulator is restarted. Einige Änderungen werden erst übernommen, wenn der Emulator neu gestartet wurde. - + - Player %1 of %2 - Spieler %1 von %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 Bilder/Sekunde) - %4 - + &File &Datei - + Load &ROM... &ROM laden... - + Load ROM in archive... ROM aus Archiv laden... - + Load &patch... &Patch laden... - + Boot BIOS BIOS booten - + Replace ROM... ROM ersetzen... - + Convert e-Reader card image to raw... Lesegerät-Kartenbild in Rohdaten umwandeln … - + ROM &info... ROM-&Informationen... - + Recent Zuletzt verwendet - + Make portable Portablen Modus aktivieren - + &Load state Savestate (aktueller Zustand) &laden - + Load state file... Savestate-Datei laden... - + &Save state Savestate (aktueller Zustand) &speichern - + Save state file... Savestate-Datei speichern... - + Quick load Schnell laden - + Quick save Schnell speichern - + Load recent Lade zuletzt gespeicherten Savestate - + Save recent Speichere aktuellen Zustand - + Undo load state Laden des Savestate rückgängig machen - + Undo save state Speichern des Savestate rückgängig machen - - + + State &%1 Savestate &%1 - + Load camera image... Lade Kamerabild... - + Convert save game... Spielstand konvertieren... - + New multiplayer window Neues Multiplayer-Fenster - + Connect to Dolphin... Mit Dolphin verbinden... - + Report bug... Fehler melden... - + E&xit &Beenden - + &Emulation &Emulation - + &Reset Zu&rücksetzen - + Sh&utdown Schli&eßen - + Yank game pak Spielmodul herausziehen - + &Pause &Pause - + &Next frame &Nächstes Bild - + Fast forward (held) Schneller Vorlauf (gehalten) - + &Fast forward Schneller &Vorlauf - + Fast forward speed Vorlauf-Geschwindigkeit - + Unbounded Unbegrenzt - + %0x %0x - + Rewind (held) Zurückspulen (gehalten) - + Re&wind Zur&ückspulen - + Step backwards Schrittweiser Rücklauf - + Sync to &video Mit &Video synchronisieren - + Sync to &audio Mit &Audio synchronisieren - + Solar sensor Sonnen-Sensor - + Increase solar level Sonnen-Level erhöhen - + Decrease solar level Sonnen-Level verringern - + Brightest solar level Hellster Sonnen-Level - + Darkest solar level Dunkelster Sonnen-Level - + Brightness %1 Helligkeit %1 - + BattleChip Gate... BattleChip Gate... - + Audio/&Video Audio/&Video - + Frame size Bildgröße - + Toggle fullscreen Vollbildmodus umschalten - + Lock aspect ratio Seitenverhältnis korrigieren - + Force integer scaling Pixelgenaue Skalierung (Integer scaling) - + Interframe blending Interframe-Überblendung - + Frame&skip Frame&skip - + Mute Stummschalten - + FPS target Bildwiederholrate - + Take &screenshot &Screenshot erstellen - + F12 F12 - + Clear Leeren - + Game Boy Printer... Game Boy Printer... - + Video layers Video-Ebenen - + Audio channels Audio-Kanäle - + Adjust layer placement... Lage der Bildebenen anpassen... - + &Tools &Werkzeuge - + View &logs... &Logs ansehen... - + Game &overrides... Spiel-&Überschreibungen... - + &Cheats... &Cheats... - + Open debugger console... Debugger-Konsole öffnen... - + Start &GDB server... &GDB-Server starten... - + Settings... Einstellungen... - + Select folder Ordner auswählen - + Save games (%1) Spielstände (%1) - + Select save game Spielstand auswählen - + mGBA save state files (%1) mGBA-Savestates (%1) - - + + Select save state Savestate auswählen - + Select e-Reader dotcode e-Reader-Code auswählen - + e-Reader card (*.raw *.bin *.bmp) e-Reader-Karte (*.raw *.bin *.bmp) - + GameShark saves (*.gsv *.sps *.xps) - + Couldn't Start Konnte nicht gestartet werden - + Could not start game. Spiel konnte nicht gestartet werden. - + Add folder to library... Ordner zur Bibliothek hinzufügen... - + Load alternate save game... Alternativen Spielstand laden... - + Load temporary save game... Temporären Spielstand laden... - + Scan e-Reader dotcodes... e-Reader-Code einlesen... - + Import GameShark Save... GameShare-Speicherstand importieren... - + Export GameShark Save... GameShark-Speicherstand exportieren... - + About... Über... - + %1× %1x - + Bilinear filtering Bilineare Filterung - + Native (59.7275) Nativ (59.7275) - + Record A/V... Audio/Video aufzeichnen... - + Record GIF/WebP/APNG... GIF/WebP/APNG aufzeichnen... - + Game Pak sensors... Spielmodul-Sensoren... - + View &palette... &Palette betrachten... - + View &sprites... &Sprites betrachten... - + View &tiles... &Tiles betrachten... - + View &map... &Map betrachten... - + &Frame inspector... &Bildbetrachter... - + View memory... Speicher betrachten... - + Search memory... Speicher durchsuchen... - + View &I/O registers... &I/O-Register betrachten... - + Record debug video log... Video-Protokoll aufzeichnen... - + Stop debug video log Aufzeichnen des Video-Protokolls beenden - + Exit fullscreen Vollbildmodus beenden - + GameShark Button (held) GameShark-Taste (gehalten) - + Autofire Autofeuer - + Autofire A Autofeuer A - + Autofire B Autofeuer B - + Autofire L Autofeuer L - + Autofire R Autofeuer R - + Autofire Start Autofeuer Start - + Autofire Select Autofeuer Select - + Autofire Up Autofeuer nach oben - + Autofire Right Autofeuer rechts - + Autofire Down Autofeuer nach unten - + Autofire Left Autofeuer links diff --git a/src/platform/qt/ts/mgba-en.ts b/src/platform/qt/ts/mgba-en.ts index 72643bad4..e39ca8bfd 100644 --- a/src/platform/qt/ts/mgba-en.ts +++ b/src/platform/qt/ts/mgba-en.ts @@ -1197,28 +1197,40 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1226,22 +1238,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1331,7 +1343,7 @@ Download size: %3 - Failed to open save file. Is the save directory writable? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -4077,759 +4089,759 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) - + Game Boy ROMs (%1) - + All ROMs (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) - - - + + + Select ROM - + Select folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear diff --git a/src/platform/qt/ts/mgba-es.ts b/src/platform/qt/ts/mgba-es.ts index 6f364eb7c..4616b8d46 100644 --- a/src/platform/qt/ts/mgba-es.ts +++ b/src/platform/qt/ts/mgba-es.ts @@ -1198,28 +1198,40 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1227,22 +1239,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Desconocido - + (None) @@ -1332,8 +1344,8 @@ Download size: %3 - Failed to open save file. Is the save directory writable? - Error al abrir el archivo de guardado: ¿El directorio tiene permisos de escritura? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4078,100 +4090,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ROMs de Game Boy Advance (%1) - + Game Boy ROMs (%1) ROMs de Game Boy (%1) - + All ROMs (%1) Todas las ROMs (%1) - + %1 Video Logs (*.mvl) Video-registros de %1 (*.mvl) - + Archives (%1) Contenedores (%1) - - - + + + Select ROM Seleccionar ROM - + Select folder Seleccionar carpeta - - + + Select save Seleccionar guardado - + Select patch Seleccionar parche - + Patches (*.ips *.ups *.bps) Parches (*.ips *.ups *.bps) - + Select e-Reader dotcode Seleccionar dotcode del e-Reader - + e-Reader card (*.raw *.bin *.bmp) Tarjeta e-Reader (*.raw *.bin *.bmp) - + Select image Seleccionar imagen - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Archivo de imagen (*.png *.gif *.jpg *.jpeg);;Todos los archivos (*) - + GameShark saves (*.sps *.xps) Guardados de GameShark (*.sps *.xps) - + Select video log Seleccionar video-registro - + Video logs (*.mvl) Video-registros (*.mvl) - + Crash Cierre inesperado - + The game has crashed with the following error: %1 @@ -4180,659 +4192,659 @@ Download size: %3 %1 - + Unimplemented BIOS call Llamada a BIOS no implementada - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Este juego utiliza una llamada al BIOS que no se ha implementado. Utiliza el BIOS oficial para obtener la mejor experiencia. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. No se pudo crear un dispositivo de pantalla apropiado, recurriendo a software. Los juegos pueden funcionar lentamente, especialmente con ventanas grandes. - + Really make portable? ¿Hacer "portable"? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Esto hará que el emulador cargue su configuración desde el mismo directorio que el ejecutable. ¿Quieres continuar? - + Restart needed Reinicio necesario - + Some changes will not take effect until the emulator is restarted. Algunos cambios no surtirán efecto hasta que se reinicie el emulador. - + - Player %1 of %2 - Jugador %1 de %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &Archivo - + Load &ROM... Cargar &ROM... - + Load ROM in archive... Cargar ROM desde contenedor... - + Add folder to library... Agregar carpeta a la biblioteca... - + Load &patch... Cargar &parche... - + Boot BIOS Arrancar BIOS - + Replace ROM... Reemplazar ROM... - + ROM &info... &Información de la ROM... - + Recent Recientes - + Make portable Hacer "portable" - + &Load state Ca&rgar estado - + Report bug... Reportar bug... - + About... Acerca de... - + Game Pak sensors... Sensores del cartucho... - + Clear Limpiar - + Load state file... Cargar archivo de estado... - + Save games (%1) Juegos guardados (%1) - + Select save game Elegir juego guardado - + mGBA save state files (%1) Archivos estados guardados mGBA (%1) - - + + Select save state Elegir estado guardado - + Select e-Reader card images Elegir imágenes de tarjeta e-Reader - + Image file (*.png *.jpg *.jpeg) Archivo de imagen (*.png *.jpg *.jpeg) - + Conversion finished Conversión terminada - + %1 of %2 e-Reader cards converted successfully. %1 de %2 tarjetas e-Reader convertidas con éxito. - + Load alternate save game... Elegir juego guardado alterno... - + Load temporary save game... Elegir juego guardado temporal... - + Convert e-Reader card image to raw... Convertir imagen de tarjeta e-Reader a raw... - + &Save state Guardar e&stado - + Save state file... Guardar archivo de estado... - + Quick load Cargado rápido - + Quick save Guardado rápido - + Load recent Cargar reciente - + Save recent Guardar reciente - + Undo load state Deshacer cargar estado - + Undo save state Deshacer guardar estado - - + + State &%1 Estado &%1 - + Load camera image... Cargar imagen para la cámara... - + Convert save game... Convertir juego guardado... - + GameShark saves (*.gsv *.sps *.xps) - + New multiplayer window Nueva ventana multijugador - + Connect to Dolphin... Conectar a Dolphin... - + E&xit Salir (&X) - + &Emulation &Emulación - + &Reset &Reinicializar - + Sh&utdown Apagar (&U) - + Yank game pak Tirar del cartucho - + &Pause &Pausar - + &Next frame Cuadro siguie&nte - + Fast forward (held) Avance rápido (mantener) - + &Fast forward &Avance rápido - + Fast forward speed Velocidad de avance rápido - + Unbounded Sin límite - + %0x %0x - + Rewind (held) Rebobinar (mantener) - + Re&wind Re&bobinar - + Step backwards Paso hacia atrás - + Sync to &video Sincronizar a &video - + Sync to &audio Sincronizar a au&dio - + Solar sensor Sensor solar - + Increase solar level Subir nivel - + Decrease solar level Bajar nivel - + Brightest solar level Más claro - + Darkest solar level Más oscuro - + Brightness %1 Brillo %1 - + Audio/&Video Audio/&video - + Frame size Tamaño del cuadro - + Toggle fullscreen Pantalla completa - + Lock aspect ratio Bloquear proporción de aspecto - + Force integer scaling Forzar escala a enteros - + Bilinear filtering Filtro bilineal - + Frame&skip &Salto de cuadros - + Mute Silenciar - + FPS target Objetivo de FPS - + Native (59.7275) Nativo (59,7275) - + Take &screenshot Tomar pan&tallazo - + F12 F12 - + Game Boy Printer... Game Boy Printer... - + BattleChip Gate... BattleChip Gate... - + %1× %1× - + Interframe blending Mezcla entre cuadros - + Record A/V... Grabar A/V... - + Video layers Capas de video - + Audio channels Canales de audio - + Adjust layer placement... Ajustar ubicación de capas... - + &Tools Herramien&tas - + View &logs... Ver re&gistros... - + Game &overrides... Ajustes específic&os por juego... - + Couldn't Start No se pudo iniciar - + Could not start game. No se pudo iniciar el juego. - + Scan e-Reader dotcodes... Escanear dotcodes del e-Reader... - + Import GameShark Save... Importar desde GameShark... - + Export GameShark Save... Exportar a GameShark... - + Record GIF/WebP/APNG... Grabar GIF/WebP/APNG... - + &Cheats... Tru&cos... - + Settings... Ajustes... - + Open debugger console... Abrir consola de depuración... - + Start &GDB server... Iniciar servidor &GDB... - + View &palette... Ver &paleta... - + View &sprites... Ver &sprites... - + View &tiles... Ver m&osaicos... - + View &map... Ver &mapa... - + &Frame inspector... Inspec&tor de cuadros... - + View memory... Ver memoria... - + Search memory... Buscar memoria... - + View &I/O registers... Ver registros &I/O... - + Record debug video log... Grabar registro de depuración de video... - + Stop debug video log Detener registro de depuración de video - + Exit fullscreen Salir de pantalla completa - + GameShark Button (held) Botón GameShark (mantener) - + Autofire Disparo automático - + Autofire A Disparo automático A - + Autofire B Disparo automático B - + Autofire L Disparo automático L - + Autofire R Disparo automático R - + Autofire Start Disparo automático Start - + Autofire Select Disparo automático Select - + Autofire Up Disparo automático Arriba - + Autofire Right Disparo automático Derecha - + Autofire Down Disparo automático Abajo - + Autofire Left Disparo automático Izquierda diff --git a/src/platform/qt/ts/mgba-fi.ts b/src/platform/qt/ts/mgba-fi.ts index 9dd83e89a..6cf67e56e 100644 --- a/src/platform/qt/ts/mgba-fi.ts +++ b/src/platform/qt/ts/mgba-fi.ts @@ -1198,28 +1198,40 @@ Game Boy Advance on Nintendo Co., Ltd rekisteröimä tuotemerkki. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1227,22 +1239,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1332,7 +1344,7 @@ Download size: %3 - Failed to open save file. Is the save directory writable? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -4078,759 +4090,759 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) - + Game Boy ROMs (%1) - + All ROMs (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) - - - + + + Select ROM - + Select folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + GameShark saves (*.gsv *.sps *.xps) - + Convert e-Reader card image to raw... - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index 39f67cc30..937966a0c 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -1199,28 +1199,40 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1228,22 +1240,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1333,8 +1345,8 @@ Download size: %3 - Failed to open save file. Is the save directory writable? - Impossible d'ouvrir le fichier de sauvegarde. Le répertoire de sauvegarde est-il accessible en écriture ? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4097,120 +4109,120 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ROMs de Game Boy Advance (%1) - + Game Boy ROMs (%1) ROMs de Game Boy (%1) - + All ROMs (%1) Toutes les ROM (%1) - + %1 Video Logs (*.mvl) %1 Journaux vidéo (*.mvl) - + Archives (%1) Archives (%1) - - - + + + Select ROM Choisir une ROM - + Select folder Choisir un dossier - - + + Select save Choisir une sauvegarde - + Select patch Sélectionner un correctif - + Patches (*.ips *.ups *.bps) Correctifs/Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode Sélectionnez le numéro de point du e-Reader - + e-Reader card (*.raw *.bin *.bmp) e-Reader carte (*.raw *.bin *.bmp) - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Select image Choisir une image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Image (*.png *.gif *.jpg *.jpeg);;Tous les fichiers (*) - + GameShark saves (*.sps *.xps) Sauvegardes GameShark (*.sps *.xps) - + Select video log Sélectionner un journal vidéo - + Video logs (*.mvl) Journaux vidéo (*.mvl) - + Crash Plantage - + The game has crashed with the following error: %1 @@ -4219,639 +4231,639 @@ Download size: %3 %1 - + Unimplemented BIOS call Requête au BIOS non supporté - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Ce jeu utilise un appel BIOS qui n'est pas implémenté. Veuillez utiliser le BIOS officiel pour une meilleure expérience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Échec de la création d'un périphérique d'affichage approprié, retour à l'affichage du logiciel. Les jeux peuvent fonctionner lentement, en particulier avec des fenêtres plus grandes. - + Really make portable? Vraiment rendre portable ? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Cela amènera l'émulateur à charger sa configuration depuis le même répertoire que l'exécutable. Souhaitez vous continuer ? - + Restart needed Un redémarrage est nécessaire - + Some changes will not take effect until the emulator is restarted. Certains changements ne prendront effet qu'après le redémarrage de l'émulateur. - + - Player %1 of %2 - Joueur %1 of %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &Fichier - + Load &ROM... Charger une &ROM… - + Load ROM in archive... Charger la ROM d'une archive… - + Add folder to library... Ajouter un dossier à la bibliothèque… - + Load &patch... Charger un c&orrectif… - + Boot BIOS Démarrer le BIOS - + Replace ROM... Remplacer la ROM… - + Convert e-Reader card image to raw... - + ROM &info... &Infos sur la ROM… - + Recent Récent - + Make portable Rendre portable - + &Load state &Charger un état - + &Save state &Sauvegarder un état - + Quick load Chargement rapide - + Quick save Sauvegarde rapide - + Load recent Charger un fichier récent - + Save recent Sauvegarder un fichier récent - + Undo load state Annuler le chargement de l'état - + Undo save state Annuler la sauvegarde de l'état - - + + State &%1 État &%1 - + Load camera image... Charger une image de la caméra… - + Convert save game... - + New multiplayer window Nouvelle fenêtre multijoueur - + Connect to Dolphin... - + Report bug... Signalement de l'erreur… - + E&xit &Quitter - + &Emulation &Émulation - + &Reset &Réinitialiser - + Sh&utdown Extin&ction - + Yank game pak Yank game pak - + &Pause &Pause - + &Next frame &Image suivante - + Fast forward (held) Avance rapide (maintenir) - + &Fast forward A&vance rapide - + Fast forward speed Vitesse de l'avance rapide - + Unbounded Sans limites - + %0x %0x - + Rewind (held) Rembobiner (maintenir) - + Re&wind Rem&bobiner - + Step backwards Retour en arrière - + Sync to &video Synchro &vidéo - + Sync to &audio Synchro &audio - + Solar sensor Capteur solaire - + Increase solar level Augmenter le niveau solaire - + Decrease solar level Diminuer le niveau solaire - + Brightest solar level Tester le niveau solaire - + Darkest solar level Assombrir le niveau solaire - + Brightness %1 Luminosité %1 - + Audio/&Video Audio/&Vidéo - + Frame size Taille de l'image - + Toggle fullscreen Basculer en plein écran - + Lock aspect ratio Bloquer les proportions - + Force integer scaling Forcer la mise à l'échelle par des nombres entiers - + Bilinear filtering Filtrage bilinèaire - + Frame&skip &Saut d'image - + Mute Muet - + FPS target FPS ciblé - + Take &screenshot Prendre une ca&pture d'écran - + F12 F12 - + Game Boy Printer... Imprimante GameBoy… - + Video layers Couches vidéo - + Audio channels Canaux audio - + Adjust layer placement... Ajuster la disposition… - + &Tools Ou&tils - + View &logs... Voir les &journaux… - + Game &overrides... - + Couldn't Start N'a pas pu démarrer - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + GameShark saves (*.gsv *.sps *.xps) - + Could not start game. Impossible de démarrer le jeu. - + Load alternate save game... - + Load temporary save game... - + Scan e-Reader dotcodes... Scanner les dotcodes e-Reader... - + Load state file... Charger le fichier d'état... - + Save state file... Enregistrer le fichier d'état... - + Import GameShark Save... Importer la sauvegarde de GameShark... - + Export GameShark Save... Exporter la sauvegarde de GameShark... - + About... À propos de… - + BattleChip Gate... - + %1× %1× - + Interframe blending Mélange d'images - + Native (59.7275) Natif (59.7275) - + Record A/V... Enregistrer A/V... - + Record GIF/WebP/APNG... Enregistrer GIF/WebP/APNG... - + Game Pak sensors... Capteurs de la Game Pak... - + &Cheats... &Cheats… - + Settings... Paramètres… - + Open debugger console... Ouvrir la console de débug… - + Start &GDB server... Démarrer le serveur &GDB… - + View &palette... Voir la &palette… - + View &sprites... Voir les &sprites… - + View &tiles... Voir les &tiles… - + View &map... Voir la &map… - + &Frame inspector... Inspecteur de &frame... - + View memory... Voir la mémoire… - + Search memory... Recherche dans la mémoire… - + View &I/O registers... Voir les registres d'&E/S... - + Record debug video log... Enregistrer le journal vidéo de débogage... - + Stop debug video log Arrêter le journal vidéo de débogage - + Exit fullscreen Quitter le plein écran - + GameShark Button (held) Bouton GameShark (maintenir) - + Autofire Tir automatique - + Autofire A Tir automatique A - + Autofire B Tir automatique B - + Autofire L Tir automatique L - + Autofire R Tir automatique R - + Autofire Start Tir automatique Start - + Autofire Select Tir automatique Select - + Autofire Up Tir automatique Up - + Autofire Right Tir automatique Right - + Autofire Down Tir automatique Down - + Autofire Left Tir automatique Gauche - + Clear Vider diff --git a/src/platform/qt/ts/mgba-hu.ts b/src/platform/qt/ts/mgba-hu.ts index b88a2ae3c..c26ac92bd 100644 --- a/src/platform/qt/ts/mgba-hu.ts +++ b/src/platform/qt/ts/mgba-hu.ts @@ -1198,28 +1198,40 @@ A Game Boy Advance a Nintendo Co., Ltd. bejegyzett védjegye An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1227,22 +1239,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1332,8 +1344,8 @@ Download size: %3 - Failed to open save file. Is the save directory writable? - Nem sikerült a mentésfájl megnyitása. Írható a mentést tartalmazó könyvtár? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4076,759 +4088,759 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) - + Game Boy ROMs (%1) - + All ROMs (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) - - - + + + Select ROM - + Select folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear Napló törlése diff --git a/src/platform/qt/ts/mgba-it.ts b/src/platform/qt/ts/mgba-it.ts index aabda7fe9..f850871df 100644 --- a/src/platform/qt/ts/mgba-it.ts +++ b/src/platform/qt/ts/mgba-it.ts @@ -1198,28 +1198,40 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1227,22 +1239,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Sconosciuto - + (None) @@ -1332,8 +1344,8 @@ Download size: %3 - Failed to open save file. Is the save directory writable? - Impossibile aprire il file di salvataggio. La directory di salvataggio è scrivibile? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4078,115 +4090,115 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ROM per Game Boy Advance (%1) - + Game Boy ROMs (%1) ROM per Game Boy (%1) - + All ROMs (%1) Tutte le ROM (%1) - + %1 Video Logs (*.mvl) %1 log Video (*.mvl) - + Archives (%1) Archivi (%1) - - - + + + Select ROM Seleziona ROM - - + + Select save Seleziona salvataggio - + Select patch Seleziona patch - + Patches (*.ips *.ups *.bps) Patch (*.ips *.ups *.bps) - + Select e-Reader dotcode Selezione e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) e-Reader card (*.raw *.bin *.bmp) - + Select e-Reader card images Seleziona immagini carte e-Reader - + Image file (*.png *.jpg *.jpeg) File immagine (*.png *.jpg *.jpeg) - + Conversion finished Conversione terminata - + %1 of %2 e-Reader cards converted successfully. %1 di %2 carte e-Reader convertite con successo. - + Select image Seleziona immagine - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) File immagine (*.png *.gif *.jpg *.jpeg);;Tutti i file (*) - + GameShark saves (*.sps *.xps) Salvataggi GameShark (*.sps *.xps) - + Select video log Seleziona log video - + Video logs (*.mvl) Log video (*.mvl) - + Crash Errore fatale - + The game has crashed with the following error: %1 @@ -4195,644 +4207,644 @@ Download size: %3 %1 - + Unimplemented BIOS call BIOS non implementato - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Questo gioco utilizza una chiamata BIOS non implementata. Utilizza il BIOS ufficiale per una migliore esperienza. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Impossibile creare un dispositivo di visualizzazione appropriato, tornando alla visualizzazione software. I giochi possono funzionare lentamente, specialmente con finestre più grandi. - + Really make portable? Vuoi davvero rendere portatile l'applicazione? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? In questo modo l'emulatore carica la propria configurazione dalla stessa cartella dell'eseguibile. Vuoi continuare? - + Restart needed È necessario riavviare - + Some changes will not take effect until the emulator is restarted. Alcune modifiche non avranno effetto finché l'emulatore non verrà riavviato. - + - Player %1 of %2 - Giocatore %1 di %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File File - + Load &ROM... Carica ROM... - + Load ROM in archive... Carica la ROM in archivio... - + Load &patch... Carica patch... - + Boot BIOS Avvia BIOS - + Replace ROM... Sostituisci la ROM... - + Scan e-Reader dotcodes... Scansiona e-Reader dotcode... - + Convert e-Reader card image to raw... Converti immagini carte e-Reader in raw... - + ROM &info... Informazioni ROM... - + Recent Recenti - + Make portable Rendi portatile - + &Load state Carica stato - + &Save state Salva stato - + Quick load Caricamento rapido - + Quick save Salvataggio rapido - + Load recent Carica recente - + Save recent Salva recente - + Undo load state Annulla il caricamento dello stato - + Undo save state Annulla salvataggio stato - - + + State &%1 Stato %1 - + Load camera image... Carica immagine fotocamera... - + Convert save game... Converti salvataggi... - + GameShark saves (*.gsv *.sps *.xps) - + New multiplayer window Nuova finestra multigiocatore - + Connect to Dolphin... Connessione a Dolphin... - + Report bug... Segnala bug... - + E&xit Esci (&X) - + &Emulation Emulazione - + &Reset Reset - + Sh&utdown Spegni (&U) - + Yank game pak Yank game pak - + &Pause Pausa - + &Next frame Salta il prossimo frame (&N) - + Fast forward (held) Avanzamento rapido (tieni premuto) - + &Fast forward Avanzamento rapido (&F) - + Fast forward speed Velocità di avanzamento rapido - + Unbounded Illimitata - + %0x %0x - + Rewind (held) Riavvolgimento (tieni premuto) - + Re&wind Riavvolgimento (&W) - + Step backwards Torna indietro - + Sync to &video Sincronizza con il video - + Sync to &audio Sincronizza con l'audio - + Solar sensor Sensore solare - + Increase solar level Incrementa il livello solare - + Decrease solar level Riduci il livello solare - + Brightest solar level Livello solare massimo - + Darkest solar level Livello solare minimo - + Brightness %1 Luminosità %1 - + Audio/&Video Audio/Video - + Frame size Dimensione frame - + Toggle fullscreen Abilita schermo Intero - + Lock aspect ratio Blocca rapporti aspetto - + Frame&skip Salto frame - + Mute Muto - + FPS target FPS finali - + Take &screenshot Acquisisci schermata - + F12 F12 - + Record GIF/WebP/APNG... Registra GIF / WebP / APNG ... - + Video layers Layers video - + Audio channels Canali audio - + &Tools Strumenti - + View &logs... Visualizza registri (&log)... - + Game &overrides... Valore specifico per il gioco... - + &Cheats... Trucchi... - + Open debugger console... Apri console debugger... - + Start &GDB server... Avvia server GDB... - + Settings... Impostazioni... - + Select folder Seleziona cartella - + Couldn't Start Non è stato possibile avviare - + Could not start game. Non è stato possibile avviare il gioco. - + Add folder to library... Aggiungi cartella alla libreria... - + Load state file... Carica stato di salvataggio... - + Save state file... Salva stato di salvataggio... - + Import GameShark Save... Importa Salvataggio GameShark... - + Export GameShark Save... Esporta Salvataggio GameShark... - + About... Informazioni… - + Force integer scaling Forza ridimensionamento a interi - + Bilinear filtering Filtro bilineare - + Game Boy Printer... Stampante Game Boy... - + Save games (%1) Salvataggi (%1) - + Select save game Seleziona salvataggio - + mGBA save state files (%1) file di stati di salvataggio mGBA (%1) - - + + Select save state Seleziona stato di salvataggio - + Load alternate save game... Carica stato di salvataggio alternativo... - + Load temporary save game... Carica salvataggio temporaneo... - + BattleChip Gate... BattleChip Gate... - + %1× %1x - + Interframe blending Miscelazione dei frame - + Native (59.7275) Nativo (59.7) - + Record A/V... Registra A/V... - + Adjust layer placement... Regola posizionamento layer... - + Game Pak sensors... Sensori Game Pak... - + View &palette... Mostra palette... - + View &sprites... Mostra sprites... - + View &tiles... Mostra tiles... - + View &map... Mostra mappa... - + &Frame inspector... &Frame inspector... - + View memory... Mostra memoria... - + Search memory... Ricerca memoria... - + View &I/O registers... Mostra registri I/O... - + Record debug video log... Registra video log di debug... - + Stop debug video log Ferma video log di debug - + Exit fullscreen Esci da Schermo Intero - + GameShark Button (held) Pulsante GameShark (tieni premuto) - + Autofire Pulsanti Autofire - + Autofire A Autofire A - + Autofire B Autofire B - + Autofire L Autofire L - + Autofire R Autofire R - + Autofire Start Autofire Start - + Autofire Select Autofire Select - + Autofire Up Autofire Su - + Autofire Right AAutofire Destra - + Autofire Down Autofire Giù - + Autofire Left Autofire Sinistra - + Clear Pulisci diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index c236db9c2..04c3ff979 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -1198,28 +1198,40 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1227,22 +1239,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown 不明 - + (None) @@ -1332,8 +1344,8 @@ Download size: %3 - Failed to open save file. Is the save directory writable? - セーブファイルを開けませんでした。セーブディレクトリが書き込み可能であることを確認してください。 + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4076,100 +4088,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ゲームボーイアドバンスファイル (%1) - + Game Boy ROMs (%1) ゲームボーイファイル (%1) - + All ROMs (%1) すべてのファイル (%1) - + %1 Video Logs (*.mvl) %1ビデオログ (*.mvl) - + Archives (%1) アーカイブファイル (%1) - - - + + + Select ROM ROMを開く - + Select folder フォルダを開く - - + + Select save セーブを開く - + Select patch パッチを開く - + Patches (*.ips *.ups *.bps) パッチファイル (*.ips *.ups *.bps) - + Select e-Reader dotcode カードeを開く - + e-Reader card (*.raw *.bin *.bmp) カードe (*.raw *.bin *.bmp) - + Select image 画像を開く - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) 画像ファイル (*.png *.gif *.jpg *.jpeg);;すべてのファイル (*) - + GameShark saves (*.sps *.xps) GameSharkセーブファイル (*.sps *.xps) - + Select video log ビデオログを開く - + Video logs (*.mvl) ビデオログ (*.mvl) - + Crash クラッシュ - + The game has crashed with the following error: %1 @@ -4178,659 +4190,659 @@ Download size: %3 %1 - + Couldn't Start 起動失敗 - + Could not start game. ゲームを起動できませんでした。 - + Unimplemented BIOS call 未実装のBIOS呼び出し - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. このゲームは実装されていないBIOS呼び出しを使用します。最高のエクスペリエンスを得るには公式のBIOSを使用してください。 - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. 適切なディスプレイデバイスの作成に失敗し、ソフトディスプレイにフォールバックしました。特に大きなウィンドウでは、ゲームの実行が遅い場合があります。 - + Really make portable? 本当にポータブルにしますか? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? これによりエミュレータは実行ファイルと同じディレクトリにある設定ファイルをロードします。続けますか? - + Restart needed 再起動が必要 - + Some changes will not take effect until the emulator is restarted. 一部の変更は、エミュレータを再起動するまで有効になりません。 - + - Player %1 of %2 - プレーヤー %1 of %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &ファイル (&F) - + Load &ROM... ROMをロード... - + Load ROM in archive... アーカイブにROMをロード... - + Add folder to library... ライブラリーにフォルダを追加... - + Load &patch... パッチをロード... (&P) - + Boot BIOS BIOSを起動 - + Replace ROM... ROMを交換... - + Scan e-Reader dotcodes... カードeをスキャン... - + ROM &info... ROM情報... (&I) - + Recent 最近開いたROM - + Make portable ポータブル化 - + &Load state ステートをロード (&L) - + Report bug... バグ報告 - + About... バージョン情報... - + Record GIF/WebP/APNG... GIF/WebP/APNGを記録 - + Game Pak sensors... カートリッジセンサー... - + Clear 消去 - + Load state file... ステートファイルをロード... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... - + Load temporary save game... - + Convert e-Reader card image to raw... - + &Save state ステートをセーブ (&S) - + Save state file... ステートファイルをセーブ... - + Quick load クイックロード - + Quick save クイックセーブ - + Load recent 最近使ったクイックロットからロード - + Save recent 最近使ったクイックロットにセーブ - + Undo load state クイックロードを元に戻す - + Undo save state クイックセーブを元に戻す - - + + State &%1 クイックスロット &%1 - + Load camera image... カメラ画像をロード... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... GameSharkスナップショットを読み込む - + Export GameShark Save... GameSharkスナップショットを書き出す - + New multiplayer window 新しいウィンドウ(マルチプレイ) - + Connect to Dolphin... - + E&xit 終了 (&X) - + &Emulation エミュレーション (&E) - + &Reset リセット (&R) - + Sh&utdown 閉じる (&U) - + Yank game pak ゲームパックをヤンク - + &Pause 一時停止 (&P) - + &Next frame 次のフレーム (&N) - + Fast forward (held) 早送り(押し) - + &Fast forward 早送り (&F) - + Fast forward speed 早送り速度 - + Unbounded 制限なし - + %0x %0x - + Rewind (held) 巻戻し(押し) - + Re&wind 巻戻し (&R) - + Step backwards 1フレーム巻き戻す - + Sync to &video ビデオ同期 (&V) - + Sync to &audio オーディオ同期 (&A) - + Solar sensor 太陽センサー - + Increase solar level 明るさを上げる - + Decrease solar level 明るさを下げる - + Brightest solar level 明るさ最高 - + Darkest solar level 明るさ最低 - + Brightness %1 明るさ %1 - + Audio/&Video オーディオ/ビデオ (&V) - + Frame size 画面サイズ - + Toggle fullscreen 全画面表示 - + Lock aspect ratio 縦横比を固定 - + Force integer scaling 整数スケーリングを強制 - + Bilinear filtering バイリニアフィルタリング - + Frame&skip フレームスキップ (&S) - + Mute ミュート - + FPS target FPS - + Native (59.7275) ネイティブ(59.7275) - + Take &screenshot スクリーンショット (&S) - + F12 F12 - + Game Boy Printer... ポケットプリンタ... - + BattleChip Gate... チップゲート... - + %1× %1× - + Interframe blending フレーム間混合 - + Record A/V... ビデオ録画... - + Video layers ビデオレイヤー - + Audio channels オーディオチャンネル - + Adjust layer placement... レイヤーの配置を調整... - + &Tools ツール (&T) - + View &logs... ログビューアー... (&L) - + Game &overrides... ゲーム別設定... (&O) - + &Cheats... チート... (&C) - + Settings... 設定... - + Open debugger console... デバッガコンソールを開く... - + Start &GDB server... GDBサーバを起動... (&G) - + View &palette... パレットビューアー... (&P) - + View &sprites... スプライトビューアー... (&S) - + View &tiles... タイルビューアー... (&T) - + View &map... マップビューアー... (&M) - + &Frame inspector... フレームインスペクタ... (&F) - + View memory... メモリビューアー... - + Search memory... メモリ検索... - + View &I/O registers... IOビューアー... (&I) - + Record debug video log... デバッグビデオログ... - + Stop debug video log デバッグビデオログを停止 - + Exit fullscreen 全画面表示を終了 - + GameShark Button (held) GameSharkボタン(押し) - + Autofire 連打 - + Autofire A 連打 A - + Autofire B 連打 B - + Autofire L 連打 L - + Autofire R 連打 R - + Autofire Start 連打 Start - + Autofire Select 連打 Select - + Autofire Up 連打 上 - + Autofire Right 連打 右 - + Autofire Down 連打 下 - + Autofire Left 連打 左 diff --git a/src/platform/qt/ts/mgba-ko.ts b/src/platform/qt/ts/mgba-ko.ts index e6cbab94c..b004997a1 100644 --- a/src/platform/qt/ts/mgba-ko.ts +++ b/src/platform/qt/ts/mgba-ko.ts @@ -1198,28 +1198,40 @@ Game Boy Advance는 Nintendo Co., Ltd.의 등록 상표입니다. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1227,22 +1239,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1332,7 +1344,7 @@ Download size: %3 - Failed to open save file. Is the save directory writable? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -4076,115 +4088,115 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) 게임 보이 어드밴스 롬 (%1) - + Game Boy ROMs (%1) 게임 보이 (%1) - + All ROMs (%1) 모든 롬 (%1) - + %1 Video Logs (*.mvl) %1 비디오 로그 (*.mvl) - + Archives (%1) 아카이브 (%1) - - - + + + Select ROM 롬 선택 - - + + Select save 저장 파일 선택 - + Select patch 패치 선택 - + Patches (*.ips *.ups *.bps) 패치 (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Select image 이미지 선택 - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) 이미지 파일 (*.png *.gif *.jpg *.jpeg);;모든 파일 (*) - + GameShark saves (*.sps *.xps) 게임샤크 저장 파일 (*.sps *.xps) - + Select video log 비디오 로그 선택 - + Video logs (*.mvl) 비디오 로그 (*.mvl) - + Crash 치명적인 오류 - + The game has crashed with the following error: %1 @@ -4193,644 +4205,644 @@ Download size: %3 %1 - + Unimplemented BIOS call 구현되지 않은 바이오스 호출 - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. 이 게임은 구현되지 않은 바이오스 호출을 사용합니다. 최상의 성능을 얻으려면 공식 바이오스를 사용하십시오. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? 정말로 휴대용을 만듭니까? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? 이렇게하면 에뮬레이터가 실행 파일과 동일한 디렉토리에서 구성을 로드하게됩니다. 계속 하시겠습니까? - + Restart needed 재시작 필요 - + Some changes will not take effect until the emulator is restarted. 일부 변경 사항은 에뮬레이터가 다시 시작될 때까지 적용되지 않습니다. - + - Player %1 of %2 - 플레이어 %1 의 %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &파일 - + Load &ROM... 로드 &롬... - + Load ROM in archive... 롬을 아카이브에 로드... - + Load &patch... 로드 &패치... - + Boot BIOS BIOS 부팅 - + Replace ROM... 롬 교체... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... 롬 &정보... - + Recent 최근 실행 - + Make portable 휴대용 만들기 - + &Load state &로드 파일 상태 - + &Save state &저장 파일 상태 - + Quick load 빠른 로드 - + Quick save 빠른 저장 - + Load recent 최근 실행 로드 - + Save recent 최근 실행 저장 - + Undo load state 로드 파일 상태 복원 - + Undo save state 저장 파일 상태 복원 - - + + State &%1 상태 &%1 - + Load camera image... 카메라 이미지 로드... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + New multiplayer window 새로운 멀티 플레이어 창 - + Connect to Dolphin... - + E&xit 종&료 - + &Emulation &에뮬레이션 - + &Reset &재설정 - + Sh&utdown 종&료 - + Yank game pak 양키 게임 팩 - + &Pause &정지 - + &Next frame &다음 프레임 - + Fast forward (held) 빨리 감기 (누름) - + &Fast forward &빨리 감기 - + Fast forward speed 빨리 감기 속도 - + Unbounded 무제한 - + %0x %0x - + Rewind (held) 되김기 (누름) - + Re&wind 리&와인드 - + Step backwards 돌아가기 - + Sync to &video 비디오 &동기화 - + Sync to &audio 오디오 &동기화 - + Brightest solar level 가장 밝은 태양 수준 - + Darkest solar level 가장 어두운 태양 수준 - + Brightness %1 밝기 %1 - + Audio/&Video 오디오/&비디오 - + Frame size 프레임 크기 - + Toggle fullscreen 전체화면 전환 - + Lock aspect ratio 화면비 잠금 - + Frame&skip 프레임&건너뛰기 - + Mute 무음 - + FPS target FPS 대상 - + Take &screenshot 스크린샷 &찍기 - + F12 F12 - + Video layers 비디오 레이어 - + Audio channels 오디오 채널 - + &Tools &도구 - + View &logs... 로그 &보기... - + Game &overrides... 게임 &오버라이드... - + &Cheats... &치트.. - + Open debugger console... 디버거 콘솔 열기... - + Start &GDB server... GDB 서버 &시작... - + Settings... 설정... - + Select folder 폴더 선택 - + Couldn't Start - + Could not start game. - + Add folder to library... 라이브러리에 폴더 추가... - + Load state file... - + Save state file... - + Import GameShark Save... - + Export GameShark Save... - + Report bug... - + About... - + Solar sensor - + Increase solar level - + Decrease solar level - + Force integer scaling 정수 스케일링 강제 수행 - + Bilinear filtering 이중선형 필터링 - + Game Boy Printer... 게임 보이 프린터... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Load alternate save game... - + Load temporary save game... - + BattleChip Gate... - + %1× %1x {1×?} - + Interframe blending - + Native (59.7275) Nativo (59.7) {59.7275)?} - + Record A/V... - + Record GIF/WebP/APNG... - + Adjust layer placement... 레이어 배치 조정... - + Game Pak sensors... - + View &palette... 팔레트 &보기... - + View &sprites... 스프라이트 &보기... - + View &tiles... 타일 &보기... - + View &map... 지도 &보기... - + &Frame inspector... - + View memory... 메모리 보기... - + Search memory... 메모리 검색... - + View &I/O registers... I/O 레지스터 &보기... - + Record debug video log... - + Stop debug video log - + Exit fullscreen 전체화면 종료 - + GameShark Button (held) 게임샤크 버튼 (누름) - + Autofire 연사 - + Autofire A 연사 A - + Autofire B 연사 B - + Autofire L 연사 L - + Autofire R 연사 R - + Autofire Start 연사 시작 - + Autofire Select - + Clear 정리 - + Autofire Up 연사 위쪽 - + Autofire Right 연사 오른쪽 - + Autofire Down 연사 아래쪽 - + Autofire Left 연사 왼쪽 diff --git a/src/platform/qt/ts/mgba-ms.ts b/src/platform/qt/ts/mgba-ms.ts index cbf9418f1..5f32ccf98 100644 --- a/src/platform/qt/ts/mgba-ms.ts +++ b/src/platform/qt/ts/mgba-ms.ts @@ -1197,28 +1197,40 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1226,22 +1238,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1331,8 +1343,8 @@ Download size: %3 - Failed to open save file. Is the save directory writable? - Gagal membuka fail tersimpan. Adakah direktori simpanan diboleh-tulis? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4075,100 +4087,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ROM Game Boy Advance (%1) - + Game Boy ROMs (%1) ROM Game Boy (%1) - + All ROMs (%1) Semua ROM (%1) - + %1 Video Logs (*.mvl) %1 Log Video (*.mvl) - + Archives (%1) Arkib (%1) - - - + + + Select ROM Pilih ROM - + Select folder Pilih folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image Pilih gambar - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Fail gambar (*.png *.gif *.jpg *.jpeg);;Semua fail (*) - + GameShark saves (*.sps *.xps) Simpanan GameShark (*.sps *.xps) - + Select video log Pilih log video - + Video logs (*.mvl) Log video (*.mvl) - + Crash Nahas - + The game has crashed with the following error: %1 @@ -4177,659 +4189,659 @@ Download size: %3 %1 - + Couldn't Start Tidak dapat memula - + Could not start game. Permainan tidak dapat bermula. - + Unimplemented BIOS call Panggilan BIOS yg belum dilaksanakan - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Permainan ini menggunakan panggilan BIOS yang belum dilaksanakan. Sila pakai BIOS rasmi untuk pengalaman yang lebih baik. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Gagal mencipta peranti paparan yang sesuai, berbalik ke paparan perisian. Permainan mungkin menjadi lembap, terutamanya dengan tetingkap besar. - + Really make portable? Betulkah mahu buat jadi mudah alih? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Ini akan menetapkan pelagak untuk muat konfigurasi dari direktori yang sama dengan fail bolehlakunya. Teruskan? - + Restart needed Mula semula diperlukan - + Some changes will not take effect until the emulator is restarted. Beberapa perubahan tidak akan dilaksanakan sehingga pelagak dimula semula. - + - Player %1 of %2 - Pemain %1 dari %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &File - + Load &ROM... Muat %ROM... - + Load ROM in archive... Muat ROM daripada arkib... - + Add folder to library... Tambah folder ke perpustakaan... - + Save games (%1) Simpanan permainan (%1) - + Select save game Pilih simpanan permainan - + mGBA save state files (%1) mGBA fail keadaan tersimpan (%1) - - + + Select save state Pilih keadaan tersimpan - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) Fail gambar (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... Muat simpanan permainan alternatif... - + Load temporary save game... Muat simpanan permainan sementara... - + Load &patch... - + Boot BIOS But BIOS - + Replace ROM... Ganti ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... &Perihal ROM... - + Recent Terkini - + Make portable Buat jadi mudah alih - + &Load state &Muat keadaan - + Load state file... Muat fail keadaan... - + &Save state &Simpan keadaan - + Save state file... Simpan fail keadaan... - + Quick load - + Quick save - + Load recent Muat terkini - + Save recent Simpan terkini - + Undo load state Buat asal keadaan termuat - + Undo save state Buat asal keadaan tersimpan - - + + State &%1 Keadaan &%1 - + Load camera image... Muat gambar kamera... - + Convert save game... Tukar simpanan permainan... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... Import Simpanan GameShark... - + Export GameShark Save... Eksport Simpanan GameShark... - + New multiplayer window Tetingkap multipemain baru - + Connect to Dolphin... Sambung ke Dolphin... - + Report bug... Laporkan pepijat... - + About... Perihal... - + E&xit &Keluar - + &Emulation Pe&lagak - + &Reset - + Sh&utdown &Matikan - + Yank game pak Alih keluar Game Pak - + &Pause &Jeda - + &Next frame Bingkai se&terusnya - + Fast forward (held) Mundar laju (pegang) - + &Fast forward Mundar &laju - + Fast forward speed Kelajuan mundar laju - + Unbounded Tidak terbatas - + %0x %0x - + Rewind (held) Putar balik (pegang) - + Re&wind Ma&ndir - + Step backwards Langkah belakang - + Sync to &video Segerak ke &video - + Sync to &audio Segerak ke &audio - + Solar sensor Pengesan suria - + Increase solar level Meningkatkan aras suria - + Decrease solar level Mengurangkan aras suria - + Brightest solar level Aras suria paling terang - + Darkest solar level Aras suria paling gelap - + Brightness %1 Kecerahan %1 - + Game Boy Printer... Pencetak Game Boy... - + BattleChip Gate... BattleChip Gate... - + Audio/&Video Audio/&Video - + Frame size Saiz bingkai - + %1× %1× - + Toggle fullscreen Togol skrinpenuh - + Lock aspect ratio Kekalkan nisbah aspek - + Force integer scaling Paksa skala integer - + Interframe blending Persebatian antarabingkai - + Bilinear filtering Penapisan bilinear - + Frame&skip Langkauan &bingkai - + Mute Senyap - + FPS target Sasaran FPS - + Native (59.7275) Asal (59.7275) - + Take &screenshot Ambil &cekupan skrin - + F12 F12 - + Record A/V... Rakam A/V... - + Record GIF/WebP/APNG... Rakam GIF/WebP/APNG... - + Video layers Lapisan video - + Audio channels Saluran audio - + Adjust layer placement... Melaras peletakan lapisan... - + &Tools &Alat - + View &logs... Lihat &log... - + Game &overrides... - + Game Pak sensors... Pengesan Game Pak... - + &Cheats... &Tipu... - + Settings... Tetapan... - + Open debugger console... Buka konsol penyahpepijat... - + Start &GDB server... Mula pelayan &GDB... - + View &palette... Pelihat &palet... - + View &sprites... - + View &tiles... Pelihat &jubin... - + View &map... Pelihat pe&ta... - + &Frame inspector... Periksa &bingkai... - + View memory... Lihat ingatan... - + Search memory... Cari ingatan... - + View &I/O registers... Lihat daftar &I/O... - + Record debug video log... Rakam log video nyahpepijat... - + Stop debug video log Henti log video nyahpepijat - + Exit fullscreen Keluar skrinpenuh - + GameShark Button (held) Butang GameShark (pegang) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear Kosongkan diff --git a/src/platform/qt/ts/mgba-nb_NO.ts b/src/platform/qt/ts/mgba-nb_NO.ts index 91ebef059..c8272fb1f 100644 --- a/src/platform/qt/ts/mgba-nb_NO.ts +++ b/src/platform/qt/ts/mgba-nb_NO.ts @@ -1198,28 +1198,40 @@ Game Boy Advance er et registrert varemerke tilhørende Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1227,22 +1239,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Ukjent - + (None) @@ -1332,7 +1344,7 @@ Download size: %3 - Failed to open save file. Is the save directory writable? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -4078,759 +4090,759 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) - + Game Boy ROMs (%1) - + All ROMs (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) Arkiv (%1) - - - + + + Select ROM Velg ROM - + Select folder Velg mappe - - + + Select save - + Select patch Velg feilfiks - + Patches (*.ips *.ups *.bps) Feilfikser (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image Velg bilde - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Bildefil (*.png *.gif *.jpg *.jpeg);;All filer (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash Krasj - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear Tøm diff --git a/src/platform/qt/ts/mgba-nl.ts b/src/platform/qt/ts/mgba-nl.ts index 7e2d1a629..15b425687 100644 --- a/src/platform/qt/ts/mgba-nl.ts +++ b/src/platform/qt/ts/mgba-nl.ts @@ -1197,28 +1197,40 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1226,22 +1238,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1331,7 +1343,7 @@ Download size: %3 - Failed to open save file. Is the save directory writable? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -4077,759 +4089,759 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) - + Game Boy ROMs (%1) - + All ROMs (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) - - - + + + Select ROM - + Select folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index c60e57a8a..1a654793f 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -1197,28 +1197,40 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1226,22 +1238,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1331,7 +1343,7 @@ Download size: %3 - Failed to open save file. Is the save directory writable? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -4079,759 +4091,759 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) - + Game Boy ROMs (%1) - + All ROMs (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) - - - + + + Select ROM - + Select folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear Wyczyść diff --git a/src/platform/qt/ts/mgba-pt_BR.ts b/src/platform/qt/ts/mgba-pt_BR.ts index fd70cd5cc..3e1df1a9c 100644 --- a/src/platform/qt/ts/mgba-pt_BR.ts +++ b/src/platform/qt/ts/mgba-pt_BR.ts @@ -1198,28 +1198,40 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1227,22 +1239,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Desconhecido - + (None) @@ -1332,8 +1344,8 @@ Download size: %3 - Failed to open save file. Is the save directory writable? - Falhou em abrir o arquivo do save. O diretório do save é gravável? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4078,100 +4090,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ROMs do Game Boy Advance (%1) - + Game Boy ROMs (%1) ROMs do Game Boy (%1) - + All ROMs (%1) Todas as ROMs (%1) - + %1 Video Logs (*.mvl) %1 Registros do Vídeo (*.mvl) - + Archives (%1) Arquivos Compactados (%1) - - - + + + Select ROM Selecionar ROM - + Select folder Selecionar pasta - - + + Select save Selecionar save - + Select patch Selecionar patch - + Patches (*.ips *.ups *.bps) Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode Selecionar dotcode do e-Reader - + e-Reader card (*.raw *.bin *.bmp) Cartão do e-Reader (*.raw *.bin *.bmp) - + Select image Selecionar imagem - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Arquivo de imagem (*.png *.gif *.jpg *.jpeg);;Todos os arquivos (*) - + GameShark saves (*.sps *.xps) Saves do GameShark (*.sps *.xps) - + Select video log Selecionar registro do vídeo - + Video logs (*.mvl) Registros do vídeo (*.mvl) - + Crash Crash - + The game has crashed with the following error: %1 @@ -4180,659 +4192,659 @@ Download size: %3 %1 - + Unimplemented BIOS call Chamada da BIOS não implementada - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Este jogo usa uma chamada de BIOS que não está implementada. Por favor use a BIOS oficial pra uma melhor experiência. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Falhou em criar um dispositivo de exibição apropriado, voltando a exibição por software. Os jogos podem executar lentamente, especialmente com janelas maiores. - + Really make portable? Realmente tornar portátil? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Isto fará o emulador carregar sua configuração do mesmo diretório que o executável. Você quer continuar? - + Restart needed Reiniciar é necessário - + Some changes will not take effect until the emulator is restarted. Algumas mudanças não terão efeito até que o emulador seja reiniciado. - + - Player %1 of %2 - Jogador %1 de %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &Arquivo - + Load &ROM... Carregar &ROM... - + Load ROM in archive... Carregar ROM no arquivo compactado... - + Add folder to library... Adicionar a pasta a biblioteca... - + Load &patch... Carregar &patch... - + Boot BIOS Dar Boot na BIOS - + Replace ROM... Substituir ROM... - + ROM &info... Informações da &ROM... - + Recent Recentes - + Make portable Tornar portátil - + &Load state &Carregar state - + Report bug... Reportar bug... - + About... Sobre... - + Game Pak sensors... Sensores do Game Pak... - + Clear Limpar - + Load state file... Carregar arquivo do state... - + Save games (%1) Saves dos jogos (%1) - + Select save game Selecione save do jogo - + mGBA save state files (%1) Arquivos do save state do mGBA (%1) - - + + Select save state Selecione save state - + Select e-Reader card images Selecionar imagens do cartão do e-Reader - + Image file (*.png *.jpg *.jpeg) Arquivo da imagem (*.png *.jpg *.jpeg) - + Conversion finished Conversão concluída - + %1 of %2 e-Reader cards converted successfully. %1 de %2 cartões do e-Reader convertidos com sucesso. - + Load alternate save game... Carregar save alternativo do jogo... - + Load temporary save game... Carregar save temporário do jogo... - + Convert e-Reader card image to raw... Converter imagem do cartão do e-Reader pro natural... - + &Save state &Salvar o state - + Save state file... Arquivo do save state... - + Quick load Carregamento rápido - + Quick save Salvamento rápido - + Load recent Carregar recentes - + Save recent Salvar recentes - + Undo load state Desfazer o carregamento do state - + Undo save state Desfazer o salvamento do state - - + + State &%1 State &%1 - + Load camera image... Carregar imagem da câmera... - + Convert save game... Converter save do jogo... - + GameShark saves (*.gsv *.sps *.xps) - + New multiplayer window Nova janela multi-jogador - + Connect to Dolphin... Conectar ao Dolphin... - + E&xit S&air - + &Emulation &Emulação - + &Reset &Resetar - + Sh&utdown De&sligar - + Yank game pak Arrancar game pak - + &Pause &Pausar - + &Next frame &Próximo frame - + Fast forward (held) Avanço rápido (segurado) - + &Fast forward &Avanço rápido - + Fast forward speed Velocidade do avanço rápido - + Unbounded Ilimitado - + %0x %0x - + Rewind (held) Retroceder (segurado) - + Re&wind Re&troceder - + Step backwards Voltar um passo - + Sync to &video Sincronizar no &vídeo - + Sync to &audio Sincronizar no &áudio - + Solar sensor Sensor solar - + Increase solar level Aumentar nível solar - + Decrease solar level Diminuir nível solar - + Brightest solar level Nível solar mais brilhante - + Darkest solar level Nível solar mais escuro - + Brightness %1 Brilho %1 - + Audio/&Video Áudio/&Vídeo - + Frame size Tamanho do frame - + Toggle fullscreen Alternar tela cheia - + Lock aspect ratio Trancar proporção do aspecto - + Force integer scaling Forçar dimensionamento da integral - + Bilinear filtering Filtragem bilinear - + Frame&skip Frame&skip - + Mute Mudo - + FPS target FPS alvo - + Native (59.7275) Nativo (59,7275) - + Take &screenshot Tirar &screenshot - + F12 F12 - + Game Boy Printer... Impressora do Game Boy... - + BattleChip Gate... Portal do BattleChip... - + %1× %1× - + Interframe blending Mistura do interframe - + Record A/V... Gravar A/V... - + Video layers Camadas do vídeo - + Audio channels Canais de áudio - + Adjust layer placement... Ajustar posicionamento da camada... - + &Tools &Ferramentas - + View &logs... Visualizar &registros... - + Game &overrides... Substituições &do jogo... - + Couldn't Start Não Pôde Iniciar - + Could not start game. Não pôde iniciar o jogo. - + Scan e-Reader dotcodes... Escanear dotcodes do e-Reader... - + Import GameShark Save... Importar Save do GameShark... - + Export GameShark Save... Exportar Save do GameShark... - + Record GIF/WebP/APNG... Gravar GIF/WebP/APNG... - + &Cheats... &Trapaças... - + Settings... Configurações... - + Open debugger console... Abrir console do debugger... - + Start &GDB server... Iniciar servidor do &GDB... - + View &palette... Visualizar &paleta... - + View &sprites... Visualizar &imagens móveis... - + View &tiles... Visualizar &ladrilhos... - + View &map... Visualizar &mapa... - + &Frame inspector... Inspetor dos &frames... - + View memory... Visualizar memória... - + Search memory... Procurar memória... - + View &I/O registers... Visualizar registros de &E/S... - + Record debug video log... Gravar registro do vídeo de debug... - + Stop debug video log Parar log do vídeo de debug - + Exit fullscreen Sair da tela cheia - + GameShark Button (held) Botão do GameShark (segurado) - + Autofire Auto-disparar - + Autofire A Auto-disparar A - + Autofire B Auto-disparar B - + Autofire L Auto-disparar L - + Autofire R Auto-disparar R - + Autofire Start Auto-disparar Start - + Autofire Select Auto-disparar Select - + Autofire Up Auto-disparar Pra Cima - + Autofire Right Auto-disparar Direita - + Autofire Down Auto-disparar Pra Baixo - + Autofire Left Auto-disparar Esquerda diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 6db47cc61..6856fd1a9 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -1198,12 +1198,23 @@ Game Boy Advance - зарегистрированная торговая мар An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. - Доступно обновление %1. -Загрузить и установить его сейчас? После завершения загрузки потребуется перезапустить эмулятор. + + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 @@ -1212,17 +1223,17 @@ Download size: %3 Размер файла: %3 - + Downloading update... Загрузка обновления... - + Downloading failed. Please update manually. Загрузка не удалась. Пожалуйста, загрузите обновление вручную. - + Downloading done. Press OK to restart %1 and install the update. Загрузка завершена. Нажмите OK для перезапуска и установки обновления. @@ -1230,22 +1241,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable Стабильная - + Development В разработке - + Unknown Неизвестно - + (None) (Нет) @@ -1335,8 +1346,8 @@ Download size: %3 - Failed to open save file. Is the save directory writable? - Не удалось открыть файл сохранения. Разрешена ли запись для папки сохранений? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4083,100 +4094,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) Игры Game Boy Advance (%1) - + Game Boy ROMs (%1) Игры Game Boy (%1) - + All ROMs (%1) Все игры (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) Архивы (%1) - - - + + + Select ROM Выбор игры - + Select folder Выбор папки - - + + Select save Выбор сохранения - + Select patch Выбор патча - + Patches (*.ips *.ups *.bps) Патчи (*.ips *.ups *.bps) - + Select e-Reader dotcode Выбор карточки e-Reader - + e-Reader card (*.raw *.bin *.bmp) Карточка e-Reader (*.raw *.bin *.bmp) - + Select image Выбор изображения - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Файл изображения (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) Сохранения GameShark (*.sps *.xps) - + Select video log Выбор видеолога - + Video logs (*.mvl) Видеологи (*.mvl) - + Crash Сбой - + The game has crashed with the following error: %1 @@ -4185,659 +4196,659 @@ Download size: %3 %1 - + Couldn't Start Запуск не удался - + Could not start game. Не удалось запустить игру. - + Unimplemented BIOS call Неизвестный вызов BIOS - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Игра использует нереализованный вызов BIOS. Пожалуйста, воспользуйтесь официальным BIOS для лучшей совместимости. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Не удалось создать устройство отображения, возврат к программному режиму. Игры могут идти медленнее, особенно в окнах больших размеров. - + Really make portable? Перейти в портативный режим? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? После этого эмулятор будет загружать конфигурацию из папки с исполняемым файлом. Продолжить? - + Restart needed Требуется перезапуск - + Some changes will not take effect until the emulator is restarted. Для применения некоторых изменений требуется перезапустить эмулятор. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File &Файл - + Load &ROM... - + Load ROM in archive... Загрузить игру из архива... - + Add folder to library... Добавить папку в библиотеку... - + Save games (%1) Игровые сохранения (%1) - + Select save game Выбор игрового сохранения - + mGBA save state files (%1) Файл сохранения состояния mGBA (%1) - - + + Select save state Выбор сохранения состояния - + Select e-Reader card images Выбор изображения карточки e-Reader - + Image file (*.png *.jpg *.jpeg) Файл изображения (*.png *.jpg *.jpeg) - + Conversion finished Конвертация завершена - + %1 of %2 e-Reader cards converted successfully. %1 из %2 карточек e-Reader успешно сконвертировано. - + Load alternate save game... Загрузить альтернативное сохранение... - + Load temporary save game... Загрузить временное сохранение... - + Load &patch... Загрузить &патч... - + Boot BIOS Загрузиться в BIOS - + Replace ROM... Заменить ROM... - + Scan e-Reader dotcodes... Сканировать dot-коды e-Reader... - + Convert e-Reader card image to raw... Конвертировать карту e-Reader в raw... - + ROM &info... Информация об &игре... - + Recent Недавние - + Make portable Портативный режим - + &Load state &Загрузить состояние - + Load state file... Загрузить состояние из файла... - + &Save state &Сохранить состояние - + Save state file... Сохранить состояние в файл... - + Quick load Быстрая загрузка - + Quick save Быстрое сохранение - + Load recent Загрузить недавнее - + Save recent Сохранить в недавнее - + Undo load state Отмена загрузки состояния - + Undo save state Отмена сохранения состояния - - + + State &%1 Слот &%1 - + Load camera image... Загрузить изображение с камеры... - + Convert save game... Конвертировать игровое сохранение... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... Импорт сохранения GameShark... - + Export GameShark Save... Экспорт сохранения GameShark... - + New multiplayer window Новое окно мультиплеера - + Connect to Dolphin... Соединение с Dolphin... - + Report bug... Сообщить об ошибке... - + About... О программе... - + E&xit &Выход - + &Emulation &Эмуляция - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear Очистить diff --git a/src/platform/qt/ts/mgba-template.ts b/src/platform/qt/ts/mgba-template.ts index 9728a5d2f..ccdf160bd 100644 --- a/src/platform/qt/ts/mgba-template.ts +++ b/src/platform/qt/ts/mgba-template.ts @@ -1197,28 +1197,40 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1226,22 +1238,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1331,7 +1343,7 @@ Download size: %3 - Failed to open save file. Is the save directory writable? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -4075,759 +4087,759 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) - + Game Boy ROMs (%1) - + All ROMs (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) - - - + + + Select ROM - + Select folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts index 2ce027593..a92fb9dcd 100644 --- a/src/platform/qt/ts/mgba-tr.ts +++ b/src/platform/qt/ts/mgba-tr.ts @@ -1198,28 +1198,40 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. @@ -1227,22 +1239,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Bilinmeyen - + (None) @@ -1332,8 +1344,8 @@ Download size: %3 - Failed to open save file. Is the save directory writable? - Kayıt dosyası açılma başarısız. Kayıt yolu yazılabilir mi? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4076,120 +4088,120 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) Game Boy Advance ROMları (%1) - + Game Boy ROMs (%1) Game Boy ROMları (%1) - + All ROMs (%1) Bütün ROMlar (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) Arşivler (%1) - - - + + + Select ROM ROM seç - + Select folder Klasör seç - - + + Select save Kayıt seç - + Select patch Yama seç - + Patches (*.ips *.ups *.bps) Yamalar (*.ips *.ups *.bps) - + Select e-Reader dotcode e-Okuyucu nokta kodunu seç - + e-Reader card (*.raw *.bin *.bmp) e-Okuyucu kart (*.raw *.bin *.bmp) - + Select e-Reader card images e-Okuyucu kartından görüntüleri seç - + Image file (*.png *.jpg *.jpeg) Görüntü dosyası (*.png *.jpg *.jpeg) - + Conversion finished Dönüştürme tamamlandı - + %1 of %2 e-Reader cards converted successfully. %1 / %2 e-Okuyucu kartları dönüştürme tamamlandı. - + Select image Resim seç - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Resim dosyası (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) GameShark kayıtları (*.sps *.xps) - + Select video log Video günlüğü seç - + Video logs (*.mvl) Video günlükleri (*.mvl) - + Crash Çökme - + The game has crashed with the following error: %1 @@ -4198,639 +4210,639 @@ Download size: %3 %1 - + Unimplemented BIOS call Uygulanmamış BIOS girişi - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Oyun BIOS dosyasına ihtiyacı var. Lütfen en iyi deneyim için resmi BIOS'u kullanın. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Uygun görüntü cihazı oluşturma başarısız, yazılım ekranına dönülüyor. Oyunlar özellikle daha büyük ekranlarda yavaş çalışabilir. - + Really make portable? Taşınabilir yapılsın mı? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Emülatörün yapılandırmasını yürütülebilir dosya ile aynı dizinden yüklemesini sağlar. Devam etmek istiyor musun? - + Restart needed Yeniden başlatma gerekli - + Some changes will not take effect until the emulator is restarted. Bazı değişiklikler emülatör yeniden başlatılıncaya kadar etkili olmaz. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... &ROM yükle... - + Load ROM in archive... ROM'u arşivden yükle ... - + Add folder to library... Kütüphaneye klasör ekle ... - + Load &patch... &Patch yükle... - + Boot BIOS BIOS boot et - + Replace ROM... ROM değişti... - + Convert e-Reader card image to raw... e-Okuyucu kart resimlerini rawa dönüştür... - + ROM &info... ROM &info... - + Recent Son kullanılanlar - + Make portable Portatif yap - + &Load state &Kaydedilmiş konum yükle - + Load state file... Kaydedilmiş konum dosyası yükle... - + &Save state &Konumu kaydet - + Save state file... Konum dosyasını kaydet... - + Quick load Hızlı Yükle - + Quick save Hızlı kaydet - + Load recent En son yükle - + Save recent Hızlı kaydet - + Undo load state Kaydedilen konum yüklemeyi geri al - + Undo save state Konum kaydetmeyi geri al - - + + State &%1 Konum &%1 - + Load camera image... Kamera resmini yükle ... - + Convert save game... Kayıtlı oyun dömnüştürülüyor... - + GameShark saves (*.gsv *.sps *.xps) - + New multiplayer window Yeni çokoyunculu ekranı - + Connect to Dolphin... Dolphin'e Bağlan... - + Report bug... Hata rapor et... - + About... Hakkında... - + E&xit Çıkış - + &Emulation Emülasyon - + &Reset &Reset - + Sh&utdown Kapat - + Yank game pak - + &Pause &Durdur - + &Next frame &Sonraki kare - + Fast forward (held) İleriye sar(basılı tutun) - + &Fast forward &İleriye sar - + Fast forward speed İleriye sarma hızı - + Unbounded - + %0x - + Rewind (held) Geri sar (basılı tutun) - + Re&wind Geri sar - + Step backwards Geriye doğru adım - + Sync to &video &Videoya eşitle - + Sync to &audio &Sese eşitle - + Solar sensor - + Increase solar level Solar seviyesini arttır - + Decrease solar level Solar seviyesini düşür - + Brightest solar level En parlak solar seviyesi - + Darkest solar level En karanlık solar seviyesi - + Brightness %1 Parlaklık:%1 - + Game Boy Printer... Game Boy yazıcısı... - + BattleChip Gate... - + Audio/&Video Ses/&Video - + Frame size Çerçeve boyutu - + Toggle fullscreen Tamekranı aç/kapa - + Lock aspect ratio En boy oranını kilitle - + Force integer scaling Tamsayılı ölçeklendirmeyi zorla - + Bilinear filtering Bilinear filtreleme - + Frame&skip Kare atlama - + Mute Sessiz - + FPS target FPS hedefi - + Native (59.7275) - + Take &screenshot Ekran görüntüsü al - + F12 - + Video layers - + Audio channels Ses kanalları - + Adjust layer placement... Katman yerleşimini ayarlayın... - + &Tools &Araçlar - + View &logs... Kayıtları görüntüle... - + Game &overrides... & Oyunun üzerine yazılanlar... - + Couldn't Start Başlatılamadı - + Save games (%1) Kayıtlı oyunlar (%1) - + Select save game Kayıtlı oyun seç - + mGBA save state files (%1) mGBA kayıt durum dosyası (%1) - - + + Select save state Kayıt durumu seç - + Could not start game. Oyun başlatılamadı. - + Load alternate save game... Alternatif kayıtlı oyun yükle... - + Load temporary save game... Geçici kayıtlı oyunu yükle... - + Scan e-Reader dotcodes... e-Okuyucu noktakodları tara... - + Import GameShark Save... GameShark kaydını içeri aktar... - + Export GameShark Save... GameShark kaydını dışarı aktar... - + %1× %1× - + Interframe blending Kareler-arası Karıştırma - + Record A/V... A/V Kayıt... - + Record GIF/WebP/APNG... GIF/WebP/APNG Kayıt... - + Game Pak sensors... Oyun Kartuş sensörleri... - + &Cheats... &Hileler... - + Settings... Ayarlar... - + Open debugger console... Hata ayıklayıcı konsolunu aç ... - + Start &GDB server... &GDB sunucusunu başlat... - + View &palette... &Renk Paletini gör... - + View &sprites... &Spriteları gör... - + View &tiles... &Desenleri gör... - + View &map... &Haritayı gör - + &Frame inspector... &Kare denetçisi... - + View memory... Hafıza gör... - + Search memory... Hafızada ara... - + View &I/O registers... &I/O kayıtlarını görüntüle - + Record debug video log... Hata ayıklama video günlüğünü kaydet... - + Stop debug video log Hata ayıklama video günlüğünü durdur - + Exit fullscreen Tam ekrandan çık - + GameShark Button (held) GameShark Butonu (basılı tutun) - + Autofire Otomatik basma - + Autofire A Otomatik basma A - + Autofire B Otomatik basma B - + Autofire L Otomatik basma L - + Autofire R Otomatik basma R - + Autofire Start Otomatik basma Start - + Autofire Select Otomatik basma Select - + Autofire Up Otomatik basma Up - + Autofire Right Otomatik basma Right - + Autofire Down Otomatik basma Down - + Autofire Left Otomatik basma Sol - + Clear Temizle diff --git a/src/platform/qt/ts/mgba-zh_CN.ts b/src/platform/qt/ts/mgba-zh_CN.ts index 80f150a15..85c31c78c 100644 --- a/src/platform/qt/ts/mgba-zh_CN.ts +++ b/src/platform/qt/ts/mgba-zh_CN.ts @@ -1198,12 +1198,23 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 An update to %1 is available. -Do you want to download and install it now? You will need to restart the emulator when the download is complete. - %1 有更新可用。 -您想要现在下载并安装它吗?在下载完成后,您将需要重新启动模拟器。 + + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + Current version: %1 New version: %2 Download size: %3 @@ -1212,17 +1223,17 @@ Download size: %3 更新大小:%3 - + Downloading update... 正在下载更新... - + Downloading failed. Please update manually. 下载失败。请手动更新。 - + Downloading done. Press OK to restart %1 and install the update. 下载完成。按确定按钮以重新启动 %1 并安装更新。 @@ -1230,22 +1241,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable 稳定版 - + Development 开发版 - + Unknown 未知 - + (None) (无) @@ -1335,8 +1346,8 @@ Download size: %3 - Failed to open save file. Is the save directory writable? - 无法打开存档文件。存档目录是否可写入? + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + @@ -4079,100 +4090,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) Game Boy Advance ROM (%1) - + Game Boy ROMs (%1) Game Boy ROM (%1) - + All ROMs (%1) 所有 ROM (%1) - + %1 Video Logs (*.mvl) %1 视频日志 (*.mvl) - + Archives (%1) 压缩文件 (%1) - - - + + + Select ROM 选择 ROM - + Select folder 选择文件夹 - - + + Select save 选择存档 - + Select patch 选择补丁 - + Patches (*.ips *.ups *.bps) 补丁 (*.ips *.ups *.bps) - + Select e-Reader dotcode 选择 e-Reader 点码 - + e-Reader card (*.raw *.bin *.bmp) e-Reader 卡 (*.raw *.bin *.bmp) - + Select image 选择图片 - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) 图像文件 (*.png *.gif *.jpg *.jpeg);;所有文件 (*) - + GameShark saves (*.sps *.xps) GameShark 存档 (*.sps *.xps) - + Select video log 选择视频日志 - + Video logs (*.mvl) 视频日志文件 (*.mvl) - + Crash 崩溃 - + The game has crashed with the following error: %1 @@ -4181,659 +4192,659 @@ Download size: %3 %1 - + Couldn't Start 无法启动 - + Could not start game. 无法启动游戏。 - + Unimplemented BIOS call 未实现的 BIOS 调用 - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. 此游戏使用尚未实现的 BIOS 调用。请使用官方 BIOS 以获得最佳体验。 - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. 无法创建适合的显示设备,正在回滚到软件显示。游戏的运行速度(特别在大窗口的情况下)可能会变慢。 - + Really make portable? 确定进行程序便携化? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? 进行此操作后,模拟器将从其可执行文件所在目录中载入模拟器配置。您想继续吗? - + Restart needed 需要重新启动 - + Some changes will not take effect until the emulator is restarted. 更改将在模拟器下次重新启动时生效。 - + - Player %1 of %2 - 玩家 %1 共 %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2(%3 fps)- %4 - + &File 文件(&F) - + Load &ROM... 载入 ROM(&R)... - + Load ROM in archive... 从压缩文件中载入 ROM... - + Add folder to library... 将文件夹添加到库中... - + Save games (%1) 保存游戏(%1) - + Select save game 选择保存游戏 - + mGBA save state files (%1) mGBA 即时存档文件(%1) - - + + Select save state 选择即时存档 - + Select e-Reader card images 选择 e-Reader 卡片图像 - + Image file (*.png *.jpg *.jpeg) 图像文件(*.png *.jpg *.jpeg) - + Conversion finished 转换完成 - + %1 of %2 e-Reader cards converted successfully. 成功转换了 %1 张(共 %2 张)e-Reader 卡片。 - + Load alternate save game... 加载备用保存游戏... - + Load temporary save game... 加载临时保存游戏... - + Load &patch... 载入补丁(&P)... - + Boot BIOS 引导 BIOS - + Replace ROM... 替换 ROM... - + Scan e-Reader dotcodes... 扫描 e-Reader 点码... - + Convert e-Reader card image to raw... 将 e-Reader 卡片图像转换为原始数据... - + ROM &info... ROM 信息(&I)... - + Recent 最近打开 - + Make portable 程序便携化 - + &Load state 载入即时存档(&L) - + Load state file... 载入即时存档文件... - + &Save state 保存即时存档(&S) - + Save state file... 保存即时存档文件... - + Quick load 快速读档 - + Quick save 快速存档 - + Load recent 载入最近存档 - + Save recent 保存最近存档 - + Undo load state 撤消读档 - + Undo save state 撤消存档 - - + + State &%1 即时存档 (&%1) - + Load camera image... 载入相机图片... - + Convert save game... 转换保存游戏... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... 导入 GameShark 存档... - + Export GameShark Save... 导出 GameShark 存档... - + New multiplayer window 新建多人游戏窗口 - + Connect to Dolphin... 连接到 Dolphin... - + Report bug... 报告错误... - + About... 关于... - + E&xit 退出(&X) - + &Emulation 模拟(&E) - + &Reset 重置(&R) - + Sh&utdown 关机(&U) - + Yank game pak 快速抽出游戏卡带 - + &Pause 暂停(&P) - + &Next frame 下一帧(&N) - + Fast forward (held) 快进 (长按) - + &Fast forward 快进(&F) - + Fast forward speed 快进速度 - + Unbounded 不限制 - + %0x %0x - + Rewind (held) 倒带 (长按) - + Re&wind 倒带(&W) - + Step backwards 步退 - + Sync to &video 视频同步(&V) - + Sync to &audio 音频同步(&A) - + Solar sensor 太阳光传感器 - + Increase solar level 增加太阳光等级 - + Decrease solar level 降低太阳光等级 - + Brightest solar level 太阳光等级为最亮 - + Darkest solar level 太阳光等级为最暗 - + Brightness %1 亮度 %1 - + Game Boy Printer... Game Boy 打印机... - + BattleChip Gate... BattleChip Gate... - + Audio/&Video 音频/视频(&V) - + Frame size 画面大小 - + %1× %1× - + Toggle fullscreen 切换全屏 - + Lock aspect ratio 锁定纵横比 - + Force integer scaling 强制整数缩放 - + Interframe blending 帧间混合 - + Bilinear filtering 双线性过滤 - + Frame&skip 跳帧(&S) - + Mute 静音 - + FPS target 目标 FPS - + Native (59.7275) 原生 (59.7275) - + Take &screenshot 截图(&S) - + F12 F12 - + Record A/V... 录制音频/视频... - + Record GIF/WebP/APNG... 录制 GIF/WebP/APNG... - + Video layers 视频图层 - + Audio channels 音频声道 - + Adjust layer placement... 调整图层布局... - + &Tools 工具(&T) - + View &logs... 查看日志(&L)... - + Game &overrides... 覆写游戏(&O)... - + Game Pak sensors... 游戏卡带传感器... - + &Cheats... 作弊码(&C)... - + Settings... 设置... - + Open debugger console... 打开调试器控制台... - + Start &GDB server... 打开 GDB 服务器(&G)... - + View &palette... 查看调色板(&P)... - + View &sprites... 查看精灵图(&S)... - + View &tiles... 查看图块(&T)... - + View &map... 查看映射(&M)... - + &Frame inspector... 框架检查器(&F)... - + View memory... 查看内存... - + Search memory... 搜索内存... - + View &I/O registers... 查看 I/O 寄存器(&I)... - + Record debug video log... 记录调试视频日志... - + Stop debug video log 停止记录调试视频日志 - + Exit fullscreen 退出全屏 - + GameShark Button (held) GameShark 键 (长按) - + Autofire 连发 - + Autofire A 连发 A - + Autofire B 连发 B - + Autofire L 连发 L - + Autofire R 连发 R - + Autofire Start 连发 Start - + Autofire Select 连发 Select - + Autofire Up 连发 上 - + Autofire Right 连发 右 - + Autofire Down 连发 下 - + Autofire Left 连发 左 - + Clear 清除 From cf69bad59bdaeed708034f29d6c8690d91ade31e Mon Sep 17 00:00:00 2001 From: Luna Lyday Date: Tue, 4 Jan 2022 21:28:31 +0000 Subject: [PATCH 48/59] Qt: Update translation (Polish) Translation: mGBA/Qt Translate-URL: https://hosted.weblate.org/projects/mgba/mgba-qt/pl/ --- src/platform/qt/ts/mgba-pl.ts | 344 +++++++++++++++++----------------- 1 file changed, 173 insertions(+), 171 deletions(-) diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index 1a654793f..b701ba8be 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -6,7 +6,7 @@ About - O aplikacji + O Aplikacji @@ -40,7 +40,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update is available - + Dostępna jest aktualizacja @@ -61,12 +61,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Tile # - + Numer Kafelka Palette # - + Numer Palety @@ -129,7 +129,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Gate type - + Typ bramki @@ -139,7 +139,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Chip ID - ID chipu + ID Chipu @@ -162,7 +162,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Add New Code - + Dodaj Nowy Kody @@ -172,12 +172,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Add Lines - + Dodaj Linie Code type - + Typ kodu @@ -187,12 +187,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Load - Wgraj + Wczytaj Enter codes here... - + Wpisz kody tutaj... @@ -218,12 +218,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Connect to Dolphin - + Połącz z Dolphinem Local computer - + Komputer lokalny @@ -248,7 +248,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Reset on connect - + Zresetuj przy połączeniu @@ -256,7 +256,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Inspect frame - + Sprawdź klatkę @@ -266,7 +266,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Freeze frame - + Stopklatka @@ -276,7 +276,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Disable scanline effects - + Wyłącz efekty linii skanowania @@ -334,7 +334,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Frameskip - + Klatkowanie @@ -342,7 +342,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. I/O Viewer - + Podgląd We/Wy @@ -389,7 +389,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. %1 State - + %1 Stan @@ -402,7 +402,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. No Save - + Brak Zapisu @@ -528,7 +528,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Magnification - Powiększenie + Powiększenie @@ -546,7 +546,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Save Memory Range - + Zapisz Zakres Pamięci @@ -561,7 +561,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Dump across banks - + Zrzuć pomiędzy bankami @@ -569,7 +569,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Memory Search - + Przeszukaj Pamięć @@ -595,43 +595,43 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Numeric - + Numeryczne Text - + Tekstowe Width - + Szerokość Guess - + Zgdanij 1 Byte (8-bit) - + 1 Bajt (8-bitów) 2 Bytes (16-bit) - + 2 Bajty (16-bitów) 4 Bytes (32-bit) - + 4 Bajty (32-bity) Number type - + Typ numeru @@ -671,7 +671,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Changed by value - + Zmienione według wartości @@ -724,7 +724,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Inspect Address: - + Zbadaj Adres: @@ -789,7 +789,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Load - Wgraj + Wczytaj @@ -857,7 +857,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Transform - + Przekształć @@ -867,66 +867,66 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Palette - + Paleta Double Size - + Podwójny Rozmiar Return, Ctrl+R - + Return, Ctrl+R Flipped - + Odwrócony H Short for horizontal - + Po V Short for vertical - + Pi Mode - + Tryb Normal - + Normalna Mosaic - + Mozaika Enabled - + Włączony Priority - + Priorytet Tile - + Płytka @@ -934,12 +934,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Game Overrides - + Nadpisania Gry Game Boy Advance - + Game Boy Advance @@ -947,122 +947,122 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Autodetect - + Automatyczne wykrywanie Realtime clock - + Zegar czasu rzeczywistego Gyroscope - + Żyroskop Tilt - + Przechylenie Light sensor - + Czujnik światła Rumble - + Wibracje Save type - + Typ zapisu None - + Nic SRAM - + SRAM Flash 512kb - + Flash 512kb Flash 1Mb - + Flash 1Mb EEPROM 8kB - + EEPROM 8kB EEPROM 512 bytes - + EEPROM 512 bytes SRAM 64kB (bootlegs only) - + SRAM 64kB (tylko bootlegi) Idle loop - + Pętla bezczynności Game Boy Player features - + Funkcje Game Boy Player VBA bug compatibility mode - + Tryb zgodności błędów VBA Game Boy - + Game Boy Game Boy model - + Model Game Boy Memory bank controller - + Kontroler banku pamięci Background Colors - + Kolory Tła Sprite Colors 1 - + Kolory Sprite 1 Sprite Colors 2 - + Kolory Sprite 2 Palette preset - + Ustawienia palety @@ -1070,62 +1070,62 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Palette - + Paleta Background - + Tło Objects - + Obiekty Selection - + Wybór Red - Czerwony + Czerwony Green - Zielony + Zielony Blue - Niebieski + Niebieski 16-bit value - + 16-bitowa wartość Hex code - + Kod szesnastkowy Palette index - + Indeks palet Export BG - + Eksportuj Tło Export OBJ - + Eksportuj OBI @@ -1133,27 +1133,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Adjust placement - + Dostosuj położenie All - + Wszystkie Offset - + Offset X - + X Y - + Y @@ -1161,22 +1161,22 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Game Boy Printer - + Game Boy Printer Hurry up! - + Pośpiesz się! Tear off - + Oderwij Magnification - Powiększenie + Powiększenie @@ -1217,22 +1217,24 @@ Auto-update is not available on this platform. If you wish to update you will ne Current version: %1 New version: %2 Download size: %3 - + Obecna wersja: %1 +Nowa wersja: %2 +Rozmiar pobierania: %3 Downloading update... - + Pobieranie aktualizacji... Downloading failed. Please update manually. - + Pobieranie nie powiodło się. Proszę zaktualizować ręcznie. Downloading done. Press OK to restart %1 and install the update. - + Pobieranie zakończone. Naciśnij OK, aby ponownie uruchomić %1 i zainstalować aktualizację. @@ -1240,22 +1242,22 @@ Download size: %3 Stable - + Stabilna Development - + Rozwojowa Unknown - + Nieznana (None) - + (Nic) @@ -1292,13 +1294,13 @@ Download size: %3 Autodetect (recommended) - + Automatyczne wykrywanie (zalecane) Select cheats file - + Wybierz plik z kodami @@ -1306,27 +1308,27 @@ Download size: %3 Failed to open save file: %1 - + Nie udało się otworzyć pliku zapisu: %1 Failed to open game file: %1 - + Nie udało się otworzyć pliku gry: %1 Can't yank pack in unexpected platform! - + Nie można wyciągnąć pack na nieoczekiwanej platformie! Failed to open snapshot file for reading: %1 - + Nie udało się otworzyć pliku snapshot do odczytu: %1 Failed to open snapshot file for writing: %1 - + Nie udało się otworzyć pliku snapshot do zapisu: %1 @@ -1334,12 +1336,12 @@ Download size: %3 Failed to open game file: %1 - + Nie udało się otworzyć pliku gry: %1 Could not load game. Are you sure it's in the correct format? - + Nie udało się wczytać gry. Czy na pewno jest we właściwym formacie? @@ -1352,47 +1354,47 @@ Download size: %3 Export frame - + Eksportuj klatkę Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) None - + Nic Background - + Tło Window - + Okno Objwin - + Obiwin Sprite - + Sprite Backdrop - + Zasłona Frame - + Klatka @@ -1405,7 +1407,7 @@ Download size: %3 Enable Discord Rich Presence - + Włącz Discord Rich Presence @@ -1413,12 +1415,12 @@ Download size: %3 Clear Button - + Wyczyść Przycisk Clear Analog - + Wyczyść Analog @@ -1428,7 +1430,7 @@ Download size: %3 Set all - + Ustaw wszystko @@ -1436,17 +1438,17 @@ Download size: %3 Server settings - + Ustawienia serwera Local port - + Port lokalny Bind address - + Adres powiązania @@ -1461,17 +1463,17 @@ Download size: %3 Start - + Start Crash - + Crash Could not start GDB server - + Nie można uruchomić serwera GDB @@ -1479,17 +1481,17 @@ Download size: %3 Failed to open output file: %1 - + Nie udało się otworzyć pliku wyjściowego: %1 Select output file - + Wybierz plik wyjściowy Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) - + Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) @@ -1497,147 +1499,147 @@ Download size: %3 Background mode - + Tryb tła Mode 0: 4 tile layers - + Tryb 0: 4 warstwy płytek Mode 1: 2 tile layers + 1 rotated/scaled tile layer - + Tryb 1: 2 warstwy płytek + 1 obrócona/przeskalowana warstwa płytek Mode 2: 2 rotated/scaled tile layers - + Tryb 2: 2 obrócone/przeskalowane warstwy płytek Mode 3: Full 15-bit bitmap - + Tryb 3: Pełna 15-bitowa mapa bitowa Mode 4: Full 8-bit bitmap - + Tryb 4: Pełna 8-bitowa mapa bitowa Mode 5: Small 15-bit bitmap - + Tryb 5: Mała 15-bitowa mapa bitowa CGB Mode - + Tryb CGB Frame select - + Wybór klatki Unlocked HBlank - + Odblokowany HBlank Linear OBJ tile mapping - + Liniowe mapowanie kafelków OBI Force blank screen - + Wymuś pusty ekran Enable background 0 - + Włącz tło 0 Enable background 1 - + Włącz tło 1 Enable background 2 - + Włącz tło 2 Enable background 3 - + Włącz tło 3 Enable OBJ - + Włącz OBI Enable Window 0 - + Włącz Okno 0 Enable Window 1 - + Włącz Okno 1 Enable OBJ Window - + Włącz Okno OBI Swap green components - + Zamień zielone komponenty Currently in VBlank - + Obecnie w VBlank Currently in HBlank - + Obecnie w HBlank Currently in VCounter - + Obecnie w VCounter Enable VBlank IRQ generation - + Włącz generowanie IRQ VBlank Enable HBlank IRQ generation - + Włącz generowanie IRQ HBlank Enable VCounter IRQ generation - + Włącz generowanie IRQ VCounter VCounter scanline - + Linia skanowania VCounter Current scanline - + Bieżąca linia skanowania @@ -1645,7 +1647,7 @@ Download size: %3 Priority - + Priorytet @@ -1653,7 +1655,7 @@ Download size: %3 Tile data base (* 16kB) - + Baza danych płytek (* 16kB) @@ -1661,7 +1663,7 @@ Download size: %3 Enable mosaic - + Włącz mozaikę @@ -1669,7 +1671,7 @@ Download size: %3 Enable 256-color - + Włącz 256-kolorów @@ -1677,7 +1679,7 @@ Download size: %3 Tile map base (* 2kB) - + Baza mapy płytek (* 2kB) @@ -1685,13 +1687,13 @@ Download size: %3 Background dimensions - + Wymiary tła Overflow wraps - + Zawijanie Przelewowe From 1644132ce7079f8e23dbf69540b641f99e5b346c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20B=C4=99d=C5=BAkowski?= Date: Tue, 4 Jan 2022 21:29:58 +0000 Subject: [PATCH 49/59] Qt: Update translation (Polish) Translation: mGBA/Qt Translate-URL: https://hosted.weblate.org/projects/mgba/mgba-qt/pl/ --- src/platform/qt/ts/mgba-pl.ts | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index b701ba8be..e4300e0fa 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -27,12 +27,13 @@ © 2013 – {year} Jeffrey Pfau, licensed under the Mozilla Public License, version 2.0 Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - + © 2013 – {year} Jeffrey Pfau, licencja Mozilla Public License, wersja 2.0 +Game Boy Advance jest zarejestrowanym znakiem towarowym Nintendo Co., Ltd. {projectName} is an open-source Game Boy Advance emulator - + {projectName} jest emulatorem konsoli Game Boy Advance, o otwartym kodzie źródłowym @@ -99,12 +100,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Chip name - + Nazwa chipu Insert - + Umieść @@ -134,7 +135,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Inserted - + Umieszczone @@ -157,7 +158,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Cheats - + Kody (cheaty) @@ -299,12 +300,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Loop - + Zapętl Start - + Start @@ -729,7 +730,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Set Alignment: - + Wyrównaj: @@ -749,22 +750,22 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Unsigned Integer: - + Całkowita, bez znaku: Signed Integer: - + Całkowita, ze znakiem: String: - + Łańcuch znaków (string): Load TBL - + Załaduj TBL @@ -797,7 +798,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Sprites - + Sprite'y @@ -1285,7 +1286,7 @@ Rozmiar pobierania: %3 Failed to open cheats file: %1 - + Błąd przy otwieraniu pliku z kodami: %1 From 54f89fec1edab1b547cbde87439f107d0b11420a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 10 Jan 2022 12:21:28 -0800 Subject: [PATCH 50/59] CMake: Add missing compile definitions to updater-stub --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2945a754f..dac307a69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -933,6 +933,7 @@ endif() if(BUILD_UPDATER) add_executable(updater-stub WIN32 ${CMAKE_CURRENT_SOURCE_DIR}/src/feature/updater-main.c) target_link_libraries(updater-stub ${OS_LIB} ${PLATFORM_LIBRARY} ${BINARY_NAME}) + set_target_properties(updater-stub PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FUNCTION_DEFINES}") if(MSVC) set_target_properties(updater-stub PROPERTIES LINK_FLAGS /ENTRY:mainCRTStartup) else() From eef3b5a57c458bd1c17abb3e5ccba2167dac986d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 10 Jan 2022 13:06:03 -0800 Subject: [PATCH 51/59] Qt: Begin adding control info to report view --- src/platform/qt/ReportView.cpp | 28 ++++++++++++++++++++++++++++ src/platform/qt/ReportView.h | 1 + src/platform/qt/Window.h | 2 ++ 3 files changed, 31 insertions(+) diff --git a/src/platform/qt/ReportView.cpp b/src/platform/qt/ReportView.cpp index 737247eba..edfddd21c 100644 --- a/src/platform/qt/ReportView.cpp +++ b/src/platform/qt/ReportView.cpp @@ -195,6 +195,10 @@ void ReportView::generateReport() { addGLInfo(hwReport); addReport(QString("Hardware info"), hwReport.join('\n')); + QStringList controlsReport; + addGamepadInfo(controlsReport); + addReport(QString("Controls"), controlsReport.join('\n')); + QList screens = QGuiApplication::screens(); std::sort(screens.begin(), screens.end(), [](const QScreen* a, const QScreen* b) { if (a->geometry().y() < b->geometry().y()) { @@ -288,6 +292,10 @@ void ReportView::generateReport() { } else { windowReport << QString("ROM open: No"); } +#ifdef BUILD_SDL + InputController* input = window->inputController(); + windowReport << QString("Active gamepad: %1").arg(input->gamepad(SDL_BINDING_BUTTON)); +#endif windowReport << QString("Configuration: %1").arg(configs.indexOf(config) + 1); addReport(QString("Window %1").arg(winId), windowReport.join('\n')); } @@ -446,6 +454,26 @@ void ReportView::addGLInfo(QStringList& report) { #endif } +void ReportView::addGamepadInfo(QStringList& report) { +#ifdef BUILD_SDL + InputController* input = GBAApp::app()->windows()[0]->inputController(); + QStringList gamepads = input->connectedGamepads(SDL_BINDING_BUTTON); + report << QString("Connected gamepads: %1").arg(gamepads.size()); + int i = 0; + for (const auto& gamepad : gamepads) { + report << QString("Gamepad %1: %2").arg(i).arg(gamepad); + ++i; + } + if (gamepads.size()) { + i = 0; + for (Window* window : GBAApp::app()->windows()) { + ++i; + report << QString("Window %1 gamepad: %2").arg(i).arg(window->inputController()->gamepad(SDL_BINDING_BUTTON)); + } + } +#endif +} + void ReportView::addROMInfo(QStringList& report, CoreController* controller) { report << QString("Currently paused: %1").arg(yesNo[controller->isPaused()]); diff --git a/src/platform/qt/ReportView.h b/src/platform/qt/ReportView.h index 1066dab7d..daa4b9294 100644 --- a/src/platform/qt/ReportView.h +++ b/src/platform/qt/ReportView.h @@ -41,6 +41,7 @@ protected: private: void addCpuInfo(QStringList&); void addGLInfo(QStringList&); + void addGamepadInfo(QStringList&); void addROMInfo(QStringList&, CoreController*); void addScreenInfo(QStringList&, const QScreen*); diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index a99a882b5..082d69236 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -66,6 +66,8 @@ public: void updateMultiplayerStatus(bool canOpenAnother); void updateMultiplayerActive(bool active); + InputController* inputController() { return &m_inputController; } + signals: void startDrawing(); void shutdown(); From a9ef7af3b1319643e853e9909a5b5c4c30089edc Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 10 Jan 2022 13:55:13 -0800 Subject: [PATCH 52/59] GBA BIOS: Change fix for #1059 to break fewer games --- src/gba/bios.c | 2 +- src/gba/hle-bios.c | 18 +++++++++--------- src/gba/hle-bios.s | 38 +++++++++++++++++++------------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/gba/bios.c b/src/gba/bios.c index 171b09ec9..05782c39d 100644 --- a/src/gba/bios.c +++ b/src/gba/bios.c @@ -428,7 +428,7 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { switch (immediate) { case 0xF0: // Used for internal stall counting - cpu->gprs[12] = gba->biosStall; + cpu->gprs[11] = gba->biosStall; return; case 0xFA: GBAPrintFlush(gba); diff --git a/src/gba/hle-bios.c b/src/gba/hle-bios.c index 9ee6dd5b1..da4e07111 100644 --- a/src/gba/hle-bios.c +++ b/src/gba/hle-bios.c @@ -9,17 +9,17 @@ const uint8_t hleBios[SIZE_BIOS] = { 0x03, 0x10, 0xd0, 0xe5, 0xea, 0x00, 0x51, 0xe3, 0x4c, 0x01, 0x9f, 0x15, 0x10, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x29, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe3, 0x01, 0xd3, 0xa0, 0x03, - 0x20, 0xd0, 0x4d, 0x02, 0x10, 0x50, 0x2d, 0xe9, 0x02, 0x40, 0x5e, 0xe5, - 0xd4, 0xc0, 0xa0, 0xe3, 0x04, 0x41, 0x9c, 0xe7, 0xd2, 0xcf, 0xa0, 0xe3, - 0x04, 0x00, 0x5c, 0xe1, 0x00, 0xc0, 0x4f, 0xe1, 0x00, 0x10, 0x2d, 0xe9, - 0x80, 0xc0, 0x0c, 0xe2, 0x1f, 0xc0, 0x8c, 0xe3, 0x0c, 0xf0, 0x21, 0xe1, - 0x00, 0x00, 0xf0, 0x0f, 0x04, 0x40, 0x2d, 0xe9, 0x00, 0x00, 0x54, 0xe3, + 0x20, 0xd0, 0x4d, 0x02, 0x00, 0x58, 0x2d, 0xe9, 0x02, 0xc0, 0x5e, 0xe5, + 0xd4, 0xb0, 0xa0, 0xe3, 0x0c, 0xc1, 0x9b, 0xe7, 0xd2, 0xbf, 0xa0, 0xe3, + 0x0c, 0x00, 0x5b, 0xe1, 0x00, 0xb0, 0x4f, 0xe1, 0x00, 0x08, 0x2d, 0xe9, + 0x80, 0xb0, 0x0b, 0xe2, 0x1f, 0xb0, 0x8b, 0xe3, 0x0b, 0xf0, 0x21, 0xe1, + 0x00, 0x00, 0xf0, 0x0f, 0x04, 0x40, 0x2d, 0xe9, 0x00, 0x00, 0x5c, 0xe3, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, - 0x0f, 0xe0, 0xa0, 0xe1, 0x14, 0xff, 0x2f, 0x11, 0x00, 0x00, 0xa0, 0xe1, + 0x0f, 0xe0, 0xa0, 0x11, 0x1c, 0xff, 0x2f, 0x11, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, 0x04, 0x40, 0xbd, 0xe8, - 0x93, 0xf0, 0x29, 0xe3, 0x00, 0x10, 0xbd, 0xe8, 0x0c, 0xf0, 0x69, 0xe1, - 0x10, 0x50, 0xbd, 0xe8, 0x0e, 0xf0, 0xb0, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x93, 0xf0, 0x29, 0xe3, 0x00, 0x08, 0xbd, 0xe8, 0x0b, 0xf0, 0x69, 0xe1, + 0x00, 0x58, 0xbd, 0xe8, 0x0e, 0xf0, 0xb0, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0xa0, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0x48, 0x03, 0x00, 0x00, @@ -73,5 +73,5 @@ const uint8_t hleBios[SIZE_BIOS] = { 0x01, 0xa0, 0xa0, 0xe1, 0xfa, 0x07, 0xa0, 0xe8, 0xfa, 0x07, 0xa0, 0xe8, 0xfa, 0x07, 0xa0, 0xe8, 0xfa, 0x07, 0xa0, 0xe8, 0x00, 0x10, 0xa0, 0xe3, 0xf0, 0x07, 0xbd, 0xe8, 0x1e, 0xff, 0x2f, 0xe1, 0xb0, 0x01, 0x00, 0x00, - 0x04, 0xc0, 0x5c, 0xe2, 0xfd, 0xff, 0xff, 0x8a, 0x1e, 0xff, 0x2f, 0xe1 + 0x04, 0xb0, 0x5b, 0xe2, 0xfd, 0xff, 0xff, 0x8a, 0x1e, 0xff, 0x2f, 0xe1 }; diff --git a/src/gba/hle-bios.s b/src/gba/hle-bios.s index be0d81703..52d5c88dc 100644 --- a/src/gba/hle-bios.s +++ b/src/gba/hle-bios.s @@ -31,36 +31,36 @@ swiBase: cmp sp, #0 moveq sp, #0x04000000 subeq sp, #0x20 -stmfd sp!, {r4, r12, lr} -ldrb r4, [lr, #-2] -mov r12, #swiTable -ldr r4, [r12, r4, lsl #2] -mov r12, #StallCall -cmp r12, r4 -mrs r12, spsr -stmfd sp!, {r12} -and r12, #0x80 -orr r12, #0x1F -msr cpsr_c, r12 -swieq 0xF00000 @ Special mGBA-internal call to load the stall count into r12 +stmfd sp!, {r11, r12, lr} +ldrb r12, [lr, #-2] +mov r11, #swiTable +ldr r12, [r11, r12, lsl #2] +mov r11, #StallCall +cmp r11, r12 +mrs r11, spsr +stmfd sp!, {r11} +and r11, #0x80 +orr r11, #0x1F +msr cpsr_c, r11 +swieq 0xF00000 @ Special mGBA-internal call to load the stall count into r11 stmfd sp!, {r2, lr} -cmp r4, #0 +cmp r12, #0 nop nop nop nop nop nop -mov lr, pc -bxne r4 +movne lr, pc +bxne r12 nop nop nop ldmfd sp!, {r2, lr} msr cpsr, #0x93 -ldmfd sp!, {r12} -msr spsr, r12 -ldmfd sp!, {r4, r12, lr} +ldmfd sp!, {r11} +msr spsr, r11 +ldmfd sp!, {r11, r12, lr} movs pc, lr .word 0 .word 0xE3A02004 @@ -310,6 +310,6 @@ ArcTan: ArcTan2: StallCall: -subs r12, #4 +subs r11, #4 bhi StallCall bx lr From e9ff76c97b15b8288f185947587ea0271f475ad5 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 13 Jan 2022 15:41:17 -0800 Subject: [PATCH 53/59] OpenGL: Allow mGLES2Context to draw to a framebuffer --- src/platform/opengl/gles2.c | 26 ++++++++++++++++++++++---- src/platform/opengl/gles2.h | 1 + 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/platform/opengl/gles2.c b/src/platform/opengl/gles2.c index 14f0db18b..4c01fd3f0 100644 --- a/src/platform/opengl/gles2.c +++ b/src/platform/opengl/gles2.c @@ -235,13 +235,15 @@ static void mGLES2ContextResized(struct VideoBackend* v, unsigned w, unsigned h) context->shaders[n].dirty = true; } } - glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindTexture(GL_TEXTURE_2D, context->finalShader.tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, drawW, drawH, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); + glBindFramebuffer(GL_FRAMEBUFFER, context->finalShader.fbo); glViewport((w - drawW) / 2, (h - drawH) / 2, drawW, drawH); } static void mGLES2ContextClear(struct VideoBackend* v) { - UNUSED(v); - glBindFramebuffer(GL_FRAMEBUFFER, 0); + struct mGLES2Context* context = (struct mGLES2Context*) v; + glBindFramebuffer(GL_FRAMEBUFFER, context->finalShader.fbo); glClearColor(0.f, 0.f, 0.f, 1.f); glClear(GL_COLOR_BUFFER_BIT); } @@ -277,7 +279,7 @@ void _drawShader(struct mGLES2Context* context, struct mGLES2Shader* shader) { GLint oldTex; glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTex); glBindTexture(GL_TEXTURE_2D, shader->tex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, drawW, drawH, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, drawW + padW * 2, drawH + padH * 2, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_2D, oldTex); } shader->dirty = false; @@ -434,6 +436,22 @@ void mGLES2ContextCreate(struct mGLES2Context* context) { context->nShaders = 0; } +void mGLES2ContextUseFramebuffer(struct mGLES2Context* context) { + glGenFramebuffers(1, &context->finalShader.fbo); + glGenTextures(1, &context->finalShader.tex); + + glBindTexture(GL_TEXTURE_2D, context->finalShader.tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + + glBindFramebuffer(GL_FRAMEBUFFER, context->finalShader.fbo); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context->finalShader.tex, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + void mGLES2ShaderInit(struct mGLES2Shader* shader, const char* vs, const char* fs, int width, int height, bool integerScaling, struct mGLES2Uniform* uniforms, size_t nUniforms) { shader->width = width; shader->height = height; diff --git a/src/platform/opengl/gles2.h b/src/platform/opengl/gles2.h index 4f9f504f5..31a2d3e2a 100644 --- a/src/platform/opengl/gles2.h +++ b/src/platform/opengl/gles2.h @@ -92,6 +92,7 @@ struct mGLES2Context { }; void mGLES2ContextCreate(struct mGLES2Context*); +void mGLES2ContextUseFramebuffer(struct mGLES2Context*); void mGLES2ShaderInit(struct mGLES2Shader*, const char* vs, const char* fs, int width, int height, bool integerScaling, struct mGLES2Uniform* uniforms, size_t nUniforms); void mGLES2ShaderDeinit(struct mGLES2Shader*); From ca0cfa077e06749ecf04ec281906bebc1ad359a8 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 13 Jan 2022 16:29:42 -0800 Subject: [PATCH 54/59] CMake: Clean up ref names in git branch string (fixes #2421) --- version.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/version.cmake b/version.cmake index 7432553dd..d199e3410 100644 --- a/version.cmake +++ b/version.cmake @@ -15,6 +15,8 @@ if(GIT AND NOT SKIP_GIT) execute_process(COMMAND ${GIT} symbolic-ref --short HEAD WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_BRANCH ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND ${GIT} rev-list HEAD --count WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_REV ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND ${GIT} describe --tag --exact-match WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE GIT_TAG ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + + string(REGEX REPLACE "^(refs/)?(heads|tags)/" "" GIT_BRANCH "${GIT_BRANCH}") endif() if(NOT GIT_REV) From 70f75bba49f7a6128a9c222293ec7915a2d3548d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 13 Jan 2022 17:19:05 -0800 Subject: [PATCH 55/59] GB Video: Draw SGB border pieces that overlap GB graphics (fixes #1339) --- CHANGES | 1 + include/mgba/internal/gb/renderers/software.h | 1 + src/gb/renderers/software.c | 88 ++++++++++++++++--- 3 files changed, 77 insertions(+), 13 deletions(-) diff --git a/CHANGES b/CHANGES index 1f39c97b1..3460772c3 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,7 @@ Features: Emulation fixes: - ARM7: Fix unsigned multiply timing - GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032) + - GB Video: Draw SGB border pieces that overlap GB graphics (fixes mgba.io/i/1339) - GBA: Improve timing when not booting from BIOS - GBA BIOS: Work around IRQ handling hiccup in Mario & Luigi (fixes mgba.io/i/1059) - GBA I/O: Redo internal key input, enabling edge-based key IRQs diff --git a/include/mgba/internal/gb/renderers/software.h b/include/mgba/internal/gb/renderers/software.h index 57942a7dc..c61f2270d 100644 --- a/include/mgba/internal/gb/renderers/software.h +++ b/include/mgba/internal/gb/renderers/software.h @@ -60,6 +60,7 @@ struct GBVideoSoftwareRenderer { uint8_t sgbPacket[128]; uint8_t sgbCommandHeader; bool sgbBorders; + uint32_t sgbBorderMask[18]; uint8_t lastHighlightAmount; }; diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index f6489388b..a5e41162f 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -64,37 +64,58 @@ static void _regenerateSGBBorder(struct GBVideoSoftwareRenderer* renderer) { } int x, y; for (y = 0; y < 224; ++y) { + int localY = y & 0x7; + if (!localY && y >= 40 && y < 184) { + renderer->sgbBorderMask[(y - 40) >> 3] = 0; + } for (x = 0; x < 256; x += 8) { - if (x >= 48 && x < 208 && y >= 40 && y < 184) { - continue; - } uint16_t mapData; LOAD_16LE(mapData, (x >> 2) + (y & ~7) * 8, renderer->d.sgbMapRam); if (UNLIKELY(SGBBgAttributesGetTile(mapData) >= 0x100)) { continue; } - int localY = y & 0x7; - if (SGBBgAttributesIsYFlip(mapData)) { - localY = 7 - localY; + if (x >= 48 && x < 208 && y >= 40 && y < 184) { + if (!localY) { + unsigned tileBase = SGBBgAttributesGetTile(mapData) * 8; + uint32_t bits = 0; + bits |= ((uint32_t*) renderer->d.sgbCharRam)[tileBase + 0]; + bits |= ((uint32_t*) renderer->d.sgbCharRam)[tileBase + 1]; + bits |= ((uint32_t*) renderer->d.sgbCharRam)[tileBase + 2]; + bits |= ((uint32_t*) renderer->d.sgbCharRam)[tileBase + 3]; + bits |= ((uint32_t*) renderer->d.sgbCharRam)[tileBase + 4]; + bits |= ((uint32_t*) renderer->d.sgbCharRam)[tileBase + 5]; + bits |= ((uint32_t*) renderer->d.sgbCharRam)[tileBase + 6]; + bits |= ((uint32_t*) renderer->d.sgbCharRam)[tileBase + 7]; + if (bits) { + renderer->sgbBorderMask[(y - 40) >> 3] |= 1 << ((x - 48) >> 3); + } + } + continue; } + + int yFlip = 0; + if (SGBBgAttributesIsYFlip(mapData)) { + yFlip = 7; + } + unsigned tileBase = (SGBBgAttributesGetTile(mapData) * 16 + (localY ^ yFlip)) * 2; uint8_t tileData[4]; - tileData[0] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x00]; - tileData[1] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x01]; - tileData[2] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x10]; - tileData[3] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x11]; + tileData[0] = renderer->d.sgbCharRam[tileBase + 0x00]; + tileData[1] = renderer->d.sgbCharRam[tileBase + 0x01]; + tileData[2] = renderer->d.sgbCharRam[tileBase + 0x10]; + tileData[3] = renderer->d.sgbCharRam[tileBase + 0x11]; size_t base = y * renderer->outputBufferStride + x; int paletteBase = SGBBgAttributesGetPalette(mapData) * 0x10; int colorSelector; - int flip = 0; + int xFlip = 0; if (SGBBgAttributesIsXFlip(mapData)) { - flip = 7; + xFlip = 7; } for (i = 7; i >= 0; --i) { colorSelector = (tileData[0] >> i & 0x1) << 0 | (tileData[1] >> i & 0x1) << 1 | (tileData[2] >> i & 0x1) << 2 | (tileData[3] >> i & 0x1) << 3; - renderer->outputBuffer[(base + 7 - i) ^ flip] = renderer->palette[paletteBase | colorSelector]; + renderer->outputBuffer[(base + 7 - i) ^ xFlip] = renderer->palette[paletteBase | colorSelector]; } } } @@ -233,6 +254,7 @@ static void GBVideoSoftwareRendererInit(struct GBVideoRenderer* renderer, enum G } memset(softwareRenderer->palette, 0, sizeof(softwareRenderer->palette)); + memset(softwareRenderer->sgbBorderMask, 0, sizeof(softwareRenderer->sgbBorderMask)); softwareRenderer->lastHighlightAmount = 0; } @@ -667,6 +689,46 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i for (; x < endX; ++x) { row[x] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x] & OBJ_PRIO_MASK]]; } + if (softwareRenderer->sgbBorderMask[y >> 3]) { + uint32_t borderMask = softwareRenderer->sgbBorderMask[y >> 3]; + int localY = y & 0x7; + for (x = startX; x < endX; x += 8) { + if (!(borderMask & (1 << (x >> 3)))) { + continue; + } + uint16_t mapData; + LOAD_16LE(mapData, (x >> 2) + 12 + (y & ~7) * 8 + 320, softwareRenderer->d.sgbMapRam); + if (UNLIKELY(SGBBgAttributesGetTile(mapData) >= 0x100)) { + continue; + } + + int yFlip = 0; + if (SGBBgAttributesIsYFlip(mapData)) { + yFlip = 7; + } + unsigned tileBase = (SGBBgAttributesGetTile(mapData) * 16 + (localY ^ yFlip)) * 2; + uint8_t tileData[4]; + tileData[0] = softwareRenderer->d.sgbCharRam[tileBase + 0x00]; + tileData[1] = softwareRenderer->d.sgbCharRam[tileBase + 0x01]; + tileData[2] = softwareRenderer->d.sgbCharRam[tileBase + 0x10]; + tileData[3] = softwareRenderer->d.sgbCharRam[tileBase + 0x11]; + + int paletteBase = SGBBgAttributesGetPalette(mapData) * 0x10; + int colorSelector; + + int flip = 0; + if (SGBBgAttributesIsXFlip(mapData)) { + flip = 7; + } + int i; + for (i = 7; i >= 0; --i) { + colorSelector = (tileData[0] >> i & 0x1) << 0 | (tileData[1] >> i & 0x1) << 1 | (tileData[2] >> i & 0x1) << 2 | (tileData[3] >> i & 0x1) << 3; + if (colorSelector) { + row[(x + 7 - i) ^ flip] = softwareRenderer->palette[paletteBase | colorSelector]; + } + } + } + } break; case 1: break; From 881dd11bf2f805db6d4b7a6dfc4366bfd223b3dd Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 13 Jan 2022 21:51:23 -0800 Subject: [PATCH 56/59] GB Video: Add default SGB border --- CHANGES | 1 + res/sgb-border.png | Bin 0 -> 582 bytes src/gb/video.c | 249 +++++++++++++++++++++++++++++++++++++++++++++ tools/snes-tile.py | 76 ++++++++++++++ 4 files changed, 326 insertions(+) create mode 100644 res/sgb-border.png create mode 100644 tools/snes-tile.py diff --git a/CHANGES b/CHANGES index 3460772c3..69160760c 100644 --- a/CHANGES +++ b/CHANGES @@ -25,6 +25,7 @@ Other fixes: - FFmpeg: Fix crash when encoding audio with some containers Misc: - Core: Suspend runloop when a core crashes + - GB Video: Add default SGB border - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) - Qt: Rearrange menus some - Qt: Clean up cheats dialog diff --git a/res/sgb-border.png b/res/sgb-border.png new file mode 100644 index 0000000000000000000000000000000000000000..4482b846dab651078ece54d699a885ab72a1adee GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K59&j)N$=mZil7JLrage(c!@6@aFM%Az0G|+7 zApPOP40t<%%4TFH^c~d8Ybe0791v5B2yO9QDAM5LA@7KX~e&{+0dvJ~X)%a5dB&f8)6Q^|q;( za%S$Uob^Mr*m&j)+m&mVo!`Ag#s*>_f^68q5W9niahKkz1ELRKd9>&P$`L^Na> zu`|DLV>ssK)lkH8ppj9|FQ4IR`y=h%wT!i`r_I9lOsT5*i tSa8z)VZwXnL(EUEzkk2hfPvxQXJ(79o-38LO!tGV@^tlcS?83{1OWFvm%;!5 literal 0 HcmV?d00001 diff --git a/src/gb/video.c b/src/gb/video.c index 98c83da4b..e4059a3e1 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -40,6 +40,246 @@ static void _endMode2(struct mTiming* timing, void* context, uint32_t cyclesLate static void _endMode3(struct mTiming* timing, void* context, uint32_t cyclesLate); static void _updateFrameCount(struct mTiming* timing, void* context, uint32_t cyclesLate); +static const uint16_t _defaultBorderPalette[16] = { + 0x0000, + 0x7FDE, + 0x7FFF, + 0x739A, + 0x2929, + 0x24E7, + 0x1CC6, + 0x0400, + 0x514A, + 0x3907, + 0x28C5, +}; + +static const uint8_t _defaultBorderTilemap[] = { + 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, + 0x12, 0x10, 0x14, 0x10, 0x16, 0x10, 0x17, 0x10, 0x17, 0x10, 0x17, 0x10, 0x17, 0x10, 0x17, 0x10, + 0x17, 0x10, 0x17, 0x10, 0x17, 0x10, 0x17, 0x10, 0x17, 0x10, 0x16, 0x50, 0x14, 0x10, 0x12, 0x50, + 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, + 0x02, 0x10, 0x06, 0x10, 0x0A, 0x10, 0x0D, 0x10, 0x0E, 0x10, 0x0F, 0x10, 0x10, 0x10, 0x11, 0x10, + 0x13, 0x10, 0x15, 0x10, 0x15, 0x10, 0x18, 0x10, 0x1B, 0x10, 0x1B, 0x10, 0x1B, 0x10, 0x1B, 0x10, + 0x1B, 0x10, 0x1B, 0x10, 0x1B, 0x10, 0x1B, 0x10, 0x18, 0x50, 0x15, 0x10, 0x15, 0x10, 0x13, 0x10, + 0x11, 0x10, 0x10, 0x50, 0x0F, 0x50, 0x0E, 0x50, 0x0D, 0x50, 0x0A, 0x50, 0x06, 0x50, 0x02, 0x50, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x04, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, + 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, + 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, + 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x07, 0x10, 0x04, 0x50, + 0x05, 0x10, 0x08, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, + 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, + 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, + 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x0B, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x05, 0x10, 0x09, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, + 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, + 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, + 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x05, 0x50, + 0x04, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, + 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x1F, 0x10, 0x23, 0x10, 0x23, 0x10, + 0x23, 0x10, 0x23, 0x10, 0x23, 0x10, 0x23, 0x10, 0x34, 0x10, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, + 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x07, 0x90, 0x04, 0xD0, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x19, 0x10, 0x1C, 0x10, 0x20, 0x10, 0x24, 0x10, 0x26, 0x10, + 0x29, 0x10, 0x2B, 0x10, 0x2E, 0x10, 0x31, 0x10, 0x35, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x1A, 0x10, 0x1D, 0x10, 0x21, 0x10, 0x25, 0x10, 0x27, 0x10, + 0x2A, 0x10, 0x2C, 0x10, 0x2F, 0x10, 0x32, 0x10, 0x1A, 0x50, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x19, 0x90, 0x1E, 0x10, 0x22, 0x10, 0x1C, 0x90, 0x28, 0x10, + 0x1C, 0x90, 0x2D, 0x10, 0x30, 0x10, 0x33, 0x10, 0x19, 0xD0, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, + 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, 0x03, 0x10, +}; + +static const uint8_t _defaultBorderChardata[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0x00, 0xFF, 0x03, 0xFC, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x03, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x3F, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0x7F, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x1F, 0x00, 0x7E, 0x80, 0x01, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFC, 0x03, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0xF8, 0x07, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x07, 0xF8, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3F, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0xC0, 0x3F, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x07, 0xFF, 0x0F, 0xFF, 0x0F, 0xFF, 0x0F, 0xFE, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0x0F, 0xFE, 0x0F, 0xFE, 0x0F, 0xFE, 0x0F, 0xFE, 0x0F, 0xFE, 0x0F, 0xFE, 0x0F, 0xFE, 0x0F, 0xFE, + 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0xFF, 0x00, 0xFF, 0x19, 0xFF, 0x19, 0xFF, 0x19, 0xFF, 0x19, 0xFF, 0x19, 0xFF, 0x19, 0xFF, 0x19, + 0x00, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, + 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x19, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x0F, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x1F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFC, 0x1F, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0x1C, + 0xFF, 0x00, 0xFF, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x1C, 0x00, + 0xFF, 0x1C, 0xFF, 0x9C, 0xFF, 0x9C, 0xFF, 0x9C, 0xFF, 0x9C, 0xFF, 0x9C, 0xFF, 0x9C, 0xFF, 0x9C, + 0x1C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, + 0xFF, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x9C, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x0F, 0xFF, 0x0F, 0xFF, 0x0F, + 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, + 0xFF, 0x0E, 0xFF, 0x0E, 0xFF, 0x0E, 0xFF, 0x0F, 0xFF, 0x0F, 0xFF, 0x0F, 0xFF, 0x00, 0xFF, 0x00, + 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0xC7, 0xFF, 0xC7, 0xFF, 0xC7, 0xFF, 0x07, 0xFF, 0x07, + 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0xC7, 0x00, 0xC7, 0x00, 0xC7, 0x00, 0x07, 0x00, 0x07, 0x00, + 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x07, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, + 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0x01, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF, 0xF1, + 0xFF, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0xF1, 0x00, 0xF1, 0x00, 0xF1, 0x00, + 0xFF, 0x03, 0xFF, 0x07, 0xFF, 0x03, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF, 0x01, 0xFF, 0x01, + 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0xF1, 0x00, 0xF1, 0x00, 0xF1, 0x00, 0x01, 0x00, 0x01, 0x00, + 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x01, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, + 0xFF, 0x00, 0xFF, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, + 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, 0xFF, 0xC0, + 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, + 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0xC0, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, + 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, + 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xE0, 0xFF, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0x7F, 0xF0, 0x7F, 0xF0, 0x7F, 0xF0, 0x7F, 0xF0, 0x7F, 0xF0, 0x7F, + 0xFF, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, +}; + void GBVideoInit(struct GBVideo* video) { video->renderer = NULL; video->vram = anonymousMemoryMap(GB_SIZE_VRAM); @@ -92,16 +332,25 @@ void GBVideoReset(struct GBVideo* video) { } else { video->renderer->sgbCharRam = anonymousMemoryMap(SGB_SIZE_CHAR_RAM); } + memcpy(video->renderer->sgbCharRam, _defaultBorderChardata, sizeof(_defaultBorderChardata)); + if (video->renderer->sgbMapRam) { memset(video->renderer->sgbMapRam, 0, SGB_SIZE_MAP_RAM); } else { video->renderer->sgbMapRam = anonymousMemoryMap(SGB_SIZE_MAP_RAM); } + memcpy(video->renderer->sgbMapRam, _defaultBorderTilemap, sizeof(_defaultBorderTilemap)); + int i; + for (i = 0; i < 16; ++i) { + STORE_16LE(_defaultBorderPalette[i], 0x800 + i * 2, video->renderer->sgbMapRam); + } + if (video->renderer->sgbPalRam) { memset(video->renderer->sgbPalRam, 0, SGB_SIZE_PAL_RAM); } else { video->renderer->sgbPalRam = anonymousMemoryMap(SGB_SIZE_PAL_RAM); } + if (video->renderer->sgbAttributeFiles) { memset(video->renderer->sgbAttributeFiles, 0, SGB_SIZE_ATF_RAM); } else { diff --git a/tools/snes-tile.py b/tools/snes-tile.py new file mode 100644 index 000000000..62541ec20 --- /dev/null +++ b/tools/snes-tile.py @@ -0,0 +1,76 @@ +import numpy as np +import PIL.Image +import sys + +X_FLIP = 0x4000 +Y_FLIP = 0x8000 +PAL = 0x1000 + +im = PIL.Image.open(sys.argv[1]) +tiles = np.array(np.split(np.array(np.split(np.array(im), 28, 0)), 32, 2)) +tilemapRaw = bytearray(32 * 28 * 2) +tilemap = np.ndarray(shape=(28, 32), dtype='> 0) << (7 - x) + tileData[1] |= ((t & 2) >> 1) << (7 - x) + tileData[2] |= ((t & 4) >> 2) << (7 - x) + tileData[3] |= ((t & 8) >> 3) << (7 - x) + tileBase = i * 32 + y * 2 + print(tileBase) + chardataRaw[tileBase + 0x00] = tileData[0] + chardataRaw[tileBase + 0x01] = tileData[1] + chardataRaw[tileBase + 0x10] = tileData[2] + chardataRaw[tileBase + 0x11] = tileData[3] + +def printMem(mem): + for i in range(len(mem) // 16): + line = mem[i * 16:(i + 1) * 16] + print(', '.join([f'0x{b:02X}' for b in line]) + ',') From 76438391a1509d292e123d68e5c929c8bb709d5b Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 14 Jan 2022 01:09:45 -0800 Subject: [PATCH 57/59] Windows: Attach to console if present --- CHANGES | 1 + src/platform/qt/main.cpp | 5 +++++ src/platform/sdl/main.c | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index 69160760c..74f434bb2 100644 --- a/CHANGES +++ b/CHANGES @@ -32,6 +32,7 @@ Misc: - Qt: Only set default controller bindings if loading fails (fixes mgba.io/i/799) - Qt: Save converter now supports importing GameShark Advance saves - Qt: Save positions of multiplayer windows (closes mgba.io/i/2128) + - Windows: Attach to console if present 0.9.3: (2021-12-17) Emulation fixes: diff --git a/src/platform/qt/main.cpp b/src/platform/qt/main.cpp index 21570c0b8..38a3df725 100644 --- a/src/platform/qt/main.cpp +++ b/src/platform/qt/main.cpp @@ -41,6 +41,7 @@ Q_IMPORT_PLUGIN(AVFServicePlugin); #ifdef Q_OS_WIN #include +#include #else #include #endif @@ -48,6 +49,9 @@ Q_IMPORT_PLUGIN(AVFServicePlugin); using namespace QGBA; int main(int argc, char* argv[]) { +#ifdef Q_OS_WIN + AttachConsole(ATTACH_PARENT_PROCESS); +#endif #ifdef BUILD_SDL #if SDL_VERSION_ATLEAST(2, 0, 0) // CPP does not shortcut function lookup SDL_SetMainReady(); @@ -154,6 +158,7 @@ int wmain(int argc, wchar_t* argv[]) { for (int i = 0; i < argc; ++i) { argv8.push_back(utf16to8(reinterpret_cast(argv[i]), wcslen(argv[i]) * 2)); } + __argv = argv8.data(); int ret = main(argc, argv8.data()); for (char* ptr : argv8) { free(ptr); diff --git a/src/platform/sdl/main.c b/src/platform/sdl/main.c index 2e3b18514..5025e7b6c 100644 --- a/src/platform/sdl/main.c +++ b/src/platform/sdl/main.c @@ -59,6 +59,9 @@ static void _loadState(struct mCoreThread* thread) { } int main(int argc, char** argv) { +#ifdef _WIN32 + AttachConsole(ATTACH_PARENT_PROCESS); +#endif struct mSDLRenderer renderer = {0}; struct mCoreOptions opts = { @@ -213,6 +216,7 @@ int wmain(int argc, wchar_t** argv) { for (i = 0; i < argc; ++i) { argv8[i] = utf16to8((uint16_t*) argv[i], wcslen(argv[i]) * 2); } + __argv = argv8; int ret = main(argc, argv8); for (i = 0; i < argc; ++i) { free(argv8[i]); From cff269332ee6a1b15630bbf1f30a9e9a32186c7f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 14 Jan 2022 01:31:28 -0800 Subject: [PATCH 58/59] AppVeyor: Attempt to fix --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index e0aab322b..8cf7c6ce2 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -7,7 +7,7 @@ configuration: cache: - C:\Tools\vcpkg install: -- git -C C:\Tools\vcpkg clean -dfq docs ports scripts toolsrc versions +- git -C C:\Tools\vcpkg clean -dfq docs ports scripts toolsrc triplets versions - git -C C:\Tools\vcpkg pull --force --quiet - C:\Tools\vcpkg\bootstrap-vcpkg - vcpkg --triplet x64-windows --recurse install ffmpeg libepoxy libpng libzip sdl2 sqlite3 From cb0af1b77b146114780eaf5614ac9ccf3225901e Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 15 Jan 2022 15:29:40 -0800 Subject: [PATCH 59/59] GBA: Remove obsolete RTC API --- include/mgba/internal/gba/cart/gpio.h | 9 --------- src/gba/cart/gpio.c | 23 ----------------------- 2 files changed, 32 deletions(-) diff --git a/include/mgba/internal/gba/cart/gpio.h b/include/mgba/internal/gba/cart/gpio.h index 53b610fe3..fa90aed7c 100644 --- a/include/mgba/internal/gba/cart/gpio.h +++ b/include/mgba/internal/gba/cart/gpio.h @@ -18,13 +18,6 @@ mLOG_DECLARE_CATEGORY(GBA_HW); #define IS_GPIO_REGISTER(reg) ((reg) == GPIO_REG_DATA || (reg) == GPIO_REG_DIRECTION || (reg) == GPIO_REG_CONTROL) -struct GBARTCGenericSource { - struct mRTCSource d; - struct GBA* p; - enum mRTCGenericType override; - int64_t value; -}; - enum GBAHardwareDevice { HW_NO_OVERRIDE = 0x8000, HW_NONE = 0, @@ -116,8 +109,6 @@ void GBAHardwareGPIOWrite(struct GBACartridgeHardware* gpio, uint32_t address, u void GBAHardwareTiltWrite(struct GBACartridgeHardware* gpio, uint32_t address, uint8_t value); uint8_t GBAHardwareTiltRead(struct GBACartridgeHardware* gpio, uint32_t address); -void GBARTCGenericSourceInit(struct GBARTCGenericSource* rtc, struct GBA* gba); - struct GBASerializedState; void GBAHardwareSerialize(const struct GBACartridgeHardware* gpio, struct GBASerializedState* state); void GBAHardwareDeserialize(struct GBACartridgeHardware* gpio, const struct GBASerializedState* state); diff --git a/src/gba/cart/gpio.c b/src/gba/cart/gpio.c index c3d9536d4..6f7fe15e9 100644 --- a/src/gba/cart/gpio.c +++ b/src/gba/cart/gpio.c @@ -25,8 +25,6 @@ static void _rtcProcessByte(struct GBACartridgeHardware* hw); static void _rtcUpdateClock(struct GBACartridgeHardware* hw); static unsigned _rtcBCD(unsigned value); -static time_t _rtcGenericCallback(struct mRTCSource* source); - static void _gyroReadPins(struct GBACartridgeHardware* hw); static void _rumbleReadPins(struct GBACartridgeHardware* hw); @@ -302,27 +300,6 @@ unsigned _rtcBCD(unsigned value) { return counter; } -time_t _rtcGenericCallback(struct mRTCSource* source) { - struct GBARTCGenericSource* rtc = (struct GBARTCGenericSource*) source; - switch (rtc->override) { - case RTC_NO_OVERRIDE: - default: - return time(0); - case RTC_FIXED: - return rtc->value; - case RTC_FAKE_EPOCH: - return rtc->value + rtc->p->video.frameCounter * (int64_t) VIDEO_TOTAL_LENGTH / GBA_ARM7TDMI_FREQUENCY; - } -} - -void GBARTCGenericSourceInit(struct GBARTCGenericSource* rtc, struct GBA* gba) { - rtc->p = gba; - rtc->override = RTC_NO_OVERRIDE; - rtc->value = 0; - rtc->d.sample = 0; - rtc->d.unixTime = _rtcGenericCallback; -} - // == Gyro void GBAHardwareInitGyro(struct GBACartridgeHardware* hw) {