Présentation du projet
Battlezone Online (bzo) propose un jeu de chars 3D gratuit, jouable depuis un navigateur web sur ordinateur, smartphone ou casque de réalité virtuelle. Le client s’appuie sur Three.js et se connecte aux serveurs BZFlag existants via WebSockets, WebTransport et WebRTC. Aucun téléchargement n’est requis : l’accès se fait simplement en ouvrant l’URL bz.rikers.org.
Architecture serveur et client
Le serveur est implémenté en Node.js 22, fourni dans une image Docker basée sur Ubuntu 26.04. Chaque image publiée comporte les variantes linux/amd64 et linux/arm64, garantissant la compatibilité avec les architectures x86_64 et ARM. Le client, quant à lui, utilise Three.js pour le rendu 3D et exploite les API WebXR natives pour le mode VR, nécessitant un navigateur et un casque supportant immersive‑vr. Le rendu s’effectue en 2D sur les écrans classiques, tandis qu’en VR le champ de vision s’élargit grâce au drapeau « Wide Angle » qui ne modifie pas la logique de jeu.
Processus de publication et CI/CD
Chaque version stable suit le schéma SemVer vX.Y.Z et est publiée sur GitHub avec un changelog généré depuis CHANGELOG.md. La chaîne CI, exécutée dans un conteneur Ubuntu 26.04, compile les images Docker, lance les tests unitaires et effectue les vérifications de lint, d’audit et de CodeQL. Le workflow refuse toute version dont le package.json ne correspond pas au tag Git, ou dont le changelog ne contient pas de section non‑placeholder. En cas d’échec, la version n’est pas promue et le tag reste inchangé. Exemple de procédure de release :
npm run release:prepare -- 1.0.1
git tag v1.0.1
git push origin v1.0.1
Cette séquence met à jour package.json, package-lock.json, public/version.mjs et le CHANGELOG.md, puis déclenche la construction des images Docker pour les deux architectures.
Support multiplateforme et contraintes VR
Le mode VR s’appuie sur le WebXR natif et nécessite que le serveur soit servi via HTTPS afin que le client utilise automatiquement wss:// pour les connexions WebSocket. Le script xr-launch.js sollicite la session immersive dès le chargement de la page, puis réitère la demande sur chaque événement susceptible d’activer l’utilisateur (load, focus, visibilitychange, etc.). Si aucun événement ne déclenche la session, l’utilisateur peut toujours activer le mode VR via le bouton dédié. Les claviers système des casques, comme le Quest Browser 26.1, permettent la saisie du nom du joueur ; sur les appareils ne supportant pas cette fonctionnalité, le champ reste en mode « Desktop only » et le serveur attribue un nom par défaut.