diff --git a/app/src/ui/app.ts b/app/src/ui/app.ts index a4cb543..40cde57 100644 --- a/app/src/ui/app.ts +++ b/app/src/ui/app.ts @@ -1400,25 +1400,37 @@ export function startApp(options: AppOptions): void { * La partie à l'écran vient de finir : son analyse part en * arrière-plan, et le bilan remplace le panneau de fin de partie dès * qu'il est prêt (charte 1e), si le panneau est toujours là. + * + * Le bilan s'ouvre un peu plus tard (microtâche) : seulement si cette + * partie finie est encore celle de l'écran. Sinon, « Commencer » de + * l'écran « Nouvelle partie » ouvrait le bilan de l'ancienne partie + * par-dessus la nouvelle, qui venait de commencer entre-temps (défaut + * signalé le 2026-11-11). */ function reviewFinishedGame(): void { const id = options.games.shownId(); - if (game === null || id === null || busy || game.state.phase !== "over") { + const finished = game; + if (finished === null || id === null || busy || finished.state.phase !== "over") { return; } // L'analyse d'une autre partie, regardée, passe d'abord. const running = reviewRunner.running; if (running === null || running === id) { - review(id, game.journal); + review(id, finished.journal); } if ( navigation.route.screen === "game" && !panelDismissed && phrases !== null && - readyForSummary(game.journal) + readyForSummary(finished.journal) ) { queueMicrotask(() => { - if (navigation.route.screen === "game" && !panelDismissed) { + if ( + game === finished && + options.games.shownId() === id && + navigation.route.screen === "game" && + !panelDismissed + ) { navigation.go(routeHash({ screen: "summary", game: id })); } }); @@ -1866,8 +1878,10 @@ export function startApp(options: AppOptions): void { welcomed: () => saveSettings(welcomed()), }); - // L'écran « Nouvelle partie » : « Commencer » remplace son adresse par - // celle de la partie (le retour du téléphone ne le rouvre pas). + // L'écran « Nouvelle partie » : « Commencer » lance la partie, puis + // remplace son adresse par celle de la partie (le retour du téléphone + // ne le rouvre pas). Dans cet ordre : l'écran de jeu ne se redessine + // jamais avec l'ancienne partie, finie, et son panneau de fin. const newGameView = createNewGameView({ section: ui.newGameSection, settings: () => settings, @@ -1876,8 +1890,8 @@ export function startApp(options: AppOptions): void { if (busy || game === null) { return; } - navigation.replace("#/"); newGame(chosenGame(settings)); + navigation.replace("#/"); }, }); leavingLink(newGameView.closeLink, (route) => route.screen === "newGame");