Skip to content

feat: play a set online with friends, hosted from a link and kept in lockstep - #169

Merged
r4mbo7 merged 6 commits into
mainfrom
issue-147-online-coop
Oct 5, 2026
Merged

r4mbo7 merged 6 commits into
mainfrom
issue-147-online-coop

Conversation

@r4mbo7

@r4mbo7 r4mbo7 commented Oct 5, 2026

Copy link
Copy Markdown
Owner

Closes #147

Ce que fait la PR

  • src/app/online.ts : salon en ligne (créer, rejoindre par code ou #rejoindre=CODE), transport PeerJS, choix hôte ou invité, sources de lockstep, relance par l'hôte, fermeture propre, mesure de l'aller-retour (getStats). Les avis desync, hostLeft, connectionLost passent par showNotice.
  • src/app/game.ts : points d'entrée et boucle seulement. Quand source.next rend null, le pas s'arrête (step rend false, loop.ts fige l'interpolation à 1 et ne doit pas le temps attendu) ; au-delà du tampon (GUEST_BUFFER_TICKS), jusqu'à 2 pas de rattrapage par image. next n'est appelé qu'une fois par tentative de pas. En ligne : la pause n'arrête pas le set (personnage immobile), l'onglet caché ne met pas en pause, caméra sur son joueur.
  • src/app/pause.ts : texte optionnel (« Le set continue », R19). src/app/toast.ts : « X a quitté le set » quand un invité part.
  • « Ton avis » : le rapport porte rôle, joueurs, aller-retour et, après divergence, tick et version (feedback/report.ts, test ajouté).
  • window.ozoboom (?dev=fast) : online (rôle, pending, roundTripMs, connectMs), hash, forceVersion.
  • src/net/peerjs.ts : PeerTransport.roundTripMs() (type local, pas un contrat partagé). Sim, lockstep et salon de src/net/ inchangés.
  • Provisoire : onPlayTogether ouvre le salon en ligne tant que la coop locale (app : coop locale, une partie à plusieurs sur un écran #146, PR feat: play local co-op, two to four players on one screen from a lobby #168) n'a pas son salon local ; onGoOnline est branché pour la suite.

Preuves

  • pnpm check vert (1516 tests).
  • CI=1 E2E_PORT=4317 E2E_PEER_PORT=9317 pnpm exec playwright test --project chromium --workers 2 : 75 verts ; un test (smoke, mode calme) a perdu son navigateur (« session closed ») sous charge puis passe seul.
  • e2e/online.spec.ts : deux pages, courtier local, création, rejoindre par lien, piège posé par l'invité reçu des deux côtés, set ?dev=fast joué jusqu'au bout, hashState et tick identiques ; version différente refusée (« Recharge la page ») ; fermeture de la page de l'hôte, avis chez l'invité ; solo sans peerjs (aucune réponse JS ne contient la bibliothèque tant qu'aucun salon n'est ouvert, elle se charge à la création du premier).
  • Mesures locales (Chromium sans GPU, deux pages, courtier local) : transport prêt en 1,5 s (hôte) et 2,0 s (invité), aller-retour 1 ms, set rapide joué en 44 s au total. Sans GPU les pages tournent à 1 à 5 images par seconde ; aucun délai n'a été allongé.

Limites

  • Perte brutale de l'hôte (plantage, réseau coupé) : la fermeture d'une page Playwright sans pagehide n'a rien signalé à l'invité en 60 s. Fermer un onglet envoie bye (pagehide). Pas de chien de garde ajouté : un hôte en onglet caché arrête aussi le set.
  • Relance en ligne : l'hôte relance avec ses invités encore présents ; chaque invité ferme sa source à sa fin de set, l'hôte la sienne à la relance (sinon le bye de close() serait pris pour un départ).

Pour Constantin (#149) : deux machines, deux réseaux

  1. Ouvrir le site déployé sur A, « Jouer à plusieurs », « Créer un salon », noter le temps jusqu'au code.
  2. Sur B (même réseau, puis un autre réseau, 4G comprise), ouvrir le lien copié ; noter le temps jusqu'au salon.
  3. Lancer, jouer un set entier. ?dev=fast expose window.ozoboom.online (aller-retour, pending) ; sinon « Ton avis » donne le rôle et l'aller-retour.
  4. Attendu : aucune divergence ; sur un réseau qui refuse la connexion (sans TURN), le salon affiche « Connexion impossible ».

Pour #146

game.ts garde source, localPlayer, onlineMatch en variables locales. Dès que #168 fusionne, rebase sur match.ts (createMatch avec la source de lockstep, focus: { kind: 'player', playerId }).

@r4mbo7
r4mbo7 force-pushed the issue-147-online-coop branch from 4a7d5cf to d9bc58a Compare October 5, 2026 11:18
@r4mbo7
r4mbo7 merged commit 120a1a6 into main Oct 5, 2026
11 checks passed
@r4mbo7
r4mbo7 deleted the issue-147-online-coop branch October 5, 2026 11:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

app : coop en ligne, salon par lien, hôte et invités en lockstep

1 participant