
Davos Deathmatch
Jeu de combat satirique au Forum économique mondial de Davos
Jeu webaoût 2026JavaScript (modules ES)Canvas 2DWeb AudioWebRTCNode.js
Jeu de combat 2D satirique : huit caricatures de dirigeants s’affrontent au Forum de Davos. Sans build ni dépendance, avec une simulation déterministe et un mode en ligne en pair à pair avec netcode à rollback. Les personnages sont dessinés et animés par le code.
But du projet
Un jeu de combat dans la tradition du dessin de presse : huit figures publiques (Donald Trump, Greta Thunberg, Kim Jong Un, Vladimir Poutine, Emmanuel Macron, Elon Musk, Javier Milei, Klaus Schwab) se battent au Centre des congrès de Davos. Chaque coup spécial s’appuie sur une déclaration ou un fait public de la personne caricaturée.
Le jeu est aussi un exercice technique : il tourne sans étape de build ni dépendance, avec des modules ES écrits à la main.
Fonctionnalités
- Arcade : six délégués dans un ordre aléatoire puis le « Chairman », avec une IA de plus en plus forte.
- Versus local : deux joueurs sur un clavier ou deux manettes.
- En ligne : pair à pair avec netcode à rollback, partie lancée en envoyant un lien.
- Entraînement : mannequin configurable, affichage des entrées, données de frames de chaque coup, boîtes de collision à la demande.
- Système de combat complet : garde haute et basse, projections, manipulations (quart de cercle, dragon punch, charge), super, et combos automatiques pour les débutants.
- Voix réelles des personnages, extraites d’enregistrements publics sous licence libre ou du domaine public, avec traduction sous-titrée ; annonceur issu d’un pack CC0 de Kenney.
- Clavier reconfigurable (positions physiques, ZQSD en AZERTY), manettes avec vibration, commandes tactiles.
- Accessibilité :
prefers-reduced-motionrespecté, navigation au clavier, focus visible.
Fonctionnement
- Simulation déterministe (
docs/src/sim/) : uniquement des opérations arithmétiques, un générateur pseudo-aléatoire à graine, aucun accès au DOM ni à l’horloge. L’état complet peut donc être sauvegardé, rembobiné et rejoué à l’identique. - Rollback : chaque navigateur simule chaque image avec l’entrée réelle de l’adversaire si elle est arrivée, sinon avec une prédiction ; en cas d’erreur, l’état est rembobiné et recalculé sans rejouer les effets ni les sons. Les deux pairs comparent leur version de simulation avant la sélection des combattants.
- Mise en relation : par défaut, un serveur de signalisation WebSocket sur
wss://lp177.fr/davos/signal; en secours, un tracker WebTorrent public, puis un échange de code manuel. Une fois les navigateurs connectés, aucune donnée de jeu ne passe par le serveur. - Relais TURN : avant chaque connexion, le jeu demande des identifiants TURN temporaires à
https://lp177.fr/davos/ice, pour les réseaux où la connexion directe échoue. Le panneau de connexion indique si la liaison est directe ou relayée. - Rendu procédural : chaque combattant est un squelette animé par cinématique inverse à deux os, avec une tête dessinée sur mesure ; musique et bruitages sont synthétisés en WebAudio. Les effets (tremblements, arrêts sur image, particules) sont centralisés dans
docs/src/fx/juice.js. - Tests :
tools/verify-sim.mjsvérifie dans Node l’absence de code non déterministe, rejoue les bogues corrigés, contrôle la reproductibilité des rollbacks et la hiérarchie des niveaux de l’IA.
Capture d’écran
Jouer
Le jeu se joue dans le navigateur : lp177.github.io/DavosDeathmatch. Pour un combat en ligne, Create Room génère un lien à envoyer à l’adversaire.
En local, avec Node.js 18 ou plus, sans npm install ni build : le serveur fourni sert le jeu et la signalisation sur la même origine.
node server/server.js # http://localhost:8080
node server/server.js --port 9000 --host 0.0.0.0Le serveur propose un relais TURN si les variables TURN_SECRET et TURN_URLS sont définies, sinon il se limite à STUN. Les tests de la simulation se lancent avec node tools/verify-sim.mjs.
Contrôles
| Action | Joueur 1 | Joueur 2 |
|---|---|---|
| Se déplacer, s’accroupir, sauter | ZQSD (WASD en QWERTY) | Flèches |
| Poing léger / lourd | F / G | Pavé num. 4 / 5 |
| Pied léger / lourd | V / B | Pavé num. 1 / 2 |
| Super | H | Pavé num. 6 |
| Provocation | T | Pavé num. 3 |
Reculer pour se protéger ; avant + poing lourd au contact pour projeter. En Arcade, Entraînement et En ligne, les deux jeux de touches pilotent le même combattant. Tout est modifiable dans Settings → Controls.
Satire et sources
Chaque personnage est une caricature d’une figure publique dans son rôle public. Les extraits de voix ne sont ni recomposés ni synthétisés ; leurs sources et licences sont listées dans docs/voice/credits.html, accessible depuis les réglages audio. Le code est sous licence MIT selon le README ; les extraits audio gardent leurs propres conditions.
