v1.9.0

18 de agosto de 2026

Esta versão adiciona a calibração do analógico do controle e uma ampla melhoria interna de qualidade. Controles: calibre a faixa do analógico de cada controle com feedback visual ao vivo, salva por controle, além de correções para controles SDL — o L2/R2 digital agora aciona os gatilhos analógicos para núcleos como Flycast, e controles duplicados após uma reconexão são reconciliados. Enquanto um jogo roda, a tela e o sistema permanecem acordados. O Apply do editor de shaders ao vivo agora sobrevive ao relançar o mesmo jogo, e o Modo TV mantém o sistema que você selecionou depois de sair de um jogo. Sob o capô, o estado de pausa foi consolidado em um único enum (corrigindo bugs de scrub e gravação), as opções de núcleo seguem um único percurso de precedência de cinco camadas, os mapeamentos de controles compartilham uma única fonte de verdade, e um novo harness de smoke tests automatizado inicia 11 ROMs pelo pipeline de lançamento real para verificar a estabilidade.

Destaques

  • Calibração do analógico: Calibre a faixa do analógico de cada controle por direção com uma sessão de calibração ao vivo e feedback visual, aplicada a todos os seus jogos e salva por controle.
  • Sem suspensão durante o jogo: A tela e o sistema são mantidos acordados enquanto um jogo roda, para que as sessões de jogo nunca sejam interrompidas pelo Mac entrar em suspensão.
  • Apply de shaders ao vivo persiste: Mudanças de shader aplicadas com o editor de shaders em jogo sobrevivem ao relançar o mesmo jogo em vez de reverter para o snapshot desatualizado.
  • Modo TV mantém seu sistema: Depois de sair de um jogo, o Modo TV permanece no sistema que você selecionou em vez de voltar para Recentes.
  • Correções de controles SDL: Os botões digitais L2/R2 agora acionam o estado analógico dos gatilhos (corrigindo os controles de Dreamcast no Flycast), e controles duplicados são reconciliados quando o GameControllerKit reconecta um dispositivo que o SDL já havia aceitado.
  • Estado de pausa consolidado: Rewind, scrub e pausa agora compartilham uma única máquina de estados — scrub sobre um jogo pausado o mantém pausado ao sair, e a navegação de gamepad restaura o estado de pausa anterior.
  • Smoke tests automatizados: Um novo harness de boot-smoke inicia 11 ROMs (de NES a MAME) pelo pipeline de lançamento real e verifica se o primeiro frame renderiza, com a auditoria de shaders slang ainda saudável.

Mudanças detalhadas

  • feat: implementar a calibração do analógico para controles — modelos StickCalibration e ControllerCalibration para a faixa do analógico por direção, StickCalibrationSession para captura ao vivo, SDLInputManager aplica a calibração, os runners (DOSRunner, ScummVMRunner) a consomem, UI de calibração no ControllerSettingsViewGroup, traduções en/es/ja/pt, além de um refactor de atualização em massa ROMLibrary.refreshAll
  • fix: evitar duplicata de SDL quando o GCController registra um controle após reconexão — reconciliar nas notificações de conexão GC/SDL fechando o handle SDL duplicado; remover o contador acceptedSDLCountByName que nunca era decrementado e fazia a guarda por nome falhar permanentemente
  • fix: preservar o Apply de shaders ao vivo ao relançar o jogo — mesclar a contabilidade de tempo de jogo na entrada atual da biblioteca em vez do snapshot desatualizado do lançamento; adicionar a chave shader.applyAndSave que faltava a todos os arquivos de tradução
  • fix: evitar que a tela e o sistema entrem em suspensão enquanto um jogo roda
  • refactor: aplicar os slices D, E e F-sl da auditoria — deduplicação do trabalho no lançamento (CoreCapabilities em cache, snapshot de listas de save, helper XPC genérico, índice de extensões normalizado), consolidação de estado e precedência (percurso de 5 camadas de opções de núcleo, mapa único de mapeamentos de controles, ShaderManager como única fonte do preset slang, status RA canônico, cluster de tema pendente, ManualStatusController) e ferramentas (matriz de boot-smoke de 11 ROMs via TRUCHI_SMOKE_ROM, auditoria slang, scripts MAME obsoletos aposentados)
  • refactor: remover campos mortos de LaunchConfig e um flag de wizard — slotToLoad/coreOptions/bezelFileName/hardcoreMode excluídos; hasCompletedWizard substituído por has_completed_onboarding
  • refactor: consolidar o estado de pausa em um único enum PauseState — substitui o triplo isPaused/isRewinding sincronizado à mão; scrub sobre pausado mantém pausado ao sair, a barra de ferramentas de gamepad restaura o estado anterior, setPaused é no-op durante o scrub
  • refactor: aplicar os slices A+C da auditoria — enum único AuthState, reset de sessão de gravação em todos os caminhos de teardown, respeitar a expiração do cache negativo 404, remover o motor SequenceRunner morto e flags de só-escrita; corrigir bugs de scrub/gravação vazia
  • fix: enviar o estado analógico dos gatilhos para os botões digitais L2/R2 do SDL — controles SDL puros só definiam o estado digital da tecla; núcleos como Flycast leem os gatilhos de Dreamcast do estado analógico; adicionar l2/r2 aos overrides e rótulos de botões do núcleo flycast
  • fix: manter o Modo TV no sistema selecionado após sair de um jogo — tornar initialEntryID uma semente de uso único para que os rebuilds não voltem a seleção da linha 1 para a entrada onde o Modo TV foi aberto
  • Subir a versão de marketing para 1.9.0 e o número de build para 32 em project.yml, nos dois Info.plist e em docs/_config.yml