lp177

Davos Deathmatch

Jeu de combat satirique au Forum économique mondial de Davos

Jeu webaoût 2026JavaScript (modules ES)Canvas 2DWeb AudioWebRTCNode.js

Jouer en ligne Code source

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-motion respecté, 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.mjs vé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.0

Le 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

ActionJoueur 1Joueur 2
Se déplacer, s’accroupir, sauterZQSD (WASD en QWERTY)Flèches
Poing léger / lourdF / GPavé num. 4 / 5
Pied léger / lourdV / BPavé num. 1 / 2
SuperHPavé num. 6
ProvocationTPavé 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.