尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Un jeu de quiz multijoueur en ligne (FR / EN) qui tourne entièrement dans le navigateur : l'hôte crée une partie, les autres rejoignent avec un code, et les questions s'enchaînent avec scores, pouvoirs, bonus, chat et podium. Les joueurs sont reliés en pair-à-pair via PeerJS : aucun serveur n'est nécessaire pour jouer.
🎙️ Chat vocal à plusieurs dans la salle (bouton en bas à gauche) : rien à installer, aucun serveur à toi — voir « Chat vocal » plus bas
🔗 Lien d'invitation : l'hôte copie un lien …/?room=123456, le camarade l'ouvre et n'a plus qu'à entrer son prénom
232 thèmes, environ 14 800 questions de texte (210 fichiers de banque), soit ≈ 18 400 questions au total une fois les questions avec image comptées (mesuré au chargement de la page) : 16 thèmes dessinés par le jeu et ≈ 700 questions avec image ajoutées à tous les thèmes (tirées à chaque partie) (4 niveaux : facile, moyen, difficile, impossible)
Tes propres questions (gestionnaire intégré) et des QCM générés à partir d'un cours (PDF, Word, PowerPoint, ODP, Excel, EPUB, page web, audio, vidéo…), avec les images du cours pour les PDF
Modération stricte du chat (voir plus bas)
Anti-triche progressif : avertissements, malus, puis exclusion jusqu'à la fin de la partie
Questions avec image ou vidéo YouTube (agrandissables), dont quatre thèmes dessinés par le jeu : questions en images (« de quelle couleur est le pull ? »), Code de la route en images (panneaux, feux, priorités à une intersection, rond-point, vitesse selon la météo), Drapeaux en images et Lire l'heure (horloge à aiguilles)
Statistiques et graphiques de chaque partie (classement, évolution des scores, séries de bonnes réponses, réponses les plus rapides, répartition des temps, faits marquants, analyses avancées : course au classement, forme du moment, qui a mené la partie), historique des 12 dernières parties, export PDF clair ou sombre (tableaux + tous les graphiques) et CSV
📜 L'historique de toutes les mises à jour est dans CHANGELOG.md.
Ouvre simplement index.html dans un navigateur, ou publie le dossier tel quel (GitHub Pages, n'importe quel hébergement statique).
Le jeu fonctionne aussi en ouvrant le fichier directement (file://).
Pour tester en local avec un petit serveur :
python3 -m http.server 8000 # puis http://localhost:8000/
Le fichier unique index.html (1,9 Mo) a été découpé. Le comportement du jeu est inchangé.
index.html page + ordre de chargement des scripts
css/
base.css styles de base
features.css styles des fonctionnalités (chat, pouvoirs, podium…)
qcm.css styles de la fenêtre « QCM depuis un cours »
v40.css anti-triche, questions avec média, statistiques
v57.css écran de configuration : résumé, difficulté, code à partager
v58.css outils de l'hôte : jamais jouées, difficulté progressive, thèmes favoris
v59.css pronostic de fin, question piège, Brouillard, cases de « Modes fun »
v43.css voix off (réglages), justification de la réponse, horloge permanente et roue des bonus / malus
voicechat.css bouton et panneau du chat vocal
js/
core/ moteur du jeu (réseau, joueurs, questions, scores…)
patches/ évolutions successives, chargées dans l'ordre des numéros
moderation/ lexique + moteur de modération
qcm/ générateur de QCM (generator.js), formats de cours (formats.js), transcription audio / vidéo (transcribe.js),
lecture des fichiers et des liens (extract.js), interface (ui.js)
data/ questions : banque d'origine + data/bank/NNN-theme.js (un fichier par thème)
+ visual-questions.js (thème « Questions en images », généré à chaque partie)
+ road-questions.js (thème « Code de la route en images », généré à chaque partie)
+ image-themes.js (thèmes « Drapeaux en images » et « Lire l'heure », générés à chaque partie)
+ image-more.js (8 thèmes de plus : 51 drapeaux, partition, dés, boussole, thermomètre, solides, chiffres romains, graphiques)
+ image-mix.js (questions avec image ajoutées à TOUS les thèmes, sans rien remplacer)
media/ media.js : validation et affichage des images / vidéos YouTube / illustrations SVG
stats/ analysis.js (calculs), charts.js (graphiques SVG), pdf.js (export PDF), stats.js (capture + tableau de bord)
voice/ voice.js : voix off (la question est lue à voix haute, synthèse vocale du navigateur)
justif/ justif.js : justification après chaque réponse (bonne ou mauvaise)
clock/ clock.js : horloge permanente HH:MM:SS en bas à gauche
wheel/ wheel.js : roue des bonus et malus (entre deux manches)
fix/ scroll-top.js : chaque nouvelle question s'affiche en haut de la page
invite/ invite.js : lien d'invitation (?room=123456) — bouton dans le salon, code pré-rempli à l'ouverture
voicechat/ voicechat.js : chat vocal WebRTC en maillage via PeerJS (logique testable + interface)
php/
qcm.php OPTIONNEL — extraction, lecture de liens, transcription et mode IA côté serveur (voir plus bas)
tests/ tests Node (modération, QCM, formats, banque, médias, questions en images, code de la route / drapeaux / horloges en images, statistiques, PDF, justifications / voix off)
Ce sont des scripts classiques (pas de bundler, pas de build) : l'ordre des balises <script> de index.html compte.
Dans une salle (salon d'attente, partie, résultats), le bouton 🎙️ apparaît en bas à gauche. « Rejoindre le vocal » demande l'accès au micro (si tu refuses ou si tu n'as pas de micro, tu rejoins en écoute seule). Chacun peut couper son micro, couper le son des autres ou quitter le vocal, et voit qui parle (liseré vert). Un badge indique combien de personnes sont déjà au vocal.
Tester son micro et son son. Le panneau contient un bloc de test, disponible avant comme pendant le vocal, sans avoir besoin d'une deuxième personne : « 🎤 Tester mon micro » affiche une barre de niveau en direct (elle doit bouger quand tu parles) et confirme « Ton micro fonctionne » ; la case « M'entendre » te renvoie ta voix (mets un casque) ; « 🔔 Tester le son » joue un bip pour vérifier ta sortie audio. Avant de rejoindre, le test ouvre le micro puis le libère ; pendant le vocal, il mesure le micro déjà ouvert (aucune nouvelle autorisation) et l'arrêter ne coupe pas le vocal. Un micro refusé, absent, coupé ou un vocal en écoute seule sont expliqués clairement. Le test s'arrête tout seul au bout de 30 s, quand tu fermes le panneau, quand tu rejoins/quittes le vocal ou quand tu coupes ton micro. Ta propre ligne s'allume aussi quand tu parles.
Qui parle, durée de l'appel, temps de parole. Une pastille à côté du bouton 🎙️ (visible même panneau fermé) affiche la durée de ton appel et le nom de ceux qui parlent en ce moment ; dans le panneau, la ligne de chaque participant s'allume quand il parle et affiche son temps de parole cumulé.
Transcription. Dans le panneau, « 📝 Transcrire ma voix » (désactivé par défaut) écrit ce que tu dis, dans la langue choisie (français, anglais, espagnol, allemand, italien, portugais). Chacun ne transcrit que sa propre voix ; l'hôte relaie les phrases, en texte, aux seules personnes au vocal, et l'auteur d'une phrase est celui de la connexion réseau (impossible d'écrire au nom d'un autre). Les phrases (280 caractères, 8 par tranche de 10 s) s'affichent avec le temps écoulé depuis ton arrivée au vocal (l'export .txt porte l'heure réelle, identique pour tous) ; Elle se met en pause quand ton micro est coupé et repart quand tu le réactives. Graphiques et PDF. Sous la transcription, le panneau affiche en direct un graphique des mots les plus dits (hors mots-outils comme « le », « que », « the ») et de qui parle le plus. « 📄 PDF avec graphiques » télécharge un vrai PDF généré dans le navigateur, sans bibliothèque ni serveur (js/voicechat/transcript.js) : chiffres clés (durée, participants, phrases, mots), mots les plus dits, nombre de mots par personne, temps de parole mesuré au micro, mots préférés de chacun, activité au fil de l'appel, puis la transcription complète avec l'heure réelle de chaque phrase. Les accents français sont gérés ; les emoji sont retirés du PDF. Les mots-outils filtrés couvrent le français, l'anglais, l'espagnol, l'allemand, l'italien et le portugais.
Rapport d'appel « au cas où ». Les exports PDF et ODT fonctionnent même sans aucune transcription : ils donnent alors un rapport d'appel (durée, participants, temps de parole mesuré au micro avec graphique) ; ils restent disponibles après avoir quitté le vocal (rapport du dernier appel, jusqu'au prochain). Dès que des phrases existent, le rapport s'enrichit des mots les plus dits, de l'activité et de la transcription complète.
Trois formats d'export. « 📄 Rapport PDF avec graphiques », « 📝 Rapport (.odt) » (même contenu, modifiable dans LibreOffice, Word, Google Docs ou Pages ; l'archive OpenDocument est écrite sans bibliothèque, les graphiques y sont des barres █ dans des tableaux) et « 💾 Texte (.txt) » ; « 📋 Copier le texte » met la transcription dans le presse-papiers.
Limites : elle repose sur la reconnaissance vocale du navigateur (Chrome, Edge et Safari ; absente de Firefox, où l'on voit quand même ce que disent les autres) ; sur Chrome et Edge, ce service envoie l'audio au fabricant du navigateur, ce que le panneau rappelle. La précision dépend du micro et de l'environnement. La transcription n'est conservée que dans la page (rien n'est stocké) et repart à zéro à chaque nouvel appel.
Comment ça marche. Les participants se relient directement entre eux en WebRTC (peer.call de PeerJS) : chaque joueur appelle chaque autre, l'audio ne passe par aucun serveur. L'hôte tient la liste des participants au vocal et la diffuse sur le réseau du jeu ; pour une paire de joueurs, celui dont l'identifiant est le plus petit appelle (jamais deux appels pour la même paire). Les appels coupés sont relancés automatiquement. PeerJS ne sert qu'à la mise en relation (son serveur public gratuit, déjà utilisé par le jeu) : aucun serveur n'est à installer ni à payer.
Limites à connaître.
http://localhost aussi).tests/voicechat.test.js), les statistiques et le PDF (tests/transcript.test.js) et l'interface dans un mini-DOM (tests/browserglue.test.js) ; un essai avec de vrais micros sur deux appareils reste à faire après chaque mise en ligne.Chaque message est analysé avant l'envoi (côté joueur) et à la réception (côté hôte, qui fait foi). Un message interdit est supprimé instantanément, y compris chez les joueurs qui l'auraient déjà reçu.
Messages d'une seule lettre (« a », « k », « 5 », « a ! »…) : supprimés automatiquement — jamais envoyés, jamais affichés chez les autres, jamais comptés dans les statistiques ; l'expéditeur voit « 🗑️ Message d'une seule lettre supprimé automatiquement » et la règle vaut aussi à la réception (hôte et joueurs) et pour la modification d'un message. Les mots de 2 lettres (« ok », « si ») passent.
Détection notamment de :
B ⏎ I ⏎ T ⏎ E), même avec des lignes vides ou du texte autour ;b i t e, b.i.t.e, b!i!t!e) ;biiiite), leet (p@ute, m3rde), caractères de largeur nulle, lettres homoglyphes (cyrillique, grec, pleine largeur).Contournement par épellation (bannissement). Envoyer un mot lettre par lettre (« b », « i », « t », « e » en quatre messages) ne trompe plus le filtre : l'hôte garde les « morceaux » (1 à 4 caractères) de chaque joueur pendant 5 minutes, même si d'autres messages sont intercalés (messages de l'hôte compris). Si les morceaux (espacés de moins de 2 minutes) forment un mot interdit (« b » « i » « t » « e », mais aussi « bit » + « e » ou « b » + « ite »), ou si le joueur envoie 3 lettres isolées différentes en 5 minutes, il est banni automatiquement : ses morceaux disparaissent du chat de tout le monde, il est retiré de la partie, son pseudo et son identifiant sont refusés s'il tente de revenir (jusqu'à ce que l'hôte ferme la page), les autres joueurs sont prévenus et l'hôte retrouve la ligne dans son journal. Deux lettres isolées différentes en 60 secondes (« b » puis « i ») suppriment immédiatement la seconde (et la première) avec un avertissement ; la troisième lettre différente entraîne le bannissement. Trois lettres seulement 2 à 2 différentes (« a b a ») suppriment aussi le message avec un avertissement. Les nombres seuls (compte à rebours « 3, 2, 1 ») et les mots courts (« ok », « lol ») ne sont pas touchés ; une lettre isolée seule n'est pas une anomalie. Limites : un joueur banni peut revenir avec un autre pseudo ; des lettres espacées de plus de 3 minutes, ou réparties entre plusieurs joueurs, ne sont pas détectées.
Sanctions progressives par joueur : 1ᵉʳ message interdit → avertissement ; 2ᵉ → sourdine 1 min ; 3ᵉ → 5 min ; 4ᵉ et suivants → 15 min. La sourdine se lève d'elle-même à la fin de sa durée (le joueur est prévenu) et le compteur repart à zéro après 10 minutes sans infraction. Le journal de modération est visible côté hôte.
Aucun filtre n'est parfait : le lexique est dans js/moderation/lexicon.js, facile à compléter.
Bouton « QCM depuis un cours » sur l'accueil et dans le gestionnaire de questions :
Une bonne réponse différente par question. Le générateur n'utilise jamais deux fois la même bonne réponse dans un QCM (« Cellule » et « cellules » comptent pour une seule, accents et majuscules ignorés) et répartit les bonnes réponses sur les quatre positions (jamais trois fois de suite la même). Si le cours est trop court pour le nombre demandé, le jeu produit moins de questions et l'explique plutôt que de répéter les mêmes réponses — ajoute du texte pour en obtenir davantage. La même règle s'applique au mode IA.
Jouer à plusieurs : le bouton principal de la fenêtre d'options est « 👥 Générer et jouer à plusieurs » : il génère les questions, crée la salle avec le thème du cours seul (mode révision) et s'arrête dans le salon d'attente. Tu partages le code ou le lien d'invitation (« 🔗 Copier le lien d'invitation »), tes camarades rejoignent depuis n'importe quel appareil, puis tu lances la partie ; le chat vocal 🎙️ est disponible dans la salle.
Jeu direct (seul) : sur la fenêtre d'options, « ▶️ Générer et jouer seul » tire les questions du cours, les ajoute toutes, crée ta salle solo, ne garde que le thème du cours et lance la partie — sans passer par la liste de relecture. « ✨ Générer et relire » garde l'ancien parcours (décocher des questions avant d'ajouter) ; dans la relecture, la barre « ▶️ Ajouter et jouer maintenant · 👥 Ajouter et réviser à plusieurs · ➕ Ajouter » reste collée en bas de la fenêtre (plus besoin de défiler jusqu'au bout des 20 questions). Si la salle ne peut pas s'ouvrir (connexion), un bandeau rouge reste affiché jusqu'au clic sur OK.
js/qcm/images.jsPour un PDF, le jeu récupère les images du cours (schémas, photos, figures bitmap) et les rattache aux questions dont la phrase source se trouve sur la même page (3 images par page au plus, 12 au total, ≈ 640 px de large, compressées en JPEG). Les doublons, logos répétés, bandeaux et petites icônes sont écartés. Dans l'aperçu, chaque question concernée affiche sa miniature, et la case « Inclure les images du cours » permet de les retirer ; en partie, l'image s'affiche (agrandissable) avec la question, comme pour les questions avec image du gestionnaire. Limites : seules les images bitmap d'un PDF sont reprises (pas les figures vectorielles ni les images de Word / PowerPoint / ODP), et le mode IA n'en reçoit pas. Les tests utilisent pdf.js 6.x en local ; la page charge pdf.js 3.11.174 depuis cdnjs, dont l'extraction d'images n'a pas pu être exécutée ici (téléchargement bloqué).
| Type | Formats | Comment c'est lu |
|---|---|---|
| Documents | PDF, Word (DOCX), ODT, RTF, TXT, Markdown, JSON | sur ton appareil |
| Présentations | PowerPoint (PPTX), LibreOffice Impress (ODP) — diapositives et notes | sur ton appareil |
| Tableurs | Excel (XLSX), ODS, CSV / TSV | sur ton appareil |
| Livres / pages | EPUB, HTML enregistré | sur ton appareil |
| Sous-titres | SRT, VTT, SBV, ASS / SSA, LRC (les répétitions sont retirées) | sur ton appareil |
| Audio | MP3, WAV, M4A / AAC, OGG / Opus, FLAC | transcrit (voir ci-dessous) |
| Vidéo | MP4, WebM, MOV, MKV (piste son) | transcrit (voir ci-dessous) |
| Liens | page web, Wikipédia, fichier en ligne | voir ci-dessous |
Pas de lecture directe, avec explication dans le jeu : les anciens formats binaires (DOC, PPT, XLS : enregistre-les en DOCX / PPTX / XLSX), Pages / Keynote / Numbers, les images et les PDF scannés (il faudrait une reconnaissance de caractères).
Canva, Google Slides / Docs / Drive, OneDrive, YouTube : ces services ne laissent pas lire leur contenu depuis un simple lien (sinon n'importe quel site pourrait lire tes documents privés). Le jeu te l'indique et te dit quoi faire : pour Canva, Partager › Télécharger › PDF (ou PowerPoint) puis dépose le fichier ; pour Google, Fichier › Télécharger ; pour YouTube, télécharge le sous-titre ou l'audio. Aucune connexion à ces comptes n'est faite.
Audio et vidéo → texte. Deux voies :
Liens. Le jeu essaie d'abord de lire la page directement ; beaucoup de sites l'interdisent depuis un autre site (règle « CORS »). Dans ce cas : enregistre la page / imprime-la en PDF, copie-colle le texte, utilise le serveur PHP du jeu, ou coche l'option « service de lecture externe » (r.jina.ai : l'adresse de la page est alors envoyée à ce service tiers ; désactivée par défaut). Les pages qui se construisent en JavaScript ou réservées aux membres ne peuvent pas être lues.
Deux méthodes de génération :
Les questions sont stockées dans le navigateur (localStorage) et ne sont utilisées que lorsque tu es l'hôte. Relancer le même cours remplace l'ancien lot au lieu de s'accumuler.
Pour lire PDF, DOCX, PPTX, ODP, ODT, XLSX, ODS et EPUB, la page charge pdf.js / JSZip depuis cdnjs à la demande (connexion requise à ce moment-là) ; le texte brut, le HTML, le RTF, les sous-titres et le texte collé n'en ont pas besoin. Si le chargement échoue et que php/qcm.php est disponible, l'extraction se fait côté serveur.
GitHub Pages n'exécute pas PHP : ce mode demande un hébergement PHP (≥ 7.4, extension cURL). Rien n'est écrit en dur dans le dépôt.
export ANTHROPIC_API_KEY="sk-ant-…"
export QCM_ACCESS_CODE="un-mot-de-passe" # fortement recommandé
export ANTHROPIC_MODEL="claude-sonnet-5-5" # facultatif
ou crée php/config.local.php (ignoré par git) :
<?php return ['anthropic_key' => 'sk-ant-…', 'model' => 'claude-sonnet-5-5', 'access_code' => 'un-mot-de-passe'];
⚠️ Chaque génération IA consomme du crédit API et le texte du cours est envoyé à l'API. Par sécurité, le mode IA, la transcription par le serveur et la lecture de liens par le serveur sont désactivés tant que QCM_ACCESS_CODE n'est pas défini (sinon n'importe qui pourrait utiliser ton crédit ou ton serveur). Sans PHP, sans clé ou sans code, le jeu bascule simplement sur le mode rapide / la lecture dans le navigateur.
php/qcm.php ajoute, si ton hébergement exécute PHP (cURL ; ffmpeg recommandé) :
?action=fetch : lit une page web côté serveur, ce qui évite les blocages CORS du navigateur. Protection SSRF : seules les adresses http(s) publiques sont acceptées (adresses locales, privées, IPv6 non publiques et notations décimales / hexadécimales refusées), chaque redirection est revérifiée, l'adresse IP contrôlée est celle qui est utilisée, 8 Mo et 15 s maximum ;?action=transcribe : transcrit un audio / une vidéo avec une API compatible OpenAI (« Whisper »). Le son est découpé par ffmpeg en morceaux de 10 minutes (90 minutes maximum). Configuration : STT_API_KEY (obligatoire), STT_API_URL (défaut : API OpenAI), STT_MODEL (défaut whisper-1) — ou les clés stt_key, stt_url, stt_model de php/config.local.php.Le fichier audio est alors envoyé à ton serveur puis au service de transcription que tu as choisi. Les deux actions exigent un code d'accès configuré ; sans lui, elles sont refusées et le jeu reste sur la voie « navigateur ».
Une infraction = quitter la page pendant une question (changement d'onglet ou d'appli, perte du focus) avant d'avoir répondu. Au plus une infraction par joueur et par question. C'est l'hôte qui compte et décide :
| Infractions du joueur | Conséquence |
|---|---|
| 1 et 2 | avertissement (aucune sanction) |
| plus de 2 (3ᵉ et 4ᵉ) | malus : −250 points et chrono réduit de 25 % pendant 2 questions (« Minuterie piégée ») |
| plus de 4 (5ᵉ) | exclusion : le joueur est retiré de la partie et attend la fin de celle-ci (un écran le lui explique), puis il est libéré pour la suivante |
Les autres joueurs sont prévenus. La question en cours ne bloque pas sur un joueur exclu. L'hôte peut désactiver l'anti-triche dans les réglages de la partie.
Les seuils sont dans js/patches/039-v40-anti-triche.js (V40CheatPolicy) et testés dans tests/media.test.js.
Limites, à connaître : la détection tourne dans le navigateur du joueur — quelqu'un de technique peut la contourner ou jouer sur un second appareil ; l'hôte reçoit les avertissements et malus mais ne peut pas être exclu (la partie dépend de lui).
Dans le gestionnaire de questions, une question peut avoir un média : une image (lien https://… ou fichier envoyé, compressé automatiquement),
un lien YouTube (youtube.com/watch, youtu.be, shorts, embed… avec début optionnel ?t=1m30s) ou, pour les questions générées, une illustration SVG.
Le média s'affiche au-dessus de la question chez tous les joueurs et un bouton « Agrandir » le passe en plein écran (Échap ou toucher pour fermer).
Il est conservé à l'export / import des questions.
youtube-nocookie.com dans un cadre isolé, construit à partir de l'identifiant (11 caractères) : aucun autre domaine n'est accepté.Le thème intégré 🖼️ Questions en images crée à chaque partie de petites scènes (personnes avec un pull, un pantalon ou un chapeau de couleur, formes, ballons, étoiles…).
Les réponses sont calculées à partir de ce qui est dessiné (tests/visual.test.js relit chaque dessin pour le vérifier). Ce sont des illustrations originales, en français.
Le thème 🚦 Code de la route en images fonctionne de la même façon (≈ 110 questions par partie, nouveaux dessins à chaque partie) :
Les thèmes 🏳️ Drapeaux en images (30 drapeaux à bandes, croix nordiques, disques et croix suisse, sans armoiries) et 🕐 Lire l'heure (horloge à aiguilles : heures pleines, quarts d'heure, puis toutes les 5 minutes) suivent la même règle ; tests/images.test.js relit les couleurs dessinées et l'angle des aiguilles.
js/data/image-more.js)Huit thèmes de plus, dessinés par le jeu (SVG, aucune image extérieure) et régénérés à chaque partie :
tests/more.test.js la relit dans le SVG avec des tables indépendantes (noms, familles de couleurs de chaque drapeau, graduation du thermomètre, angle de la flèche, hauteur des barres…).js/data/image-v50.js)Dessinés par le jeu (SVG, aucune image extérieure) et régénérés à chaque partie, 196 questions par partie :
tests/v50img.test.js relit chaque réponse dans le SVG : éléments comptés, couleurs lues, angle des aiguilles, bras des angles mesurés, axes de symétrie recalculés géométriquement (réflexions qui renvoient la figure sur elle-même), parts coloriées, points de la grille.js/data/image-mix.js)Chaque thème reçoit, en plus de ses questions de texte (aucune n'est remplacée ni supprimée), quelques questions avec image — environ 12 % de la taille du thème, entre 3 et 8 — retirées au sort à chaque partie. Il y en a ≈ 700 en tout, sur les 157 thèmes :
tests/mix.test.js relit chaque dessin (émoji, nombre de côtés, parts coloriées, opération, drapeau) et vérifie que la bonne réponse correspond, avec des tables indépendantes du générateur.
Les dessins sont des schémas simplifiés, pas des reproductions officielles des panneaux. tests/road.test.js relit chaque dessin (panneau, bras de l'intersection, lampe allumée, météo) et vérifie la bonne réponse indépendamment du générateur.
Le bouton 📊 (barre latérale, écran des résultats ou accueil) ouvre un tableau de bord. Pendant la partie, l'hôte note chaque réponse et envoie le journal à tous les joueurs (même un joueur exclu) : tout le monde voit les mêmes chiffres. Onglets :
Chaque graphique se survole / se touche (infobulle), a une version Tableau et la légende masque ou affiche un joueur sans changer les couleurs des autres. Les bonus et malus sont notés par l'hôte (évènement « v35Event ») et envoyés aux joueurs comme le reste du journal.
V40Analysis.reactionStats (testés par tests/reaction.test.js).Le bouton 📋 Récap copie un résumé prêt à coller dans un message (podium avec médailles, réussite du groupe, plus longue série, réponse la plus rapide, question la plus difficile).
Export CSV de toutes les réponses (compatible tableur) et export 📄 PDF, au choix en fond clair (impression) ou en fond sombre (écran) via les boutons « 📄 PDF clair » et « 🌙 PDF sombre » : classement, tous les graphiques de l'écran en vectoriel (évolution des scores, course au classement, forme du moment, qui a mené, bonnes / mauvaises réponses, séries, temps, réussite par question, thème / difficulté, roue, malus reçus, points gagnés / perdus, bilan net, types de pouvoirs, qui vise qui, cumuls), grille joueurs × questions, détail de chaque question, infractions et tableau « Bonus et malus ». Seul l'historique multi-parties n'y figure pas (il n'est pas dans le journal d'une partie). Le PDF est généré dans le navigateur, sans bibliothèque externe ni connexion, en vectoriel (net à tout zoom, texte sélectionnable) ; les emojis, absents de la police intégrée, en sont retirés. Les deux palettes de séries sont validées pour leur fond et les daltoniens ; au-delà de 8 joueurs, les courbes montrent les 8 premiers arrivés et les autres figurent dans les tableaux.
Les journaux reçus par le réseau sont nettoyés et bornés avant usage (V40Analysis.normalize).
js/voice/voice.js)Chaque question est lue à voix haute au moment où elle s'affiche, avec la synthèse vocale du navigateur (gratuite, sans compte, aucune donnée envoyée). Le réglage est personnel (gardé dans le navigateur de chaque joueur) : bouton 🗣️ du dock →
La lecture s'arrête dès qu'on répond, quand la correction apparaît ou à la question suivante, et respecte le bouton « Son ON / OFF ». Les symboles sont dits en toutes lettres (« × » → « fois », « % » → « pour cent »…) et les emojis sont ignorés. Le narrateur 🔊 existant (« Bonne réponse / Mauvaise réponse ») est inchangé. Si le navigateur n'a pas de synthèse vocale, le panneau l'indique. La qualité de la voix dépend de l'appareil.
js/justif/justif.js)Après chaque réponse, une carte explique le résultat, selon le cas :
La carte est complétée environ une seconde plus tard avec les statistiques de la manche (« 1 joueur a trouvé la bonne réponse sur 2 »). Le texte est calculé à partir des données de la question : la banque ne contient pas d'explication écrite à la main pour chaque question, donc rien n'est inventé ; quand aucune phrase fiable ne peut être construite, la carte se limite à la bonne réponse, à la correction existante et à la statistique.
js/clock/clock.js)L'heure HH:MM:SS (24 h, en gras) s'affiche en bas à gauche, sur tous les écrans : accueil, salons, question, correction, résultats, fenêtres ouvertes. Elle se place juste au-dessus du bouton « Son ON / OFF », ne capte jamais un clic et se recale sur le début de chaque seconde (et au retour sur l'onglet). C'est l'heure de l'appareil de chaque joueur (pas une heure serveur : si l'horloge d'un téléphone est déréglée, elle l'est aussi à l'écran). Elle n'apparaît pas à l'impression.
js/patches/041-v50-bonus-malus.js, css/v50.css)showPowerPanel) qui décide. L'écran ne bloque jamais les clics (pointer-events:none), disparaît seul en 2,6 s et devient une simple apparition douce si l'appareil demande moins d'animations (prefers-reduced-motion).js/patches/042-v50-reglement.js) : 13 articles en français, anglais et espagnol (déroulement, scores, séries, difficultés, pouvoirs, boucliers, roue, tricherie, chat et voix, filigrane…), construits à partir des vrais noms des pouvoirs.node tests/v50.test.js.js/patches/043-v51-mi-partie.js, css/v51.css)v51Half, attend 7 secondes (barre de temps), puis lance la question suivante. Un joueur peut le fermer (✕) pour lui seul ; il disparaît aussi tout seul. Une seule fois par partie, y compris pour une partie à plusieurs à partir d'un cours.textContent, jamais en HTML. Le mouvement réduit (prefers-reduced-motion) est respecté.node tests/half.test.js.
node tests/teams.test.js # équipes : répartition, choix, chat d'équipe (relais, modération, anti-spam), bouton classement de l'hôte
node tests/poll.test.js # sondage éclair : brouillon, vote unique, résultats, données reçues, branchement
node tests/keys.test.js # raccourcis clavier de réponsejs/patches/043-v51-mi-partie.js, 044-v52-equipes.js)js/patches/044-v52-equipes.js, css/v52.css)S'appuie sur le mode de jeu 👥 Équipes (window.v9GameMode === "teams").
textContent.node tests/teams.test.js.js/stats/analysis.js → awards, onglet « 🏆 Trophées », bloc sur l'écran de fin)Des prix décernés d'après le journal de la partie, calculés chez chaque joueur : 🥇 Champion, ⚡ Éclair (bonne réponse la plus rapide), 🎯 Le plus précis, 🔥 Série en or (3 bonnes réponses d'affilée ou plus), 💥 Gros coup (plus gros gain sur une question), ✨ Sans faute, 🧗 Briseur de difficile, 🧐 Le plus réfléchi, 👑 Roi de la partie (le plus longtemps en tête), 🎢 Remontada (+2 places ou plus).
Un trophée à égalité est partagé ; il n'est pas décerné quand il ne distingue personne (tout le monde à égalité, ou personne n'a assez joué). Le champion et le roi n'existent qu'à partir de 2 joueurs.
L'écran de fin affiche les trophées et « Tes trophées » (retrouvés par ton prénom) ; un clic ouvre l'onglet détaillé. Ils sont aussi dans le 📋 Récap copiable et dans les PDF.
🖼️ Ma carte de résultat (en bas de l'onglet 🏆) : une image avec ton rang (« 2e sur 3 »), ton score, ta réussite, ta meilleure série, ta réponse la plus rapide, la courbe de ton score question après question et tes trophées. 📋 Copier l'image ou ⬇️ PNG. Elle porte le filigrane « qui-suis-je-officiel » ; seul l'hôte peut le retirer (comme pour les autres images).
js/patches/045-v53-sondage.js, css/v53.css)textContent.node tests/poll.test.js.js/patches/046-v53-raccourcis.js)Touches 1 2 3 4 (rangée du haut, pavé numérique, y compris clavier AZERTY sans Maj) ou A B C D. Une pastille rappelle la touche sur chaque réponse (masquée sur écran tactile). Rien ne se passe quand tu écris dans un champ (chat, sondage…), quand une fenêtre est ouverte, avec Ctrl / Alt / ⌘ ou touche maintenue. Tests : node tests/keys.test.js.
js/patches/047-v54-salles.js, css/v54.css)node tests/rooms.test.js (décisions d'entrée, mot de passe, essais limités, données reçues, branchement du code) et, avec Playwright, node tests/e2e/rooms.e2e.js (deux navigateurs, réseau simulé : salle privée, verrouillage, salle pleine, joueur refusé, usurpation, fiche truquée, fermeture, réouverture, hôte qui disparaît).
node tests/e2e/learn.e2e.js # (facultatif, Playwright) nouveaux thèmes, partie « Trouve la différence », justification dans les journaux et le PDFjs/patches/047-v54-salles.js, 048-v55-menus.js, 049-v56-prereglages.js, css/v55.css, css/v56.css)js/core/14-handle-data.js), les statistiques acceptent jusqu'à 9 999 joueurs. Le chat vocal en maillage reste prévu pour de petits groupes.node tests/rooms.test.js, node tests/menus.test.js, node tests/presets.test.js ; avec Playwright : node tests/e2e/rooms.e2e.js et node tests/e2e/menus.e2e.js (12 joueurs, expulsion, réglages après rechargement, préréglages, thèmes réellement joués).js/stats/analysis.js → duels, facts, limitPlayers ; onglets « 🤝 Duels » et « 📌 Faits marquants »)node tests/stats.test.js (duels, faits, coupe des grandes salles — mutations vérifiées), node tests/menus.test.js (liste bornée) et, avec Playwright, node tests/e2e/bigroom.e2e.js (réglage jusqu'à 9 999, avertissements, panneau borné avec 160 joueurs, onglets, journal de 300 joueurs).js/patches/050-v57-config.js, css/v57.css)getQuestionPool() ; il est mémorisé sur l'appareil et le résumé montre ce qu'il reste de questions.QSJ1.… : « Copier mon code » encode manches, temps, langue, difficulté et thèmes (texte court, sans accent, lisible partout) ; « Appliquer ce code » le relit, le nettoie (valeurs bornées, thèmes inconnus ignorés) et recoche les thèmes. Un code invalide affiche un message sans rien changer.node tests/config.test.js (code de config, filtres, durées, mutations vérifiées) et, avec Playwright, node tests/e2e/config.e2e.js (résumé, réparation, filtre de difficulté sur une vraie partie, code copié puis appliqué, anglais, création de salle avec script planté).js/stats/analysis.js → categoryReport, playerProfiles ; onglets dédiés des statistiques, et dans le PDF)node tests/stats.test.js (calculs, mutations vérifiées), node tests/pdf.test.js (un équivalent PDF pour chaque graphique d'écran) et, avec Playwright, node tests/e2e/stats.e2e.js.js/patches/051-v58-extras.js, css/v58.css)Une carte « ✨ Outils de l'hôte » s'affiche sous « Ta partie en un coup d'œil ».
node tests/extras.test.js (clés, mémoire, tirage, tri, favoris — mutations vérifiées) et, avec Playwright, node tests/e2e/extras.e2e.js (vraie partie en 20 questions, mémoire des questions posées, tirage, oubli, favoris, inversion).js/patches/052-v59-pouvoirs.js, 053-v59-pronostic.js, css/v59.css)🔮 Pronostic de fin : juste avant la dernière question (au moins 3 manches et 2 joueurs), une fenêtre de 15 s demande à chacun sa place finale (boutons 1 à N, ou une case numérique au-delà de 16 joueurs ; rappel de sa place du moment ; « Je ne parie pas » possible). Après la dernière question, le classement est établi (les ex æquo partagent la meilleure place) : place exacte → score ×2, sinon → score ÷2 (arrondi vers le bas), pas de pari → rien ne change. Le résultat s'affiche chez tous (ta ligne en premier : pari, place réelle, score avant → après), puis l'écran final arrive avec les scores réglés — les statistiques, le podium et le PDF utilisent ces scores. Le pari d'un invité est rattaché à sa connexion (jamais à l'identifiant écrit dans le message) ; les résultats reçus sont bornés (60 lignes) et nettoyés.
🕳️ Question piège : de temps en temps, une question est annoncée « piège » (bandeau + halo rouge) : bonne réponse = points ×5, mauvaise réponse = −300 pts (jamais sous 0). Jamais les 2 premières ni la dernière, jamais deux de suite, jamais sur une question en or, au plus 1 piège pour 5 questions. Fréquence réglable : rares (8 %), normaux (16 %), fréquents (30 %).
Les deux se règlent dans « 🎮 Modes fun » du salon (cases cochées par défaut). Les règles détaillées (article 13, en français, anglais et espagnol) les expliquent.
13 pouvoirs de plus (même chaîne que les autres : bouclier, Miroir, Hérisson, 2 malus actifs au maximum, rareté, « pas deux fois le même »). Bonus : 🎁 Cadeau surprise (+200 et +1 combo), 🎰 Machine à sous (+100 / +250 / +500 / +900), 🔭 Radar (+5 s par question, 2 q.), 💎 Rente (+100 par bonne réponse, 3 q.), 🦸 Rattrapage (15 % de l'écart avec le leader, de 150 à 900), 🪄 Magicien 🔵 (prochaine bonne réponse ×4), 🕊️ Trêve 🔵 (un bouclier neuf à chaque question, 3 q.). Malus : 💣 Mine (−300 s'il se trompe à la prochaine question), 🏷️ Dévaluation (sa prochaine bonne réponse rapporte moitié moins), 🎢 Montagnes russes (son combo tombe au hasard entre 0 et sa valeur), 🌫️ Brouillard (énoncé flou 4 s), 💀 Faucheuse 🔵 (−25 % du score, max 1 500), 🧛 Vampire 🔵 (tu lui voles 10 %, de 100 à 700).
Cases à cocher de « Modes fun » réparées : sans style propre elles s'affichaient à la taille 0 (invisibles) ; elles sont maintenant bien visibles.
Tests : node tests/v59.test.js (pouvoirs, mutations vérifiées), node tests/predict.test.js (classement, paris, règlement, résultat reçu du réseau, pièges, fréquences — mutations vérifiées) et, avec Playwright, (deux navigateurs, vraie partie : fenêtre de pari chez l'hôte et l'invité, paris reçus, règlement ×2 / ÷2 diffusé, écran final, piège ×5 / −300, pouvoirs dans les listes du jeu).
js/patches/054-v60-cours-prives.js, js/justif/justif.js)node tests/course.test.js (mutations vérifiées) et node tests/e2e/course.e2e.js (salle normale → absent ; salle de cours → présent et seul coché ; accueil → caché).node tests/justif.test.js, node tests/e2e/justif.e2e.js (vraie partie, bonne puis mauvaise réponse).js/stats/stats.js, js/stats/charts.js)node tests/e2e/stats.e2e.js (graphiques réels, changement de joueur, mémoire du choix, barre d'onglets en fenêtre étroite — mutations vérifiées).js/stats/mail.js, js/stats/mail-config.js, bouton « ✉️ E-mail » des statistiques)Le jeu n'a aucun serveur à lui : deux façons de faire arriver les stats dans une boîte e-mail.
La page appelle le service d'envoi gratuit EmailJS (https://api.emailjs.com, 200 e-mails par mois dans l'offre gratuite) : tu saisis l'adresse, tu appuies sur le bouton, le message arrive dans sa boîte (sans ouvrir de messagerie). C'est la seule requête réseau du module, faite uniquement au clic ; seuls l'adresse et le message de statistiques sont transmis à EmailJS. Le message est complet (bilan perso, récap du groupe, trophées, code de salle) et n'a pas la limite de longueur d'un lien mailto:. Le PDF n'est pas joint (pièces jointes payantes chez EmailJS) : utilise « 📎 Avec le PDF joint ».
Réglage, une seule fois (≈ 5 minutes, par l'organisateur du site) — je ne peux pas créer le compte à ta place :
{{subject}} · To Email = {{to_email}} · Reply To = {{reply_to}} · From Name = {{from_name}} · Content (mode HTML) = <div style="font-family:Arial,sans-serif;line-height:1.5">{{{message_html}}}</div> (trois accolades : le HTML est déjà échappé par le jeu). Note le Template ID.shawwnyy.github.io) pour que personne d'autre n'use ton quota.js/stats/mail-config.js sur GitHub et colle les 3 valeurs (serviceId, templateId, publicKey). Elles sont publiques par conception. Tous les joueurs peuvent alors utiliser « 📨 Envoyer maintenant ». Pour essayer avant, tu peux aussi les coller dans la fenêtre (« ⚙️ Activer l'envoi direct ») : elles sont alors gardées sur cet appareil seulement.Garde-fous : une seule adresse (sans espace, virgule ni ? & # = : /), au plus 1 envoi toutes les 20 s et 6 par heure et par appareil (le quota gratuit est partagé), seul le message fabriqué par le jeu part (le joueur ne tape que l'adresse), HTML échappé, délai de 15 s, messages d'erreur clairs (clé, service ou modèle introuvable, site non autorisé, compte à reconnecter, quota, pas de connexion).
mailto: avec le message déjà écrit (ton bilan perso en premier, puis le récap du groupe) ; Gmail et Outlook : page « nouveau message » préremplie ; 📎 Avec le PDF joint : menu de partage du téléphone avec le PDF (sur ordinateur : PDF téléchargé + e-mail préparé) ; 📋 Copier le message, 👀 Voir le message.mailto: est limité à ≈ 2 000 caractères (les émojis comptent double) : si le message est trop long, la ligne « trophées du groupe » puis la fin du récap sautent, ton bilan perso reste en haut, et le message complet est copié.node tests/mail.test.js (adresses, liens, longueur, requête EmailJS, limites, messages d'erreur ; le code n'appelle qu'api.emailjs.com — mutations vérifiées) et, avec Playwright, node tests/e2e/mail.e2e.js (vraie fenêtre avec un faux service d'envoi : réglage, envoi, erreurs, limite, panne réseau, messagerie, Gmail, Outlook, PDF ; aucune requête hors EmailJS). L'envoi réel n'a pas pu être essayé sans ton compte EmailJS.__proto__, constructor…) pouvait corrompre la liste des joueurs de tout le jeu : son arrivée est désormais ignorée, et le sondage comme les équipes ne reconnaissent un joueur que s'il existe vraiment dans la liste.host: true, « règles acceptées », score). Désormais l'identité vient de la connexion réseau pour tous les messages d'un invité, et la fiche du joueur est reconstruite par l'hôte.js/wheel/wheel.js)Une roue tourne entre deux questions. L'hôte choisit dans le salon d'attente (« 🎡 Roue des bonus / malus ») : moments fixes (après la 3e, la 6e, la 9e… manche, par défaut), moments aléatoires (de 1 à 6 roues à des manches tirées au sort au début de la partie, non annoncées, jamais avant la 2e manche ni après la dernière, jamais deux de suite) ou désactivée. Le choix est gardé dans le navigateur de l'hôte et figé au début de la partie ; les joueurs le subissent comme le reste des réglages de l'hôte. Jamais après la dernière manche ; pas de roue dans une partie de 3 manches ou moins en mode fixe. Chaque joueur tire sa propre case en même temps : l'hôte tire au sort (8 cases, toutes équiprobables : la taille d'une case est sa vraie probabilité) puis diffuse le résultat ; chacun voit la roue s'arrêter sur SA case, puis la liste des résultats de tous. La question suivante démarre juste après (≈ 9,5 s).
| Case | Effet |
|---|---|
| 💎 +300 · 💰 +1000 (jackpot) | points ajoutés |
| ⚡ ×2 | points doublés sur la prochaine question |
| 🛡️ Bouclier | bloque le prochain malus |
| 💸 −200 · 💥 −500 | points retirés (jamais sous 0 : « rien à perdre » si le score est à 0) |
| 🏛️ −15 % | impôt de 15 % du score (arrondi vers le bas) |
| 💔 Série | série de bonnes réponses remise à zéro |
Un bouclier déjà obtenu annule le malus et se consomme. Les effets sont appliqués uniquement par l'hôte ; les joueurs ne font qu'afficher (messages réseau bornés et nettoyés). Chaque tirage est noté dans le journal de la partie (type w_…, le joueur est sa propre cible) : la roue apparaît donc dans l'onglet « Bonus / Malus » et dans le PDF, comptée à part des pouvoirs lancés / visés mais incluse dans les points gagnés / perdus et le bilan net.
js/data/image-diff.js) : deux images côte à côte dessinées par le jeu (SVG), une à trois choses changent
(couleur, forme, taille, disparition, apparition) : « qu'est-ce qui a changé ? », « où ? », « combien de différences ? », « quelle forme ? ». Questions régénérées à chaque partie.
Chaque question porte une explication. tests/diff.test.js relit la réponse dans le SVG (attributs data-*) et vérifie que chaque mauvaise réponse est fausse.V43Justif.reportNote(q) (js/justif/justif.js) choisit la meilleure justification (cours > explication de la question > phrase > « À retenir »).
bonne_réponse et explication.js/patches/013, colle js/patches/055-v61-rapport-justif.js) : ligne « Pourquoi : … » sous chaque question ; l'export de l'historique l'affiche aussi.js/patches/056-v62-justifications.js, css/v62.css) : juste après le classement détaillé, UNE ligne par question de la partie
(juste ✅, fausse ❌ ou sans réponse ⏱️), à ouvrir. Chaque ligne donne, même pour une bonne réponse : la bonne réponse, la phrase ou l'explication de la question, ce que tu avais répondu,
un « Ne confonds pas » (ta mauvaise proposition est la bonne réponse d'une AUTRE question de la banque), un « Repère » pour les nombres, une question voisine du même thème
avec sa réponse, et un mot d'encouragement. Filtres « Toutes / À revoir », « Tout ouvrir ». Tout vient de la banque : rien n'est inventé (V43Justif.learn(), tests/justif.test.js).css/v62.css) : plein écran vert pour un bonus, rouge pour un malus (violet si le malus est bloqué), énorme émoji, texte géant, un clic n'importe où le ferme.js/patches/057-v62-lecture-chrono.js, V62Time) : les réponses sont verrouillées 2 à 7 s selon la longueur de la question (1,5 s en mode 5 secondes) avec
un bandeau « 📖 Lis la question… le chrono démarre dans N s » ; l'hôte fixe la durée (readMs) pour tout le monde et décale la fin de question d'autant. Les tours spéciaux (piège ×5, or ×2, éclair, chance) y sont annoncés en grand.tests/readtime.test.js, tests/e2e/clock.e2e.js, tests/e2e/finaljustif.e2e.js.js/patches/058-v63-feux-artifice.js, js/justif/fiches.js)V63Fx.plan, tests/fireworks.test.js).V63Fiches (tests/fireworks.test.js) ; essais de bout en bout : tests/e2e/fx.e2e.js (compte les sons réellement créés) et tests/e2e/finaljustif.e2e.js.js/patches/059-v64-voix-grave.js, js/data/variants.js, js/patches/060-v64-variantes.js)#v32Launch, côté hôte comme côté invités) : « La partie commence dans trois secondes. » (juste avant le « 3 »), « Deux. », « Un. », « Zéro. », puis « Bonne chance à toutes et à tous ! » ; la lecture de la 1re question vient ensuite. Elle annonce aussi « Dernière question ! » et les questions spéciales, et se tait avec « Son OFF ». Le timbre dépend des voix installées sur l'appareil. Pour que le navigateur l'autorise, elle est « débloquée » au premier clic/toucher ; le bouton Son ON dit « Voix activée. » pour confirmer qu'elle marche ; la lecture des questions (js/voice/voice.js) attend la fin de l'annonceur au lieu de le couper.#v64Side), à gauche de la colonne de boutons.v64: true, sont ajoutées à la fin de QUESTIONS (les index des traductions ne bougent pas), ne sont jamais citées comme « question voisine » dans les justifications, et un tirage de partie ne met jamais une question et sa variante dans les premiers tours (V64Variants.spread).
Pour changer le plafond : CAP dans js/patches/060-v64-variantes.js.
Tests : tests/voice64.test.js, , (annonces), .Un thème = un fichier js/data/bank/NNN-nom.js :
V35_BANK["🎻 Mon thème"]=[
"f|La question ?|La bonne réponse|Faux 1|Faux 2|Faux 3", // f = facile, m = moyen, d = difficile, i = impossible
];
Ajoute ensuite la balise <script src="js/data/bank/NNN-nom.js"></script> dans index.html, avant 999-register.js.
La bonne réponse est toujours en premier dans le fichier : le jeu mélange les réponses à l'affichage.
Un 7ᵉ champ facultatif donne l'explication de la bonne réponse (elle s'affiche dans « Correction » et dans les rapports) :
"m|Que signifie TVA ?|Taxe sur la valeur ajoutée|Faux 1|Faux 2|Faux 3|La TVA est un impôt sur la consommation."
js/review/review.jsUn QCM généré depuis un cours se joue « comme les parties d'avant » (combos, classement…) mais en mode révision :
Réviser à plusieurs : « 👥 Ajouter et réviser à plusieurs » (ou « 👥 Réviser à plusieurs » après l'ajout) crée la salle, ne garde que le thème du cours, règle les manches… et ne lance pas la partie : tu donnes le code à tes camarades, ils rejoignent depuis l'accueil, puis tu lances. Tout le monde reçoit les mêmes questions une par une, avec le mode révision (bonus seulement, justification détaillée du cours) et le classement de la salle.
Jouer tout de suite : à la fin de la génération, « ▶️ Ajouter et jouer maintenant » (ou « ▶️ Jouer maintenant » après l'ajout) crée une salle solo, ne garde que le thème du cours, règle le nombre de manches sur le nombre de questions ajoutées et lance la partie : les questions arrivent une par une, avec le mode révision automatique. (Nécessite la connexion au serveur PeerJS, comme toute salle.)
Réglage de l'hôte dans le salon (« 📚 Mode révision ») : Automatique (par défaut : révision si toutes les questions de la partie viennent d'un cours), Activé ou Désactivé. La décision est prise au début de la partie puis diffusée aux joueurs. Le passage est enregistré avec chaque question (≈ 700 octets) ; les questions générées avant cette version n'ont pas de passage et gardent la justification habituelle. Les modes de jeu explicites (Survie, etc.) ne sont pas modifiés. Pas de page affichée pour un cours qui n'est pas un PDF.
node tests/moderation.test.js # cas à bloquer / cas légitimes
node tests/qcm.test.js # générateur et lecture des fichiers de test
node tests/bank.test.js # valide toutes les questions (format, doublons, réponses ambiguës)
node tests/fireworks.test.js # recette du feu d'artifice, gerbes, fiches (partage, copie, rattrapage)
node tests/readtime.test.js # temps de lecture avant le chrono, « X a répondu · il reste N s »
node tests/diff.test.js # « Trouve la différence » / « Trouve l'intrus » : réponses relues dans le SVG, mauvaises réponses vérifiées fausses
node tests/bank.test.js "Football|Chess" # ne valider que certains thèmes (expression régulière)
node tests/media.test.js # liens YouTube / images, filtrage SVG, politique anti-triche
node tests/visual.test.js # chaque question en image est cohérente avec son dessin
node tests/road.test.js # code de la route en images : chaque réponse est recalculée en relisant le dessin
node tests/images.test.js # drapeaux et horloges : la réponse est relue sur le dessin (couleurs, angle des aiguilles)
node tests/more.test.js # 8 nouveaux thèmes en images : 51 drapeaux (couleurs), notes, dés, boussole, thermomètre, solides, chiffres romains, graphiques — réponse relue sur le dessin
node tests/chat.test.js # chat : messages d'une seule lettre supprimés (envoi, relais de l'hôte, réception, modification)
node tests/watermark.test.js # filigrane des images de graphiques : forcé pour les joueurs, au choix pour l'hôte
node tests/v50.test.js # 16 nouveaux pouvoirs (effets exacts, bouclier, plafonds), écrans vert / rouge, règlement FR / EN / ES
node tests/v50img.test.js # 8 thèmes en images de plus : chaque réponse relue dans le SVG (heure, angles, symétrie, fractions, coordonnées…)
node tests/half.test.js # classement à la moitié : moment, rangs et égalités, flèches, données reçues, enchaînement de l'hôte (minuteries simulées)
node tests/mix.test.js # images dans tous les thèmes : chaque réponse est recalculée en relisant le dessin
node tests/stats.test.js # calculs de statistiques, historique, CSV, journaux malveillants
node tests/pdf.test.js # export PDF clair / sombre : structure du fichier, métriques, caractères, pagination, un équivalent PDF pour chaque graphique d'écran
node tests/qcmimages.test.js # images du cours : rattachement aux questions, doublons, plafonds, tri des figures
node tests/wheel.test.js # roue : moments de déclenchement, effet exact de chaque case, bouclier, plafonds, équiprobabilité, messages réseau
node tests/voicechat.test.js # chat vocal : qui appelle qui, annuaire de l'hôte, départs, arrivées tardives, coupures, messages invalides (faux réseau)
node tests/transcript.test.js # transcription : mots les plus dits, statistiques, générateur de PDF (structure xref, pages, accents, emoji, cas limites)
node tests/browserglue.test.js # chat vocal + lien d'invitation exécutés dans un mini-DOM (bouton, panneau, handleData, resetConnection, XSS)
node tests/invite.test.js # lien d'invitation : lecture et construction de ?room=123456
node tests/review.test.js # mode révision : décision automatique, bonus imposé, passage du cours, justification détaillée, leçons piégées
node tests/reaction.test.js # temps de réaction : médiane, quartiles, régularité, tendance, premier à répondre juste, courbe de rapidité, groupes, robustesse
node tests/text.test.js # lettres et mots les plus écrits : découpage, comptages du chat (bornés, sans message en clair), sources, mots, rapport (phrases, .txt) courants, PDF clair / sombre
node tests/clock.test.js # horloge : format HH:MM:SS recalculé autrement (20 000 dates, changements d'heure), recalage sur la seconde
node tests/justif.test.js # justifications (bonne / mauvaise / temps écoulé, écarts, confusions, HTML échappé) et texte lu par la voix off
node tests/rooms.test.js # salles : décisions d'entrée, mot de passe et essais limités, places, données reçues, identité des invités, refus propres
node tests/menus.test.js # menus : réglages bornés, annonces d'arrivée / départ, classement des joueurs du panneau
node tests/presets.test.js # préréglages : valeur la plus proche, tirage sans remise, configuration mémorisée nettoyée
node tests/config.test.js # écran de configuration : code QSJ1, filtre de difficulté, durée estimée, résumé
node tests/extras.test.js # outils de l'hôte : questions jamais jouées, tri progressif, thèmes favoris et inversion
node tests/v59.test.js # 13 pouvoirs de plus : effets exacts, plafonds, Mine, Trêve, Magicien
node tests/predict.test.js # pronostic de fin (classement, ×2 / ÷2) et questions pièges (×5 / −300, fréquence)
node tests/e2e/menus.e2e.js # (facultatif, Playwright) menus et préréglages de bout en bout
node tests/e2e/bigroom.e2e.js # (facultatif, Playwright) places jusqu'à 9 999, panneau borné, onglets Duels / Faits marquants, journal de 300 joueurs
node tests/e2e/config.e2e.js # (facultatif, Playwright) résumé, auto-réparation des listes, difficulté sur une vraie partie, code de config, anglais
node tests/e2e/stats.e2e.js # (facultatif, Playwright) onglets Catégories et Profils avec une partie de démonstration
node tests/e2e/extras.e2e.js # (facultatif, Playwright) vraie partie : difficulté progressive, mémoire des questions, favoris
node tests/e2e/predict.e2e.js # (facultatif, Playwright) deux navigateurs : pari avant la dernière question, règlement, piège ×5, nouveaux pouvoirs
node tests/e2e/rooms.e2e.js # (facultatif, Playwright) salles de bout en bout dans deux navigateurs avec réseau simulé
NODE_PATH=<dossier de jszip> node tests/formats.test.js # PPTX, ODP, XLSX, ODS, EPUB, RTF, HTML, sous-titres, liens (fichiers réels de tests/fixtures)
Les parcours complets (navigateur, import de chaque format, audio avec un modèle simulé, liens, serveur PHP avec faux services) ont été vérifiés avec Playwright pendant le développement ; les scripts ne sont pas dans le dépôt.
Ce qui n'a pas pu être testé de bout en bout : le téléchargement réel du modèle Whisper depuis Internet (testé avec un modèle simulé), la transcription par un vrai service payant (testée avec un faux serveur), la lecture de vrais sites web (testée avec des sites simulés) et les liens Canva / Google / YouTube (volontairement non lus).
Le validateur détecte les erreurs de format, les doublons exacts et les réponses incohérentes ; il ne vérifie pas l'exactitude factuelle des questions.
Les corrections de questions, nouveaux thèmes et mots à modérer sont les bienvenus. Amuse-toi bien ! 🎉
quizV40Hosted), donc l'hôte garde ce droit aussi dans l'historique des 12 dernières parties. Limite assumée : le site n'a pas de serveur, la règle est donc appliquée dans le navigateur ; quelqu'un de très habile peut la contourner avec les outils de développement. Testé dans tests/watermark.test.js.node tests/e2e/predict.e2e.jsÉcrans vert / rouge, contrôlés sur les 42 pouvoirs : chaque bonus ou malus qui te touche affiche un écran plein vert (bonus) ou rouge (malus) pendant 2,6 s ; ce que tu lances toi-même (malus sur un adversaire) reste en jaune, sans écran. Série en fusion (🌋) donne bien l'écran vert. Trous comblés : la Roue multiplicatrice n'avait pas d'écran (maintenant vert), les Armures (Armure, Renaissance, Armure ×) étaient annoncées « BLOQUÉ ! » alors que ce sont des bonus (maintenant « BONUS »), le Miroir affichait ses écrans à l'envers (« RENVOYÉ ! » vert pour celui qui renvoie, « RENVOYÉ SUR TOI ! » rouge pour celui qui reçoit son propre malus), et le pronostic et la question piège n'avaient aucun écran (🔮 « PRONOSTIC JUSTE ! » vert / « PRONOSTIC RATÉ » rouge, 🕳️ « PIÈGE DÉJOUÉ ! » vert / « PIÈGE ! » rouge). Tests : tests/v50.test.js (règle de couleur), tests/e2e/predict.e2e.js (écrans du pronostic et du piège).
« Oublier les questions jouées » en pleine partie : la question en cours ne se réinscrit plus toute seule dans l'historique (tests/e2e/extras.e2e.js).
tests/variants.test.jstests/readtime.test.jstests/e2e/v64.e2e.js