v1.9.0

18 de agosto de 2026

Esta versión añade la calibración del stick del control y una amplia mejora interna de calidad. Controles: calibra el rango del stick analógico de cada control con retroalimentación visual en vivo, guardada por control, más arreglos para controles SDL — el L2/R2 digital ahora activa los gatillos analógicos para núcleos como Flycast, y los controles duplicados tras una reconexión se reconcilian. Mientras un juego se ejecuta, la pantalla y el sistema permanecen despiertos. El Apply del editor de shaders en vivo ahora sobrevive al relanzar el mismo juego, y el Modo TV mantiene el sistema que seleccionaste después de salir de un juego. Bajo el capó, el estado de pausa se consolidó en un solo enum (arreglando bugs de scrub y grabación), las opciones de núcleo siguen un único recorrido de precedencia de cinco capas, las asignaciones de controles comparten una sola fuente de verdad, y un nuevo harness de smoke tests automatizado arranca 11 ROMs a través del pipeline de lanzamiento real para verificar la estabilidad.

Destacados

  • Calibración del stick: Calibra el rango del stick analógico de cada control por dirección con una sesión de calibración en vivo y retroalimentación visual, aplicada a todos tus juegos y guardada por control.
  • Sin suspensión mientras juegas: La pantalla y el sistema se mantienen despiertos mientras un juego se ejecuta, así las sesiones de juego nunca se interrumpen porque tu Mac se suspenda.
  • El Apply de shaders en vivo persiste: Los cambios de shader aplicados con el editor de shaders en juego sobreviven al relanzar el mismo juego en lugar de revertirse al snapshot obsoleto.
  • El Modo TV mantiene su sistema: Después de salir de un juego, el Modo TV permanece en el sistema que seleccionaste en lugar de volver a Recientes.
  • Arreglos de controles SDL: Los botones digitales L2/R2 ahora activan el estado analógico de los gatillos (arreglando los controles de Dreamcast en Flycast), y los controles duplicados se reconcilian cuando GameControllerKit reconecta un dispositivo que SDL ya había aceptado.
  • Estado de pausa consolidado: Rewind, scrub y pausa ahora comparten una sola máquina de estados — scrubbing sobre un juego pausado lo mantiene pausado al salir, y la navegación de gamepad restaura el estado de pausa anterior.
  • Smoke tests automatizados: Un nuevo harness de boot-smoke lanza 11 ROMs (de NES a MAME) a través del pipeline de lanzamiento real y verifica que el primer frame se renderice, con la auditoría de shaders slang aún saludable.

Cambios detallados

  • feat: implementar la calibración del stick para controles — modelos StickCalibration y ControllerCalibration para el rango del stick analógico por dirección, StickCalibrationSession para captura en vivo, SDLInputManager aplica la calibración, los runners (DOSRunner, ScummVMRunner) la consumen, UI de calibración en ControllerSettingsViewGroup, traducciones en/es/ja/pt, además de un refactor de refresco masivo ROMLibrary.refreshAll
  • fix: evitar el duplicado de SDL cuando GameControllerKit registra un control tras una reconexión — reconciliar en las notificaciones de conexión GC/SDL cerrando el handle SDL duplicado; eliminar el contador acceptedSDLCountByName que nunca se decrementaba y hacía fallar permanentemente la guardia por nombre
  • fix: preservar el Apply de shaders en vivo al relanzar el juego — fusionar la contabilidad de tiempo de juego en la entrada actual de la biblioteca en lugar del snapshot obsoleto del lanzamiento; añadir la clave shader.applyAndSave que faltaba a todos los archivos de traducción
  • fix: evitar que la pantalla y el sistema duerman mientras un juego se ejecuta
  • refactor: aplicar los slices D, E y F-sl de la auditoría — deduplicación del trabajo en el lanzamiento (CoreCapabilities cacheadas, snapshot de listas de guardado, helper XPC genérico, índice de extensiones normalizado), consolidación de estado y precedencia (recorrido de 5 capas de opciones de núcleo, mapa único de asignaciones de controles, ShaderManager como única fuente del preset slang, estado RA canónico, cluster de tema pendiente, ManualStatusController) y herramientas (matriz de boot-smoke de 11 ROMs vía TRUCHI_SMOKE_ROM, auditoría slang, scripts MAME obsoletos retirados)
  • refactor: eliminar campos muertos de LaunchConfig y un flag de wizard — se eliminan slotToLoad/coreOptions/bezelFileName/hardcoreMode; hasCompletedWizard se sustituye por has_completed_onboarding
  • refactor: consolidar el estado de pausa en un solo enum PauseState — reemplaza el triple isPaused/isRewinding sincronizado a mano; scrub sobre pausado mantiene pausado al salir, la barra de herramientas de gamepad restaura el estado anterior, setPaused no-op durante el scrub
  • refactor: aplicar los slices A+C de la auditoría — enum único AuthState, reset de sesión de grabación en todas las rutas de teardown, respetar el expiry del caché negativo 404, eliminar el motor SequenceRunner muerto y flags de solo escritura; arreglar bugs de scrub/grabación vacía
  • fix: enviar el estado analógico de los gatillos para los botones digitales L2/R2 de SDL — los controles SDL puros solo establecían el estado digital de teclas; núcleos como Flycast leen los gatillos de Dreamcast del estado analógico; añadir l2/r2 a los overrides y etiquetas de botones del núcleo flycast
  • fix: mantener el Modo TV en el sistema seleccionado tras salir de un juego — hacer initialEntryID una semilla de un solo uso para que los rebuilds ya no devuelvan la selección de la fila 1 a la entrada donde se abrió el Modo TV
  • Subir la versión de marketing a 1.9.0 y el número de build a 32 en project.yml, los dos Info.plist y docs/_config.yml