v1.8.7

3 de agosto de 2026

Versión de dos vertientes. Gráficos/shaders: editor de shaders en vivo dentro del juego con confirmación de cambios sin guardar, el reflejo del bezel ahora se difumina en el resultado de scanlines/phosphor para las pantallas Famicom y RF, agrupación de presets Slang con IDs estables SHA-256, flag cacheado de pase final para escalado, overscan por defecto que mantiene el frame completo visible en la conversión RGBA y un pase de rendimiento de renderizado. Biblioteca y Modo TV: modos de visualización de carátulas con caché de fondo difuminado, un nuevo GenreGroupingDiagram con conteos por género, un refresco del aspecto del menú contextual en tarjetas y filas, copys más claras en los ajustes del Modo TV en los tres idiomas, y dimensiones ajustadas del tile y del layout del Modo TV. Además: traducción completa de la UI al japonés.

Destacados

  • Localización al japonés: Aterriza una traducción completa de la UI al japonés como ja.json, conectada al selector de idioma en GeneralSettingsView y al build de Xcode. La app ahora incluye inglés, español, portugués y japonés.
  • Editor de shaders en vivo: Desde la ventana del juego, abre una barra lateral para editar en vivo los parámetros del shader. Los cambios sin guardar se protegen con un overlay de confirmación, y los cambios persisten en el preset con el estado SwiftUI refrescándose automáticamente.
  • Desenfoque del reflejo del bezel: Los reflejos del bezel mezclan el bezel reflejado con el resultado de scanlines/phosphor de FamicomRF y RfDisplay para un efecto CRT-sobre-pantalla-plana más realista. Nuevos parámetros de uniform controlan el redondeo, el brillo y el desenfoque del reflejo del bezel; el manejo de la máscara es más estable en la pantalla RF.
  • Gestión de presets Slang e IDs estables: Los presets se agrupan al mostrarlos, y las colisiones de nombre se desambiguan con un ID estable derivado de SHA-256. Los errores de detección se manejan y registran, y un flag cacheado _finalPassIsAbsolute decide el escalado de aspect ratio/viewport sin entrar en el contexto @MainActor.
  • Manejo de overscan y aspect ratio: La ruta de conversión RGBA ajusta el overscan a cero por defecto para que la imagen fuente completa siga visible, y MetalCoordinator cachea el reconocimiento de sistema para un manejo coherente de aspect ratio; XPCBridgeAdapter cachea el aspect ratio para reducir las llamadas síncronas XPC.
  • Pase de rendimiento de renderizado: Una caché de uniforms por generación en el decodificador RF evita copias de diccionario innecesarias durante el juego; CRTFilter.metal alinea la máscara de phosphor/scanlines con los píxeles fuente sin importar el upscale de salida; el resampleo de audio en StreamRecordingService usa UnsafeBufferPointer; GameTimeBarOverlay solo conecta sus temporizadores cuando el overlay es visible; el alpha del drawable se reinicia tras el render de Slang para evitar artefactos de transparencia.
  • Modos de visualización de carátulas: Nueva opción de modo de visualización más integración en GameCardView, GridCollectionView y LibraryGridView, respaldada por una caché de imágenes de fondo difuminadas en ImageCache para que las tarjetas rendericen un fondo teñido y suave derivado de su propia carátula.
  • Diagrama de agrupación de géneros y conteos por género: El nuevo GenreGroupingDiagram visualiza los ajustes de géneros; GenreManager expone conteos y GenrePickerView los muestra. Nuevos labels y descripciones en en/es/pt.
  • Pulido de menú contextual en tarjetas y filas: GameCardView y GameListRowView reciben un aspecto y una estructura renovados del menú contextual.
  • Copy y layout del Modo TV: Las descripciones de ajustes del Modo TV se reescriben para más claridad y consistencia en en/es/pt, y se ajustan las dimensiones del game tile y del layout del Modo TV.
  • Limpieza del shader 8-bit GameBoy: Se renombran las variables de uniform en 8bGameBoy.metal por consistencia y claridad, con actualizaciones parejas en ShaderPreset, MetalCoordinator y ShaderUniforms.
  • Log de prefetch de badges de RA: Se elimina el log de debug para badges existentes durante el pase de prefetch.

Cambios detallados

  • feat(shader): implementar editor de shaders en vivo con confirmación de cambios sin guardar — StandaloneGameWindowController aloja la barra lateral; los parámetros se aplican al instante; un overlay de confirmación protege los cambios sin guardar; el manejo de presets se refactoriza para apply/persist sin costuras; traducciones en/es/pt de claves de shader añadidas
  • feat: implementar desenfoque del reflejo del bezel para efectos visuales mejorados y optimizar el manejo de presencia enriquecida
  • feat: mejorar el manejo del reflejo del bezel en applyMaskAndBezel para fidelidad visual mejorada
  • feat: mejorar el manejo de la máscara del bezel para fidelidad visual y estabilidad mejoradas en la pantalla RF
  • feat: añadir soporte para el reflejo del bezel en RfDisplay y ShaderUniforms — nuevos parámetros de uniform: redondeo, brillo y desenfoque del reflejo del bezel
  • Mejorar Slang Compiler y Metal Coordinator para mejor renderizado — flag cacheado _finalPassIsAbsolute sin @MainActor; estrategias de escalado de aspect ratio/viewport según el tipo de pase final del preset; estado de pase final registrado al activar; arreglo del alpha del drawable para evitar transparencias tras render de Slang; SlangPresetDiscoveryService maneja errores y desambigua nombres vía IDs estables SHA-256
  • Mejorar shaders y rendimiento de renderizado — caché de uniforms por generación para la ruta del decodificador RF en EmulatorRunner; CRTFilter.metal alinea la máscara de phosphor/scanlines con los píxeles fuente independientemente del upscale; FamicomRF.metal / RfDisplay.metal incorporan el desenfoque del reflejo del bezel; aspect ratio cacheado en XPCBridgeAdapter; StreamRecordingService remuestrea audio con UnsafeBufferPointer; GameTimeBarOverlay gestiona las conexiones de temporizador según la visibilidad del overlay; MetalCoordinator cachea el reconocimiento de sistema para decisiones de aspect ratio
  • feat: mejorar la gestión de presets Slang con agrupación y mejor manejo de visualización
  • feat: ajustar el overscan a cero para una salida visual mejorada en la conversión RGBA
  • feat: añadir opciones de modo de visualización de carátulas e integrarlas en las vistas de biblioteca — nuevas opciones de modo en SystemInfo; GameCardView, GridCollectionView, LibraryGridView actualizados; claves en/es/pt añadidas
  • feat: implementar caché de imágenes difuminadas para el modo de visualización de carátulas — ImageCache añade una caché de fondos difuminados; GameCardView la usa para fondos teñidos suaves
  • feat: añadir GenreGroupingDiagram y mejorar los ajustes de agrupación de géneros con nuevos labels y descripciones — nueva vista de 315 líneas, integrada en GenreSettingsView y SettingsCatalog; labels en/es/pt añadidos
  • feat: añadir funcionalidad de conteo de géneros a GenreManager e integrarla con GenrePickerView — conteos por género en el picker y en la vista de cuadrícula
  • feat: mejorar el aspecto del menú contextual en GameCardView y GameListRowView
  • feat: mejorar las descripciones de ajustes del Modo TV para claridad y consistencia entre idiomas — reescritura de TVModeMainSettingsView; copy en/es/pt alineado
  • feat: ajustar dimensiones del game tile y del layout del Modo TV — pase de sizing en TVModeGameTile y TVModeView
  • feat: renombrar variables de uniform del shader 8-bit GameBoy por consistencia y claridad — 8bGameBoy.metal, ShaderPreset, MetalCoordinator, ShaderUniforms mantenidos en sincronía
  • feat: eliminar el log de debug para badges existentes durante el proceso de prefetch — RABadgeCacheService
  • feat: añadir traducción completa de la UI al japonés — ja.json (2468 líneas), conectada al selector de idiomas en GeneralSettingsView y al build de recursos de Xcode; la app ahora incluye en/es/pt/ja
  • Refactorizar la estructura del código para mejorar la legibilidad y el mantenimiento
  • Subir la versión de marketing a 1.8.7 y el número de build a 30 en project.yml, los dos Info.plist y docs/_config.yml