quest'n'click 4.5.0 · r1

Construite pour quest'n'click 4.5.0, révision r1. Si elle est publiée, et laquelle est la courante, est dit par publication.json.

Speedrun pour les joueurs : LiveSplit et OBS

English · Type : procédure · Public : joueur · Contexte : navigateur du joueur · Statut : prête · S'applique depuis : 4.1.14

Speedrun et Remix · contrat : stable · vérifié par la CI (matrice de support de la 4.4.0, 2026-10-23) : Replays dans quatre environnements d'exécution (cross-runtime) · vérifications automatiques : jobs cross-runtime, e2e ; plan de CI e2e ; 2 fichiers de tests · passes humaines : runs-real-players pas faite (#85), run-resume-power-cycle pas faite (#84), mystery-deployed pas faite (#82), livesplit-obs pas faite (#81), code-wheel-human pas faite (#78) · limites connues : integrity-not-authenticity, livesplit-obs-not-tried

Comment jouer un jeu quest'n'click contre la montre, exporter la preuve de votre run, et afficher votre chrono dans OBS ou piloter LiveSplit. Pour les auteurs qui veulent déclarer des catégories : Speedrun pour les auteurs.

Ce que vous obtenez

Une tentative chronométrée dans une catégorie que déclare le jeu (Any%, par exemple), découpée en temps intermédiaires sur ce qui se passe dans le jeu, jamais sur des pixels ; à l’arrivée, un fichier .wsrun scellé que n’importe qui peut rejouer et vérifier ; vos records sur votre appareil ; et, si vous diffusez, un chrono dans OBS ou LiveSplit piloté par le jeu.

Un rejeu prouve qu’un run est possible et que son temps de jeu est exact. Il ne promet pas de détecter toute triche : seule l’observation d’un serveur ou d’une personne élève la confiance au-delà (voir les limites).

Contexte et versions

Le joueur d’un jeu qui déclare des catégories de speedrun (speedrun dans son contenu). Le moteur a le speedrun depuis la 4.1.14 « Time Attack » ; cette page vaut depuis cette version. Le jeu d’exemple sur wanoo.github.io/quest-n-click ne déclare aucune catégorie : son menu de pause n’a pas de ligne Speedrun ; le jeu de référence du dépôt du moteur (games/reference) en déclare plusieurs.

Prérequis

Où lancer les commandes

Le run lui-même ne demande aucune commande : il se passe dans le jeu. Les outils de diffusion sont de petits processus Node sur votre propre machine, jamais sur un serveur et jamais dans le jeu : dans le dépôt du moteur par npm run, ou dans un projet créé depuis le package du moteur qu’il a installé (node_modules/quest-n-click/tools/speedrun/).

Étapes

  1. Démarrer : menu de pause › Speedrun › une catégorie. Le jeu redémarre avec la graine de la catégorie ; un petit chrono montre la catégorie, le temps sur lequel elle est classée (temps réel, temps de jeu, ou temps de jeu sans les pauses) et le dernier temps intermédiaire.
  1. Pendant le run : le menu de pause affiche Abandonner le run. Ouvrir le menu est noté comme une pause, et le passage de l’onglet en arrière-plan aussi ; ni l’un ni l’autre n’arrête le temps de jeu (le jeu ne tourne pas pendant qu’il attend).
  1. À l’arrivée : le run est scellé, et le menu de pause affiche Exporter le run : un fichier .wsrun, la preuve à envoyer à un classement ou à un ami. Le panneau de développement (?dev) a le même export.
  1. Vos records restent sur l’appareil, hors ligne (IndexedDB web-scumm-runs) : le record personnel et ses temps intermédiaires, le meilleur segment de chaque temps intermédiaire, la somme des meilleurs, les tentatives, les arrivées, les abandons, des notes. Un run reprend après un plantage ou un onglet fermé depuis son dernier morceau enregistré (toutes les 500 entrées) ; ce qui a été joué après est rejoué.

Le fantôme est votre record personnel joué à côté de vous, sur des cibles de sens : la salle où il est, l’action qu’il fait et ce qu’il tient, en avance ou en retard à chaque temps intermédiaire, jamais une trace de pixels. Il est désactivé la première fois que vous jouez une catégorie sur cet appareil, parce qu’il montrerait les solutions des énigmes.

Diffusion : OBS et LiveSplit

Les outils tournent sur la machine du joueur (décision D23), jamais sur le Bridge, jamais dans le jeu. Ouvrez le jeu avec ?speedrunTool=<port> dans son adresse : la page envoie alors les événements de son run (la catégorie, les identifiants et noms des temps intermédiaires, les temps ; rien d’autre : ni sauvegarde, ni identifiant de joueur, ni jeton) à 127.0.0.1:<port>. Une page porte un seul port : elle alimente un outil à la fois. Les outils n’acceptent les événements que de l’origine du jeu : par défaut le serveur de développement et la prévisualisation (localhost et 127.0.0.1, ports 5173 et 4173), --origin=<url> pour un jeu déployé. Une autre page ouverte dans le navigateur ne peut pas envoyer de faux temps.

  1. OBS : lancez l’incrustation, puis ajoutez dans OBS une Source navigateur sur http://127.0.0.1:7777/?mode=full (ou compact : le chrono et le dernier temps ; transparent : la même chose sans fond). Elle se met à jour par Server-Sent Events.

    # dans le dépôt du moteur, sur votre machine
    npm run speedrun:overlay -- --port=7777 --origin=https://wanoo.github.io
    
    # dans un projet créé, sur votre machine
    node node_modules/quest-n-click/tools/speedrun/overlay.mjs --port=7777 --origin=https://wanoo.github.io
    

    Puis ouvrez le jeu à https://…/?speedrunTool=7777. Mettez l’adresse de votre jeu dans --origin.

  1. LiveSplit : dans LiveSplit, Control › Start WebSocket Server (il écoute sur ws://127.0.0.1:16834/livesplit), puis lancez le pont et ouvrez le jeu avec ?speedrunTool=7778. Le jeu pilote LiveSplit : départ, temps de jeu, temps intermédiaire, saut, pause, remise à zéro.

    # dans le dépôt du moteur, sur votre machine
    npm run speedrun:livesplit -- serve --port=7778 --origin=https://wanoo.github.io
    

    --livesplit=ws://… désigne une autre adresse de LiveSplit.

  1. Des temps LiveSplit depuis un run : écrire un fichier LiveSplit .lss avec les temps intermédiaires d’un run comme record personnel.

    # dans le dépôt du moteur, sur votre machine
    npm run speedrun:livesplit -- export run.wsrun --names=Pantry,Garden,Market --out=run.lss
    

    Sans --names, les segments portent les identifiants des temps intermédiaires ; sans --out, le fichier est écrit à côté du run.

Résultat attendu, et comment le vérifier

Erreurs fréquentes

SymptômeCauseCorrection
Pas de ligne Speedrun dans le menu de pauseLe jeu ne déclare aucune catégorieRien à faire : ce jeu n’a pas de speedrun
L’incrustation reste sur « waiting for a run… »La page a été ouverte sans ?speedrunTool=<port>, ou avec un autre portRechargez le jeu avec le port de l’incrustation dans l’adresse
L’incrustation ne reçoit rien d’un jeu déployéL’outil n’accepte par défaut que les origines du serveur de développementRelancez-le avec --origin=<l’adresse du jeu>
LiveSplit ne bouge pasSon serveur WebSocket n’est pas démarréLiveSplit › Control › Start WebSocket Server
Le run ne démarre pasLa catégorie n’a pas pu démarrer (le message dit pourquoi)Lisez le message ; signalez-le à l’auteur du jeu

Fichiers ou données modifiés

Dans le navigateur : les morceaux du run et vos records dans IndexedDB (web-scumm-runs). Sur le disque : le .wsrun que vous exportez, le .lss qu’écrit export. Les outils ne gardent rien.

Reprise ou retour arrière

Abandonner le run termine une tentative (comptée comme abandon). Un run repris après un plantage continue depuis son dernier morceau ; un run ne peut pas être repris dans un autre monde ni avec une autre preuve. Un run envoyé à un classement sur un Bridge se supprime avec le jeton donné par le Bridge à l’envoi (Confidentialité).

Limites

Limite · integrity-not-authenticity La chaîne prouve qu’un fichier n’a pas été modifié après son scellement, pas que le joueur était honnête : pauses, menus, sauvegardes, temps réel et entrées utilisées sont la parole du joueur. Un run dont un script a choisi les entrées se rejoue comme valide ; seul un témoin ou un modérateur l’écarte.

Limite · livesplit-obs-not-tried OBS et LiveSplit ne sont testés que par des machines. Une vraie session par une personne, c’est la passe livesplit-obs, ouverte (#81) à la 4.4.0.

Références


Modifier la source de cette page · Signaler une erreur