v1.8.7

3 de agosto de 2026

Versão de duas frentes. Gráficos/shaders: editor de shaders ao vivo dentro do jogo com confirmação de mudanças não salvas, o reflexo do bezel agora se difunde no resultado de scanlines/phosphor para as telas Famicom e RF, agrupamento de presets Slang com IDs estáveis SHA-256, flag cacheado de passe final para escalonamento, overscan padrão que mantém o frame completo visível na conversão RGBA e um passe de desempenho de renderização. Biblioteca e Modo TV: modos de exibição de capas com cache de fundo desfocado, um novo GenreGroupingDiagram com contagens por gênero, um aspecto renovado do menu de contexto em cards e linhas, redação mais clara das configurações do Modo TV nos três idiomas, e dimensões ajustadas do tile e do layout do Modo TV. Além disso: tradução completa da UI para o japonês.

Destaques

  • Localização para o japonês: Aterra uma tradução completa da UI para o japonês como ja.json, conectada ao seletor de idioma em GeneralSettingsView e ao build do Xcode. O app agora inclui inglês, espanhol, português e japonês.
  • Editor de shaders ao vivo: A partir da janela do jogo, abra uma barra lateral para editar ao vivo os parâmetros do shader. As mudanças não salvas são protegidas com um overlay de confirmação, e as mudanças persistem no preset com o estado SwiftUI sendo atualizado automaticamente.
  • Desfoque do reflexo do bezel: Os reflexos do bezel misturam o bezel refletido com o resultado de scanlines/phosphor de FamicomRF e RfDisplay para um efeito CRT-em-tela-plana mais realista. Novos parâmetros de uniform controlam o arredondamento, o brilho e o desfoque do reflexo do bezel; o tratamento da máscara é mais estável na tela RF.
  • Gestão de presets Slang e IDs estáveis: Os presets são agrupados na exibição, e colisões de nome são desambiguadas com um ID estável derivado de SHA-256. Erros de descoberta são tratados e registrados, e um flag cacheado _finalPassIsAbsolute decide o escalonamento de aspect ratio/viewport sem entrar no contexto @MainActor.
  • Tratamento de overscan e aspect ratio: O caminho de conversão RGBA define o overscan como zero por padrão para que a imagem fonte completa continue visível, e MetalCoordinator cacheia o reconhecimento de sistema para um tratamento coerente de aspect ratio; XPCBridgeAdapter cacheia o aspect ratio para reduzir as chamadas síncronas XPC.
  • Passe de desempenho de renderização: Uma cache de uniforms por geração no decodificador RF evita cópias de dicionário desnecessárias durante o jogo; CRTFilter.metal alinha a máscara de phosphor/scanlines com os píxeis fonte independentemente do upscale de saída; o resampling de áudio em StreamRecordingService usa UnsafeBufferPointer; GameTimeBarOverlay só conecta seus temporizadores quando o overlay está visível; o alpha do drawable é reiniciado após render de Slang para evitar artefatos de transparência.
  • Modos de exibição de capas: Nova opção de modo de exibição mais integração em GameCardView, GridCollectionView e LibraryGridView, apoiada por uma cache de imagens de fundo desfocadas em ImageCache para que os cards renderizem um fundo tingido e suave derivado da própria capa.
  • Diagrama de agrupamento de gêneros e contagens por gênero: O novo GenreGroupingDiagram visualiza as configurações de gêneros; GenreManager expõe contagens e GenrePickerView as mostra. Novos labels e descrições em en/es/pt.
  • Polimento do menu de contexto em cards e linhas: GameCardView e GameListRowView recebem um aspecto e uma estrutura renovados do menu de contexto.
  • Redação e layout do Modo TV: As descrições de configurações do Modo TV são reescritas para mais clareza e consistência em en/es/pt, e as dimensões do game tile e do layout do Modo TV são ajustadas.
  • Limpeza do shader 8-bit GameBoy: As variáveis de uniform em 8bGameBoy.metal são renomeadas por consistência e clareza, com atualizações correspondentes em ShaderPreset, MetalCoordinator e ShaderUniforms.
  • Log de prefetch de badges de RA: Removido o log de debug para badges existentes durante o passe de prefetch.

Mudanças detalhadas

  • feat(shader): implementar editor de shaders ao vivo com confirmação de mudanças não salvas — StandaloneGameWindowController hospeda a barra lateral; os parâmetros se aplicam instantaneamente; um overlay de confirmação protege as mudanças não salvas; o tratamento de preset é refatorado para aplicar/persistir sem costuras; traduções en/es/pt de chaves de shader adicionadas
  • feat: implementar desfoque do reflexo do bezel para efeitos visuais aprimorados e otimizar o tratamento de presença enriquecida
  • feat: melhorar o tratamento do reflexo do bezel em applyMaskAndBezel para fidelidade visual aprimorada
  • feat: melhorar o tratamento da máscara do bezel para fidelidade visual e estabilidade aprimoradas na tela RF
  • feat: adicionar suporte ao reflexo do bezel em RfDisplay e ShaderUniforms — novos parâmetros de uniform: arredondamento, brilho e desfoque do reflexo do bezel
  • Melhorar Slang Compiler e Metal Coordinator para renderização aprimorada — flag cacheado _finalPassIsAbsolute sem @MainActor; estratégias de escalonamento de aspect ratio/viewport conforme o tipo de passe final do preset; estado do passe final registrado na ativação; correção do alpha do drawable evita transparência após render de Slang; SlangPresetDiscoveryService trata erros e desambigua nomes via IDs estáveis SHA-256
  • Melhorar shaders e desempenho de renderização — cache de uniforms por geração para o caminho do decodificador RF em EmulatorRunner; CRTFilter.metal alinha a máscara de phosphor/scanlines com os píxeis fonte independentemente do upscale; FamicomRF.metal / RfDisplay.metal incorporam o desfoque do reflexo do bezel; aspect ratio cacheado em XPCBridgeAdapter; StreamRecordingService reamostra áudio com UnsafeBufferPointer; GameTimeBarOverlay gerencia as conexões de temporizadores por visibilidade do overlay; MetalCoordinator cacheia o reconhecimento de sistema para decisões de aspect ratio
  • feat: aprimorar a gestão de presets Slang com agrupamento e melhor tratamento de exibição
  • feat: ajustar o overscan para zero para uma saída visual aprimorada na conversão RGBA
  • feat: adicionar opções de modo de exibição de capas e integrá-las nas views da biblioteca — novas opções de modo em SystemInfo; GameCardView, GridCollectionView, LibraryGridView atualizados; chaves en/es/pt adicionadas
  • feat: implementar cache de imagens desfocadas para o modo de exibição de capas — ImageCache adiciona um cache de fundos desfocados; GameCardView o usa para fundos tingidos suaves
  • feat: adicionar GenreGroupingDiagram e aprimorar as configurações de agrupamento de gêneros com novos labels e descrições — nova view de 315 linhas, integrada em GenreSettingsView e SettingsCatalog; labels en/es/pt adicionados
  • feat: adicionar funcionalidade de contagem de gêneros a GenreManager e integrá-la com GenrePickerView — contagens por gênero no picker e na view de grade
  • feat: melhorar o aspecto do menu de contexto em GameCardView e GameListRowView
  • feat: aprimorar as descrições das configurações do Modo TV para clareza e consistência entre idiomas — reescrita de TVModeMainSettingsView; redação en/es/pt alinhada
  • feat: ajustar dimensões do game tile e do layout do Modo TV — passe de sizing em TVModeGameTile e TVModeView
  • feat: renomear variáveis de uniform do shader 8-bit GameBoy por consistência e clareza — 8bGameBoy.metal, ShaderPreset, MetalCoordinator, ShaderUniforms mantidos em sincronia
  • feat: remover o log de debug para badges existentes durante o processo de prefetch — RABadgeCacheService
  • Refatorar a estrutura do código para melhorar a legibilidade e a manutenibilidade
  • feat: adicionar tradução completa da UI para o japonês — ja.json (2468 linhas), conectada ao seletor de idioma em GeneralSettingsView e ao build de recursos do Xcode; o app agora inclui en/es/pt/ja
  • Subir a versão de marketing para 1.8.7 e o número de build para 30 em project.yml, nos dois Info.plist e em docs/_config.yml