CONFIDENTIEL — GDD
Game Design Document — SAÉ S5.01 · BUT Informatique 305/306

Protocole Lerna

Un escape game où l'on pirate, déchiffre, isole et corrige pour de vrai. Chaque épreuve est une compétence du BUT Informatique, et chaque objet physique sert à débloquer un problème informatique.
Durée30 min (45 max)
Joueurs4 à 5
PublicVisiteurs JPO, 14 ans +
Budget~116 € / 200 €
JalonJ1 — fin sept. 2026
01

Vision & concept

La Cellule Zéro-Jour a un problème : LERNA, un programme laissé par un ancien ingénieur, copie les données de millions de citoyens et s'apprête à les publier. Le service cyber est bloqué sur le périph. Il reste les stagiaires, c'est-à-dire vous, et 30 minutes.

High concept

Un thriller cyber de 30 minutes où l'on s'authentifie, fouille un terminal, déchiffre un fichier, isole un serveur sur une vraie baie réseau et corrige du code, avec des objets physiques qui servent chaque fois de clé.

Genre

Escape game phygital : aucune épreuve ne se résout seulement à l'écran, aucune seulement dans la salle. L'objet physique donne l'indice ou l'action, l'informatique donne la résolution.

Public cible

  • Lycéen·nes en JPO qui n'ont jamais ouvert un terminal : mémo de commandes, indices, commandes tolérantes aux fautes.
  • Lycéen·nes déjà geeks : le jeu doit rester crédible pour eux, avec du vrai Linux, du vrai chiffrement et de vrais logs.
  • Parents accompagnateurs : ils repartent avec le message sur les données et une idée concrète de ce qu'on apprend en BUT.

Proposition de valeur

Le jeu est une vitrine du BUT déguisée en thriller. En 30 minutes, un groupe touche à la sécurité, au système, au réseau, aux données et au développement, puis sort directement vers le stand où les étudiants présentent la formation. Le message éthique et durable fait partie des mécaniques de jeu, il n'est pas affiché sur un panneau à la sortie.

02

La boucle de gameplay

Core loop

Trouver un objet dans la salle → l'utiliser comme clé d'un problème informatique → obtenir une vraie donnée technique (mot de passe, clé, port) → elle ouvre l'étape suivante, dans la salle ou à l'écran.

Il n'y a aucun chiffre sorti de nulle part : chaque code du jeu est une vraie donnée technique. Le code du coffre, par exemple, est le numéro de port du flux de fuite trouvé dans les logs.

Mécaniques

  • Deux pistes en parallèle au départ. À 4-5 joueurs, personne n'attend : 2 joueurs travaillent sur l'authentification pendant que 2-3 autres travaillent sur les calques. Les deux pistes se rejoignent au terminal.
  • Jauge de fuite. Elle est affichée en grand sur l'écran de mission et monte avec le temps. Chaque erreur coûteuse la fait monter d'un coup, par exemple couper le mauvais câble réseau ou taper un mauvais code au coffre. La mise en quarantaine du serveur la fige pendant 5 minutes.
  • Indices. Le bouton « Appeler le Commandant » lance une courte vidéo d'aide et fait monter la jauge de 5 %. Le game master peut aussi envoyer un indice depuis sa console.
  • Retours physiques. LED et buzzer sur le coffre, loquet motorisé, écran LCD qui affiche les ordres du serveur.

Conditions de fin

  • Victoire : le patch passe tous les tests, il est déployé, la jauge redescend à 0 % et la vidéo de fin se lance.
  • Défaite douce : la jauge atteint 100 % ou le chrono de 30 min s'écoule. La vidéo « mauvaise fin » montre ce que la fuite coûte concrètement. Le game master peut accorder jusqu'à 15 min de rab, pour 45 min au maximum.
03

Scénario & thématique

L'univers

La Cellule Zéro-Jour est un service de cyberdéfense installé dans un open space banal. Le Commandant Riad briefe les stagiaires en vidéo. Adrien Kovac, ingénieur de la cellule, a disparu il y a trois semaines. Ce soir, LERNA, le programme qu'il a laissé derrière lui, s'est réveillé. Les joueurs doivent entrer dans sa session, remonter sa piste et neutraliser LERNA.

Le twist éthique

Kovac est un lanceur d'alerte, pas un cybercriminel. Il a découvert que la Cellule conservait tout « au cas où » : des pétaoctets de données citoyennes jamais supprimées, dupliquées sur des dizaines de serveurs, dont une partie était revendue à des courtiers pour financer le service. LERNA devait seulement publier la preuve de ce trafic. Mais Kovac l'a codé seul, vite, sans tests. Le programme se réplique au lieu de s'arrêter, et il est sur le point de publier les données elles-mêmes.

La donnée la plus sûre et la plus sobre, c'est celle qu'on ne stocke pas.

C'est le fil rouge du jeu. Le problème de sécurité (données accumulées, donc exposées) et le problème écologique (données dupliquées, donc stockées et alimentées pour rien) ont la même cause. On le retrouve à trois niveaux :

  • Scénario : la Cellule accumule tout, LERNA duplique tout.
  • Gameplay : le patch final corrige LERNA pour qu'il supprime les copies inutiles sans toucher aux données légitimes.
  • Conception : notre propre jeu ne collecte aucune donnée personnelle sur les visiteurs (voir section 06).

Ancrage R5.A.13 — économie durable et numérique

Les vidéos du Commandant, moins de 45 s chacune, apportent du contenu sourcé : la valeur marchande des données personnelles, le coût réel d'une fuite, et l'empreinte du stockage de données inutiles. Les chiffres viendront de la CNIL, de l'ADEME et de l'Arcep ; Ilan les vérifie avant le tournage.

04

Les cinq épreuves

Chaque épreuve correspond à une compétence du BUT Informatique. C'est le vrai argument pour les JPO : à la fin, le groupe a touché à tout le programme.

Épreuve 1 — Double authentification

PISTE A · 2 JOUEURS
Administrer — sécurité~7 min
Physique
Fouille à l'aveugle dans la sacoche de Kovac : vraies cartes électroniques HS de l'IUT, câbles, slime, fausses araignées. Au fond se trouve son badge RFID. Sur son bureau : la photo de son chien « Pixel », un calendrier avec son anniversaire entouré, un mug « 1994 ».
Numérique
Écran de connexion de la Cellule. Badge sur le lecteur : « facteur 1 validé ». Il reste le mot de passe, qui se déduit des objets du bureau (Pixel1994). Au bout de 3 erreurs, le compte est verrouillé 30 s, comme un vrai système anti-force brute.
Leçon
Un mot de passe personnel se devine en observant quelqu'un (OSINT), d'où l'intérêt de la double authentification.

Épreuve 2 — Le message à double fond

PISTE B · 2-3 JOUEURS, EN PARALLÈLE
Administrer — cryptographie~6 min
Physique
Deux feuilles de rhodoïd couvertes de traits sans signification. Superposées devant la lampe du bureau, elles révèlent un mot : SOBRE. Au mur, un poster « déco » est en réalité une grille de Vigénère.
Numérique
Rien pour l'instant : la piste B détient une clé qui ne sert à rien tant que la piste A n'a pas ouvert la session. C'est ce qui force les deux groupes à se retrouver.
Leçon
Une clé de chiffrement ne se range pas au même endroit que le fichier chiffré.

Épreuve 3 — Le terminal de Kovac

TOUTE L'ÉQUIPE
Administrer — systèmeGérer des données~8 min
Numérique
Un terminal simulé dans le navigateur. Le « mémo du stagiaire » plastifié liste 6 commandes : ls, ls -a, cd, cat, dechiffre, aide. ls -a révèle un fichier caché, .lerna.conf.enc. Avec dechiffre --cle SOBRE, on obtient le nom du serveur qui fuit (srv-03) et l'emplacement de son journal.
Données
Le journal s'ouvre dans un visualiseur avec des filtres : heure, serveur, volume sortant. Il contient environ 2 000 lignes de trafic normal et un seul flux anormal à 3 h 12, avec 48 Go sortants depuis srv-03. Le port de ce flux est à retenir.
Leçon
Une attaque laisse des traces, et savoir filtrer des données est une compétence à part entière.

Épreuve 4 — Quarantaine

PHYSIQUE · RÉSEAU
Administrer — réseau~4 min
Physique
Une mini-baie de brassage avec des câbles RJ45 de réemploi et des ports étiquetés SRV-01 à SRV-04, INTERNET et QUARANTAINE. Elle est visible dès le début de la partie, ce qui en fait un piège tentant. Il faut débrancher le câble de srv-03 et le rebrancher sur QUARANTAINE. Si on débranche le mauvais serveur, l'écran affiche « Vous venez de couper le service des urgences » et la jauge prend +10 %.
Numérique
L'ESP32 détecte quel câble est branché où. La jauge se fige pendant 5 minutes, car LERNA cherche un autre chemin. Le coffre se tape avec le port trouvé dans les logs : le loquet s'ouvre et libère la clé USB antidote.
Leçon
Isoler avant de réparer : c'est le premier réflexe face à un incident.

Épreuve 5 — Le patch

TOUTE L'ÉQUIPE · FINALE
RéaliserOptimiser — qualité~5 min
Numérique
La clé USB contient le code de l'antidote, mais Kovac l'a écrit sans tests et il est bugué. À l'écran, 7 blocs de code sont à remettre dans l'ordre par glisser-déposer, et une condition est à corriger. Le bouton « Lancer les tests » exécute 3 tests : supprime les copies illégitimes, ne supprime pas les données des citoyens, s'arrête. Quand les 3 sont verts, on peut cliquer sur « Déployer ».
Leçon
Le twist du scénario devient la mécanique : ce qui sauve les données, c'est d'avoir testé.
05

Parcours minuté

  1. 00:00BriefingVidéo du Commandant (45 s). Le chrono de 30:00 démarre et la jauge est à 10 %.
  2. 00:02Séparation en deux pistesPiste A : sacoche puis badge, bureau puis mot de passe. Piste B : calques puis clé SOBRE, et repérage de la grille au mur.
  3. 00:09Session ouverteVidéo 2 : qui est Kovac. Toute l'équipe se regroupe devant le terminal.
  4. 00:12Fichier déchiffréOn apprend que srv-03 fuit et où se trouve le journal.
  5. 00:17Flux trouvé dans les logsLe port du flux anormal devient le code du coffre.
  6. 00:20Serveur en quarantaineLa jauge se fige. Vidéo 3 : ce que coûte l'accumulation de données.
  7. 00:22Coffre ouvertOn récupère la clé USB antidote.
  8. 00:24PatchBlocs remis en ordre, tests au vert, déploiement.
  9. 00:28ÉpilogueLa jauge tombe à 0 et la vidéo de fin se lance. L'écran récapitule les compétences du BUT mobilisées pendant la partie, et le groupe est invité à rejoindre les étudiants du stand.
  10. + 1 min 30ResetDepuis sa console, le game master lance un nouveau port aléatoire, referme le coffre et remet la jauge à zéro. Il remet aussi physiquement le câble et le badge.

Le port change à chaque partie : un groupe qui a regardé les précédents par-dessus l'épaule ne connaît pas le code du coffre.

06

Éco-conception

Le scénario parle de sobriété, alors nos choix de conception doivent en faire autant. Chaque choix ci-dessous est vérifiable dans le code ou dans la facture.

Matériel

  • Réemploi avant achat. PC, écrans, routeur, câbles RJ45, chargeur, clé USB et bois du coffre viennent du parc de l'IUT ou de l'équipe.
  • Le contenu de la sacoche vient de vrais DEEE : des cartes HS récupérées, pas du plastique neuf.
  • Un seul ESP32 pour tout le bureau, au lieu d'un microcontrôleur par poste.
  • Zéro soudure définitive (borniers et connecteurs Dupont) : tous les composants se récupèrent après la JPO.
  • Servo à pignons métal plutôt que plastique, pour moins de casse et moins de remplacements.

Logiciel

  • 100 % local sur le réseau de la salle : aucun cloud et aucun streaming. En bonus, le jeu marche même si le Wi-Fi de l'IUT tombe.
  • Vidéos en 720p et de moins de 45 s, compressées, mises en cache une seule fois.
  • Push plutôt que polling : MQTT (en-tête de 2 octets) et WebSocket, au lieu d'interroger le serveur en boucle.
  • Budget de poids : moins de 500 Ko de JS et de CSS hors vidéos, avec du lazy loading Angular.
  • Mise en veille de l'ESP32, du rétroéclairage du LCD et des écrans entre deux parties.

Données

  • Aucune donnée personnelle collectée : pas de nom, pas d'email, pas de photo, seulement un pseudo d'équipe. On ne fait pas ce que le jeu dénonce.
  • Statistiques anonymes (temps par épreuve, indices utilisés) pour ajuster la difficulté, purgées automatiquement après la JPO.
  • Tous les logs du jeu sont synthétiques, produits par notre générateur.

Mesurer au lieu d'affirmer

  • EcoIndex et Lighthouse dans la CI : une note minimale bloque la fusion si une page grossit trop.
  • Mesure réelle au wattmètre (prêté par l'IUT) de la consommation d'une partie complète. La valeur mesurée s'affiche sur l'écran de fin, pour que le visiteur voie l'empreinte de ce qu'il vient de jouer.
  • Une grille de bonnes pratiques tirée du RGESN (référentiel général d'écoconception des services numériques) est revue à chaque fin de sprint.
07

Spécifications techniques

CoucheTechnoPourquoi
FrontendAngular + TailwindCSS + xterm.jsCompétence de Maxime. xterm.js affiche un vrai rendu de terminal dans le navigateur.
BackendNestJS (TypeScript)Un seul langage pour tout le web. Des modules séparés pour la machine d'état, le MQTT et le terminal.
Base de donnéesPostgreSQL + TypeORMSessions, tentatives et statistiques anonymes.
Message brokerMosquitto (MQTT)Découple le matériel du backend : c'est la brique « architecture distribuée » du brief.
Temps réelWebSocket (Socket.io)Jauge, chrono et vidéos poussés vers les écrans.
FirmwareC++ / Arduino core, ESP32Wi-Fi intégré, assez de GPIO pour tout le bureau.
Données de jeuGénérateur de logs (TypeScript)Environ 2 000 lignes réalistes et un port aléatoire à chaque session.
InfraDocker Compose + NginxUn docker compose up monte toute la salle.
QualitéJest, Cypress, ESLint, GitHub ActionsTests à chaque push, comme l'exige le brief pour valider un sprint.

Trois interfaces

  • Poste de Kovac (PC joueur) : connexion, terminal, visualiseur de logs, éditeur du patch.
  • Écran de mission (TV murale) : vidéos du Commandant, jauge, chrono, lisibles à 3 m.
  • Console game master (téléphone) : lancer et réinitialiser une partie, envoyer un indice, ouvrir le coffre à distance en cas de panne, voir les statistiques.

Ergonomie

Tout est lisible à 2 m, avec un contraste AA minimum. Le terminal ignore les majuscules et suggère la bonne commande en cas de faute de frappe. Aucun texte long n'apparaît à l'écran pendant l'action : les explications passent par les vidéos.

08

Architecture — vue éclatée

Tout le matériel tient sur le bureau de Kovac et remonte à un seul ESP32 caché dans le socle du coffre. L'ESP32 ne prend aucune décision : il lit les capteurs, pilote les actionneurs et relaie tout au backend.

COFFRE — socle ESP32 capteurs + actionneurs aucune logique de jeu Wi-Fi → MQTT vers le serveur local Lecteur badge RC522 SPI · épreuve 1 LCD 16×2 + clavier 4×4 I2C partagé (PCF8574) · coffre LED + buzzer GPIO · retours bon/faux Servo MG90S + loquet PWM · ouverture coffre Alimentation 5 V chargeur de réemploi Baie de brassage 6 ports GPIO par balayage · épreuve 4
Fig. 1 — Le bureau de Kovac en vue éclatée. La baie de brassage se lit comme le clavier matriciel : l'ESP32 active chaque port serveur un par un et regarde lequel arrive sur la prise QUARANTAINE.
RÉSEAU LOCAL DE LA SALLE — HORS LIGNE, AUCUN CLOUD ESP32 bureau de Kovac MQTT MOSQUITTO broker pub/sub BACKEND NESTJS machine d'état du jeu terminal simulé · générateur PostgreSQL REST + WS POSTE DE KOVAC login · terminal · logs · patch ÉCRAN DE MISSION vidéos · jauge · chrono CONSOLE GAME MASTER reset · indices · ouverture forcée
Fig. 2 — Le backend est la seule source de vérité. Les trois écrans sont des routes de la même application Angular, et rien ne sort du réseau de la salle.
09

Ce qu'il faut coder

Firmware · C++ (Arduino core, ESP32)

  • Lecture du badge avec MFRC522 (SPI), UID publié en MQTT
  • Clavier et LCD sur un bus I2C partagé (Keypad_I2C, LiquidCrystal_I2C)
  • Balayage de la baie de brassage : chaque port serveur activé à tour de rôle, lecture de la prise QUARANTAINE
  • Servo du loquet avec ESP32Servo, LED et buzzer
  • PubSubClient avec reconnexion automatique et message « last will », ArduinoJson
  • Veille légère entre deux parties

Backend · TypeScript (NestJS)

  • Machine d'état : BRIEFING → AUTH → TERMINAL → LOGS → QUARANTAINE → COFFRE → PATCH → VICTOIRE / DÉFAITE
  • TerminalModule : système de fichiers virtuel en JSON et liste blanche de commandes. Jamais de vrai shell.
  • LogGenerator : environ 2 000 lignes, un flux anormal, un port aléatoire à chaque session
  • PatchModule : vérifie l'ordre des blocs et renvoie le résultat de chacun des 3 tests
  • REST : POST /sessions, /login, /terminal, GET /logs?srv=&from=&minVolume=, POST /patch, /hint, /gm/*
  • Passerelle WebSocket : jauge, chrono, déclenchement des vidéos
  • Documentation OpenAPI générée avec @nestjs/swagger

Frontend · TypeScript (Angular + Tailwind)

  • Écran de connexion en deux facteurs (attend l'événement badge, puis demande le mot de passe)
  • Terminal avec xterm.js, historique et suggestions de commandes
  • Visualiseur de logs : tableau filtrable et triable, pagination côté serveur
  • Éditeur du patch en glisser-déposer (@angular/cdk/drag-drop) et panneau de tests
  • Écran de mission : lecteur vidéo séquencé, jauge animée en CSS
  • Console game master (responsive, pensée pour téléphone)

Topics MQTT

lerna/badge/scanESP32 → backend · UID du badge
lerna/coffre/codeESP32 → backend · code tapé
lerna/baie/etatESP32 → backend · quel serveur est branché sur quel port
lerna/coffre/cmdbackend → ESP32 · ouvrir, fermer, texte LCD, LED
lerna/esp/statuslast will · détecte la déconnexion de l'ESP32
10

Matériel & budget

Plafond de 200 € tout compris. Avec le réemploi, on prévoit environ 116 €, marge de casse incluse. Même si on doit acheter le serveur, on reste sous le plafond.

Achat neufQtéRôlePrix indicatif
ESP32 DevKit V121 en service et 1 de secours pour la JPO16 €
Kit RFID RC522 (lecteur + badge + carte)1Épreuve 15 €
Clavier membrane 4×4 + module PCF85741Code du coffre, en I2C pour économiser des broches5 €
LCD 16×2 I2C1Messages du serveur6 €
Servo MG90S (pignons métal)1Loquet du coffre5 €
LED, résistances, buzzerlotRetours visuels et sonores3 €
Embases RJ45 keystone6Baie de brassage détectable10 €
Borniers, connecteurs Dupont, plaque à trouslotCâblage démontable, sans soudure définitive10 €
Slime et fausses araignéeslotSacoche6 €
Rhodoïd A4 + feutres permanents3 + 2Épreuve 25 €
Impressions : mémo, grille de Vigénère, photo, calendrier, étiquetteslotDécor et indices8 €
Charnières, loquet, visserie, colle, collierslotCoffre et finitions12 €
Marge casse et imprévus—Composant grillé, servo cassé25 €
Total prévu116 €
116 € prévus · 165 € au pire · plafond 200 €

Réemploi, 0 €

PC du poste de Kovac, écran de mission, machine serveur (portable reconditionné ou PC de l'IUT), routeur Wi-Fi (ancienne box), câbles RJ45 et patch de la réserve réseau, chargeur USB 5 V 2 A, clé USB, sacoche, cartes électroniques HS, bois de caisse ou chutes du fablab pour le coffre, cadre photo et mug.

Pire cas : si l'IUT ne peut pas prêter de machine serveur, on achète un Raspberry Pi 4 (environ 50 €), ce qui porte le total à environ 165 €, toujours sous le plafond.

Prix indicatifs de fournisseurs d'électronique grand public (GoTronic, Kubii, Amazon), à confirmer au moment de la commande.

11

Démarche projet

Du besoin flou au besoin formalisé

Le besoin de départ tient en une phrase : « un escape game pour les JPO ». Pour le préciser :

  • Entretien avec les référents (fin septembre), qui a fixé les contraintes : 30 min, 4-5 joueurs, budget, lien avec R5.A.13.
  • Trois personas : la lycéenne qui n'a jamais codé, le lycéen déjà geek, le parent accompagnateur.
  • User stories avec critères d'acceptation. Exemple : « En tant que game master, je relance une partie en moins de 2 min. »
  • Les exigences non fonctionnelles sont formalisées : reset rapide, fonctionnement hors ligne, aucune donnée personnelle, budget.

Itératif et intégration continue

  • Sprints de 2 semaines, backlog sur un tableau Kanban, démonstration au référent à chaque fin de sprint.
  • CI GitHub Actions à chaque push : lint, tests Jest, build des images Docker, parcours Cypress, EcoIndex.
  • Branches de fonctionnalité, pull requests relues par un autre membre, messages de commit normalisés.

Amélioration continue par les données

Chaque playtest (autres groupes, proches, lycéens si possible) alimente les statistiques anonymes : temps par épreuve, indices demandés, épreuve où l'équipe bloque. La console game master les affiche. On ajuste la difficulté à chaque sprint (nombre de lignes de logs, indices automatiques après X minutes) jusqu'à tenir les 30 minutes.

Répartition — profils en T

MembreSpécialitéEn renfort
Tanim VeerFirmware ESP32, câblage, coffre, baie, recherche de matériel de réemploiOrganisation, serveur Linux
Maxime CourdavaultFrontend Angular (terminal, logs, patch), infra Docker/CICâblage IoT
Jean-François DenaBackend NestJS : machine d'état, API, MQTT, BDD, doc OpenAPIPont MQTT avec le firmware
Ethan Mebaley KahelTests (Jest, Cypress, recette matérielle), générateur de logsCâblage, front
Ilan NgueletBesoin et personas, contenu des vidéos, suivi éco-conception (EcoIndex, wattmètre, RGESN)Statistiques de playtest
12

Plan de production

Must-have

  • Les 5 épreuves jouables de bout en bout
  • Machine d'état, API, BDD
  • ESP32 : badge, clavier, LCD, servo, baie
  • Liaison MQTT et WebSocket
  • Console game master : reset et ouverture forcée
  • Tests automatisés et CI

Should-have

  • Port aléatoire à chaque session
  • Système d'indices
  • Statistiques anonymes et purge automatique
  • EcoIndex bloquant dans la CI
  • Suggestions de commandes dans le terminal

Nice-to-have

  • Consommation mesurée affichée en fin de partie
  • Mode de difficulté (collège/lycée ou experts)
  • Version anglaise pour la JPO

Jalons

JalonÉchéanceLivrable
J1 — ConceptionFin sept. 2026Ce GDD : scénario, épreuves, faisabilité, budget
J2 — MVPMi-nov. 2026Tranche verticale : épreuve 1 complète (badge → MQTT → backend → écran de connexion) et coffre qui s'ouvre, avec reset
J3 — BêtaMi-janv. 2027Les 5 épreuves, playtests chronométrés, version intégrée et rapport d'équipe
J4 — JPOMi-fév. 2027Produit fini, reset en moins de 2 min, exposition publique
13

Analyse des risques

RisqueImpactStratégie d'atténuation
Des visiteurs bloquent au terminalHMémo de commandes, commandes tolérantes, indices automatiques, game master qui peut pousser un indice
Panne de servo, RFID ou ESP32 en pleine JPOHESP32 de secours déjà flashé, ouverture forcée depuis la console, validation manuelle de chaque épreuve par le game master
Parties qui dépassent 30 minMStatistiques de playtest par épreuve, difficulté réglable, rab de 15 min au maximum
Wi-Fi de l'IUT saturé le jour JMRéseau local autonome avec son propre routeur, tout en local
Planning serréMMVP limité à l'épreuve 1 et au coffre, les épreuves 2 à 5 ajoutées une par sprint
Matériel de réemploi introuvableLPire cas chiffré à environ 165 €, sous le plafond de 200 €