BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Plycube : jeux en blocs entre potes, dans le navigateur (Arena FPS, Caméléon)
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Site de jeux : comptes sur invitation, amis et personnage partagés entre tous les jeux, catalogue, suggestions et feuille de route, panneau admin. Deux jeux : Arena FPS (tir en blocs) et Caméléon (cache-cache en blocs). • Technique : Node.js + Express, base SQLite, WebSocket (temps réel), HTML/CSS/JS simple. • Adresse : sur ton réseau local, le site est à http://192.168.1.37:3000 (l'adresse du NAS). Pour le rendre public, passe par ton reverse proxy. • Données : tout est dans le dossier data/ (la base site.db). C'est le seul dossier à sauvegarder.README 전문 보기 ↗
Site de jeux (https://plycube.fr) : comptes sur invitation, amis et personnage partagés entre tous les jeux, catalogue, suggestions et feuille de route, panneau admin. Deux jeux : Arena FPS (tir en blocs) et Caméléon (cache-cache en blocs).
http://192.168.1.37:3000 (l'adresse du NAS). Pour le rendre public, passe par ton reverse proxy.data/ (la base site.db). C'est le seul dossier à sauvegarder.Toutes les commandes ci-dessous se tapent dans le dossier du projet (celui qui contient ce README). Pour y aller :
cd /chemin/vers/jeu-college
docker compose up -d --build
up = démarre, -d = en arrière-plan, --build = (re)construit l'image.Vérifier que ça tourne :
docker compose ps # l'état doit être "running" puis "healthy"
docker compose logs -f # affiche le journal en direct (Ctrl + C pour quitter)
Ouvre ensuite http://192.168.1.37:3000 depuis n'importe quel ordinateur ou téléphone de la maison.
Réserver le site au NAS seul (quand ton reverse proxy est en place) : dans
docker-compose.yml, remplace"3000:3000"par"127.0.0.1:3000:3000", puis relancedocker compose up -d.
docker compose exec site node scripts/admin.js creer-admin TonPseudo
Le mot de passe est demandé au clavier. Rien ne s'affiche quand tu tapes, c'est normal. Valide avec Entrée, puis retape-le pour confirmer. Aucun mot de passe n'est écrit dans le code : il est stocké sous forme hachée dans la base.
Ensuite, connecte-toi sur le site : un lien Admin apparaît dans le menu.
Depuis le site (le plus simple) : Admin → onglet Codes d'invitation → choisis le nombre d'utilisations, une note (ex. « 4e B »), puis Créer. Tu peux désactiver un code à tout moment.
Ou en ligne de commande :
docker compose exec site node scripts/admin.js code 30 "Classe de 4e B"
(30 = nombre de personnes qui peuvent l'utiliser ; sans nombre, il ne sert qu'une fois.)
Donne le code aux élèves : ils vont sur /inscription, choisissent un pseudo et un mot de passe. Aucune autre donnée ne leur est demandée.
| Je veux… | Commande |
|---|---|
| Arrêter le site | docker compose down |
| Le relancer | docker compose up -d |
| Le mettre à jour après une modif du code | docker compose up -d --build |
| Voir le journal | docker compose logs -f --tail 100 |
| Changer un mot de passe | docker compose exec site node scripts/admin.js mot-de-passe Pseudo |
| Lister les admins | docker compose exec site node scripts/admin.js liste-admins |
| Retirer les droits admin | docker compose exec site node scripts/admin.js retirer-admin Pseudo |
| Sauvegarder la base | docker compose exec site node scripts/admin.js sauvegarde |
| Voir toutes les commandes admin | docker compose exec site node scripts/admin.js |
La sauvegarde est rangée dans data/sauvegardes/. Copie ce dossier ailleurs de temps en temps (clé USB, autre disque…).
Restaurer une sauvegarde : docker compose down, remplace data/site.db par le fichier sauvegardé (renommé en site.db), supprime data/site.db-wal et data/site.db-shm s'ils existent, puis docker compose up -d.
Le site redémarre tout seul si le NAS redémarre (restart: unless-stopped).
Tous les fichiers sont dans public/assets/animations/ et sont commentés en français :
| Fichier | Rôle |
|---|---|
reglages.css | Commence ici. Toutes les vitesses, distances et intensités sont réunies en haut de ce fichier. |
apparition.css | Les éléments qui « glissent » en arrivant sur la page. |
survol.css | Effets au passage de la souris (cartes qui se soulèvent, boutons). |
fond.css | Les lueurs bleues qui bougent lentement en fond. |
notifications.css | Notifications, pastille verte « en ligne », badges. |
animations.js | Déclenche les apparitions en cascade (réglages en haut : ACTIVER, DECALAGE_MS). |
animations.css | Charge tous les autres fichiers. |
Exemples :
reglages.css, --anim-survol-hauteur: -10px;--anim-fond-duree: 40s;animations.css, mets en commentaire la ligne
@import url("fond.css"); → /* @import url("fond.css"); */animations.js, var ACTIVER = false;Pour voir le résultat : enregistre le fichier, puis recharge la page avec Ctrl + F5 (le navigateur garde les fichiers en mémoire jusqu'à une heure, et Ctrl + F5 force le rechargement). Pas besoin de redémarrer ni de reconstruire : le dossier des animations est partagé avec le conteneur.
Les élèves qui ont activé « réduire les animations » sur leur appareil voient automatiquement un site sans mouvement.
Les couleurs (bleu et noir) sont en haut de public/assets/css/style.css (variables --bleu, --fond…). Après un changement de ce fichier, lance docker compose up -d --build.
Chaque jeu est un dossier dans games/<nom>/ (nom en minuscules, chiffres et tirets) :
games/fps/
manifest.json la fiche du jeu (obligatoire)
public/ les fichiers envoyés au navigateur : image, index.html du jeu…
Exemple de manifest.json :
{
"nom": "Arena FPS",
"description": "Un jeu de tir multijoueur…",
"image": "cover.svg",
"statut": "bientot",
"joueurs": "2 à 8 joueurs",
"tags": ["Multijoueur", "Action"],
"ordre": 1
}
image : un fichier du dossier public/ du jeu.statut : bientot (carte « bientôt disponible », non jouable), beta, disponible ou maintenance.statutAvecServeur (facultatif) : le statut à utiliser seulement quand la partie serveur du jeu (server.js) a bien été chargée au démarrage du site. Exemple : Caméléon dit "statut": "bientot", "statutAvecServeur": "beta" : il reste « bientôt » tant que le site n'a pas été redémarré avec son serveur, puis devient jouable tout seul.ordre : position dans le catalogue (le plus petit en premier).Le catalogue relit les fiches toutes les 10 secondes : une modification de manifest.json apparaît sans redémarrage.
Seuls les joueurs connectés peuvent ouvrir un jeu.
Un jeu inclut le script partagé du site :
<script src="/assets/js/platform.js"></script>
puis :
const moi = await Plateforme.moi(); // { id, username, isAdmin } ou null
Plateforme.connecter(); // temps réel : présence, invitations
Plateforme.definirActivite({ jeu: 'fps', salle: 'abc123', rejoignable: true });
const { friends } = await Plateforme.amis(); // amis + en ligne + jeu en cours
await Plateforme.inviter(idAmi, 'fps', 'abc123'); // invite un ami dans ta partie
await Plateforme.rejoindre(idAmi); // rejoint la partie d'un ami
Plateforme.on('invite', (msg) => { /* … */ }); // invitation reçue
Plateforme.on('presence', (msg) => { /* … */ }); // un ami change de statut
const salle = Plateforme.salleDansAdresse(); // lit ?room=… dans l'adresse
Les amis sont communs à tout le site : un ami ajouté une fois l'est dans tous les jeux.
Jeu de tir en blocs (style Minecraft, sans sang) : Chacun pour soi ou Équipes Bleus contre Rouges, 4 cartes, 40 armes et gadgets (et 9 armes d'admin), des trampolines, et des ragdolls quand on est éliminé.
games/fps/manifest.json contient "statut": "bientot", seul l'admin le voit. Sur l'accueil, son bouton s'appelle Tester (admin)."bientot" par "beta" dans games/fps/manifest.json. Le changement apparaît dans les 10 secondes, sans redémarrage.attenteSecondes dans reglages.json). Seul pour s'entraîner ? Des bots arrivent (3 si tu es seul, moins s'il y a d'autres joueurs) : ils se promènent sur la carte, te cherchent, tirent, et on peut les éliminer. Ils ne visent que ceux qui jouent vraiment (pas ceux qui sont dans un menu) et partent dès que la vraie partie commence. Réglages : section bots de reglages.json (nombre, précision, temps de réaction, dégâts ou non).Les armes existent en 3 styles, au choix de chaque joueur dans Réglages → Style des armes : Réaliste simplifié (par défaut, léger), Réaliste avec textures (plus beau, environ 8 Mo à charger) et Classique en blocs (le plus léger). Les modèles réalistes sont des fichiers .glb libres dans games/fps/public/modeles/armes/ (simple/, texture/, avec catalogue.json pour leur orientation et LICENCES.md pour les auteurs ; six modèles CC BY sont crédités dans les Réglages du jeu). Pour remplacer un modèle, mets un autre .glb à la place et corrige son orientation dans catalogue.json (axe, bouche, haut). Pièces animées des modèles réalistes : le chargeur, la culasse, la pompe, le barillet, les canons, la roquette et le crochet du grappin des modèles réalistes sont découpés et bougent comme ceux des armes en blocs (le chargeur tombe au rechargement, la glissière recule au tir, la roquette disparaît après le tir, les gadgets disparaissent quand on les lance…). Les morceaux de chaque fichier sont choisis dans modeles/armes/pieces.json (un « îlot » = un morceau qui ne touche pas les autres, noté maillage:îlot). Si tu changes un modèle .glb, il faut mettre à jour ses numéros dans ce fichier. Pas de pièce séparée dans le modèle (mitrailleuse, chargeur caché dans la crosse du pistolet…) : la pièce reste fixe.
Chaque joueur choisit 4 armes, une par catégorie, en arrivant dans la partie. Il peut en changer à chaque réapparition (bouton Changer d'armes quand il est éliminé, ou touche C sur ordinateur ; aussi dans le menu pause et la salle d'attente) et choisir ses armes préférées depuis l'accueil (Mes armes).
| Catégorie (touche) | Armes |
|---|---|
| Principale (1) | Fusil d'assaut, Fusil à rafale (3 balles par clic), Mitraillette, Mitrailleuse lourde (100 balles, on marche moins vite), Fusil à pompe, Fusil de précision (semi-auto, lunette ×2,6), Sniper (lunette ×4,5), Arbalète (carreaux qui tombent en arc, silencieuse), Lance-roquettes, Pompe automatique (7 plombs, tire tout seul), Fusil à double canon (2 énormes coups de près), Mitraillette rapide (la plus rapide de toutes), Fusil bullpup (lunette ×2,2, plus puissant que le fusil d'assaut), Lance-grenades (les grenades retombent en arc et explosent au contact), Fusil à plasma (boules d'énergie qui éclatent en petite gerbe), Fusil anti-matériel (lunette ×6, une balle élimine presque à coup sûr), Cloueuse (des clous qui restent plantés dans les murs) |
| Secondaire (2) | Revolver, Pistolet, Mini-mitraillette, Fusil à canon scié (2 coups), Lance-fusée (brûle et éblouit), Pistolet lourd (7 balles puissantes), Pistolet automatique, Mini-arbalète (silencieuse, à une main), Pistolet à eau (presque pas de dégâts, mais tellement drôle) |
| Mêlée (3) | Couteau (on court plus vite ; dans le dos d'un adversaire en visant : élimination en un coup, avec une animation spéciale), Batte de baseball (projette l'adversaire), Poêle à frire (BOING ! et dans ton dos, elle arrête les balles qui arrivent par derrière), Katana (grande portée), Hache (lente, très puissante), Masse (envoie l'adversaire voler très loin), Pelle (comme la poêle : rangée dans ton dos, elle arrête les balles) |
| Gadget (4) | Grenade (rebondit, explose après 3 s), Fumigène (gros nuage pour se cacher), Grappin (tire vers un mur ou un toit), Kit de soin (+50 points de vie), Grenade flash (aveugle ceux qui la voient pendant 3,5 s, sans dégâts ; moitié moins pour le lanceur, rien derrière un mur), Mine (posée au sol, elle s'arme en 1 s et explose quand un adversaire passe tout près ; 2 au maximum), Propulseur (un coup de réacteur qui t'envoie sur les toits). Chaque gadget a un temps de recharge. |
Indicateurs de dégâts : quand tu touches un adversaire, le nombre de dégâts saute au-dessus de lui (jaune dans la tête, rouge s'il est éliminé ; les touches rapprochées s'additionnent). Quand on te tire dessus, un arc rouge autour du viseur montre d'où vient le tir et suit le tireur quand tu te tournes. Les chiffres se coupent dans Réglages (« Chiffres de dégâts »). Code : games/fps/public/js/indicateurs-degats.js.
Chaque élimination remet ta vie à 100 % (pour tout le monde, bots compris ; se tuer soi-même ne compte pas). Pour l'enlever : "vieAuMaxApresElimination": false dans la partie joueur de games/fps/public/reglages.json, puis sudo docker compose restart.
Dans Réglages, l'admin du site a un bouton >_ ADMIN PANEL (les autres joueurs ne le voient pas). Il ouvre un panneau façon terminal de hacker : le menu des pouvoirs au milieu, rangés par catégorie (touche entre crochets pour activer / couper : 1 à 9 puis A à Z ; 0 pour tout couper ; flèches + Entrée ; Échap pour quitter ; à la manette : la croix, A, B) et, dans les coins, des fenêtres qui s'allument une par une : Système, Journal, Session et un Radar. Le choix des pouvoirs reste sur cet ordinateur (code : games/fps/public/js/panneau-admin.js).
Accès facile : tout en haut du panneau, l'option ACCÈS FACILE ajoute en partie un bouton transparent >_ ADMIN en haut à droite de l'écran, qui ouvre le panneau d'un clic (ordinateur : d'abord Échap pour libérer la souris) ou d'un toucher (iPad). Raccourcis : touche ² au clavier (modifiable dans Changer les touches), Affichage + Menu en même temps à la manette (Share + Options sur PlayStation). En fermant le panneau, on revient directement au jeu (tablette, manette).
| Catégorie | Pouvoirs |
|---|---|
| Mouvement | Voler (V, Espace monter, C descendre) · Super vitesse · Super saut · Triple saut (deux sauts de plus en l'air) · Gravité lunaire · Passe-muraille (on traverse les murs, le sol porte toujours) · Téléportation (T : on apparaît là où on vise, jusqu'à 300 m) |
| Combat | Visée auto · Précision parfaite · Sans recul · Munitions infinies · Tir ultra rapide (×3, même le sniper et le laser) · One shot · Balles explosives (petite explosion à l'impact, qui ne blesse pas l'admin) · Frappe orbitale (G en visant le sol : une cible rouge apparaît, un rayon tombe du ciel 1,3 s plus tard, énorme explosion qui casse la carte) |
| Survie | Invincible (aura dorée visible par tous) · Vampire (la moitié des dégâts faits revient en vie) · Régénération (+16 PV/s) |
| Vision | Voir à travers les murs · Radar (mini-carte en haut à gauche) · Vision nocturne · Mode Matrix (pluie de code vert) · Vue 3e personne |
| Fun | Géant · Mini (tout le monde voit la taille changer) · Invisible (les autres ne te voient plus) · Traînée arc-en-ciel (visible par tous) · Grosses têtes (les autres, sur ton écran) · Mode disco |
| Bots | Figer les bots (ils ne bougent plus et ne tirent plus) |
| Actions (boutons) | Vie au maximum · Réparer la carte · +2 bots · Enlever les bots · Bots normaux |
Les touches T (téléportation) et G (frappe orbitale) se changent dans Réglages → Changer les touches (groupe Admin). Le serveur vérifie que c'est bien le compte admin pour tout ce qui compte (vol, vitesse, téléportation, dégâts, invincibilité, géant, invisible, bots…) : un élève ne peut rien activer. Les pouvoirs de vision (radar, nocturne, Matrix, disco, grosses têtes, wallhack) ne changent que l'écran de l'admin.
Le laser (arme d'admin). Dans le choix des armes, l'admin a en plus un Laser (catégorie principale). On maintient le tir pour le charger : quatre anneaux d'énergie tourbillonnent de plus en plus vite autour du canon, une boule de lumière grossit au bout, des éclairs sautent entre les anneaux, des particules sont aspirées dans le canon ; autour du viseur, un « réacteur » tourne et se remplit, les bords de l'écran s'illuminent, le son monte, l'écran tremble de plus en plus et la vue se resserre ; à 100 %, tout passe au rose et « MAX » clignote. On relâche pour envoyer le rayon (rayon en spirale, onde de choc, flash et lumière, la vue « s'ouvre » d'un coup) : plus c'est chargé, plus ça fait de dégâts (quasi un seul tir à pleine charge) et plus ça casse la carte autour du point d'impact — jamais le sol (ni le terrain de l'île, le pont ou les douves) : seulement les murs, tours, bâtiments, caisses… (réglage casseSol du laser dans reglages.json). Les blocs cassés disparaissent (plus de collision) puis réapparaissent tout seuls après quelques secondes ; une nouvelle manche repart avec une carte intacte. Le serveur vérifie que seul l'admin peut l'équiper et refait tous les dégâts et les cassures lui-même.
Les autres armes d'admin (elles aussi seulement dans le choix des armes de l'admin, vérifié par le serveur) :
| Arme | Ce qu'elle fait |
|---|---|
| Canon à trou noir (principale) | Une boule noire qui ouvre un trou noir en touchant quelque chose : pendant 3,5 s, il aspire les adversaires autour (et blesse ceux qui sont tout près du centre), puis tout explose. L'aspiration vise une vitesse vers le centre : elle ne s'emballe pas. |
| Fusil Tesla (principale) | Un éclair instantané qui saute d'adversaire en adversaire (5 touchés au maximum, à moins de 9 m les uns des autres et sans mur entre eux), de moins en moins fort. Pas de munitions. |
| Minigun (principale) | 6 canons qui tournent, 300 balles ; les canons mettent un instant à démarrer. |
| Lance-feux d'artifice (principale) | Une fusée qui éclate en bouquet de couleur, puis en 6 petites explosions colorées tout autour. |
| Rayon anti-gravité (principale) | Un rayon violet : l'adversaire touché s'envole et flotte dans les airs (avec une aura violette). |
| Marteau de Thor (mêlée) | À chaque coup, même dans le vide, la foudre tombe et une onde de choc envoie en l'air les adversaires autour (rien pour celui qui frappe). |
| Sabre laser (mêlée) | Une lame d'énergie qui touche jusqu'à 3 m, très puissante. |
| Pluie de météores (gadget) | Une balise qu'on lance : elle s'allume, puis 10 météores tombent du ciel autour d'elle et explosent. |
Toutes ces armes se règlent dans games/fps/public/reglages.json (à la fin de la liste armes). Les bots du mode classé n'utilisent jamais d'armes d'admin ; à partir de certains niveaux, ils prennent aussi la pompe automatique, la mitraillette rapide, le fusil bullpup ou le fusil anti-matériel. Les explosions, aspirations et envols des nouvelles armes poussent aussi les bots, et la grenade flash les aveugle.
Chaque arme a sa propre inspection (touche F) et sa propre recharge : le fusil d'assaut vérifie son chargeur et claque l'arrêtoir de culasse, le fusil à rafale fait un tour complet sur lui-même, le pistolet tourne autour du doigt, le revolver fait tourner son barillet puis on souffle sur le canon, le couteau est lancé en l'air et rattrapé, la batte est pointée vers l'horizon, la grenade est jetée en l'air en vrille, le laser tourne en pulsant… Pendant les recharges, l'arme est relevée pour qu'on voie le chargeur sortir et le neuf arriver (sniper : culasse ouverte d'abord ; canon scié : les douilles sautent ; arbalète : on retend la corde ; lance-roquettes : la roquette arrive par l'avant…).
Elles sont écrites dans games/fps/public/js/animations-origine.js, au même format que l'atelier d'animations : une animation faite dans l'atelier passe toujours avant, et l'atelier recopie ces animations telles quelles quand on veut les modifier.
Bouton Classé dans le panneau « Jouer ». C'est du chacun pour soi, mais :
Ton rang (Bronze, Argent, Or, Platine, Diamant de I à III, puis Champion) est affiché dans le panneau « Jouer ». Fin de manche : 1er +30 points, 2e +15, 3e +5, sinon −10 ; un niveau tous les 50 points. Il est enregistré avec ton compte (table fps_classe de la base du site) : c'est le même sur tous tes appareils. C'est le serveur qui compte les points à la fin de chaque manche (games/fps/serveur/classement.js), le navigateur ne fait que les afficher : impossible de tricher en modifiant son navigateur.
Réglages dans games/fps/public/reglages.json (partie.objectifClasse, partie.attenteClasseSecondes) ; la force des bots par niveau est dans games/fps/serveur/bots.js (forceDuNiveau).
L'admin a un bouton 🗺️ Éditeur de cartes (dans le menu et dans l'atelier d'animations ; page games/fps/public/atelier-cartes.html). On construit sa propre carte en posant des blocs en 3D (comme dans Minecraft), puis on l'enregistre : elle apparaît alors dans le choix des cartes du jeu.
data/fps-cartes.json ; Tester l'enregistre puis lance une partie dessus. Le serveur (games/fps/serveur/cartes.js) revérifie tout (matières connues, nombre de blocs, au moins une apparition) avant de l'accepter.Dans le menu du jeu, l'admin du site a un bouton 🎬 Atelier d'animations (page games/fps/public/atelier-animations.html). On y choisit une arme (modèles « classiques » en blocs) et un moment : prendre en main, tir (recul), pompe / culasse, recharge, coup, coup dans le dos, lancer, se soigner ou inspecter (touche F, nouveau).
data/fps-animations.json) : les joueurs l'ont tout de suite, même en pleine partie. Supprimer mon animation remet celle d'origine.Avec les styles d'armes réalistes, l'arme et les mains suivent l'animation, mais les pièces (chargeur...) ne bougent pas séparément.
Danses et sons : l'onglet 💃 Danses de l'atelier sert à créer des danses. On anime tout le corps, le buste, la tête, les bras et les jambes, de la même façon (clés sur la ligne de temps) : chaque partie peut tourner et se déplacer. On choisit une musique qui tourne en boucle et des sons placés dans le temps. À gauche, Envoyer des sons… ajoute tes propres fichiers (MP3 conseillé, 4 Mo maximum, 100 Mo en tout ; rangés dans data/fps-sons/). Ils servent aussi pour les animations d'armes. Les danses sont dans data/fps-danses.json.
Options d'une danse : On peut avancer en dansant (comme le Griddy : on marche sans arrêter la danse, à la vitesse choisie, caméra derrière soi), Garder l'arme en main. Des modèles tout prêts se chargent d'un clic (dossier games/fps/public/danses-modeles/, par exemple « Griddy (amélioré) » calée sur la musique) : on les regarde, on les modifie, puis on enregistre.
En jeu, la touche B (ou le bouton 💃 sur tablette) ouvre la liste des danses ; le chiffre lance la danse. On se voit de face (la souris fait tourner la caméra), les autres joueurs voient la danse et entendent la musique autour de toi. Elle s'arrête dès qu'on bouge, saute, tire ou vise.
Quand on est éliminé : on voit d'abord son ragdoll, puis la caméra va jusqu'à celui qui nous a éliminé, et il nous fait coucou.
Dispersion : les balles s'écartent un peu (beaucoup moins en visant : la visée réduit aussi l'effet des tirs à la suite et des déplacements) (le viseur s'écarte aussi pour le montrer). Elles sont plus précises en visant (clic droit), à l'arrêt et en tirant par petites rafales ; moins précises en courant ou en sautant.
Arène, Château (douves, remparts, donjon, passages secrets), Ville (rues, immeubles, ponts entre les toits) et Île tropicale (plage, cabanes sur pilotis, grotte). Elles sont dans games/fps/public/cartes/ et sont fabriquées par le programme games/fps/outils/cartes.py (il vérifie chaque carte et refuse d'en écrire une avec un problème). Pour les régénérer :
python3 games/fps/outils/cartes.py
Les sons sont dans games/fps/public/sons/. Ils viennent de Freesound, Kenney et OpenGameArt et sont libres : presque tous en CC0 (domaine public), sauf deux en CC BY 4.0 (lance_fusee_tir.mp3 par OGsoundFX et grenade_goupille.mp3 par ryanconway, crédités dans Réglages) ; voir games/fps/public/sons/LICENCES.md pour l'origine de chacun. Pour changer un son, remplace le fichier .mp3 par un autre portant le même nom. Si un fichier manque, le jeu fabrique un son de remplacement. Le volume des effets et de la musique se règle dans Réglages.
Ouvre games/fps/public/reglages.json : dégâts, cadence, taille des chargeurs, dispersion et zoom de chaque arme, vitesse, saut, durée des parties, objectif, force des ragdolls… Les explications sont écrites dans le fichier. Modifie les nombres, puis relance avec :
sudo docker compose restart
Le personnage est commun à tout le site : il sert dans Arena FPS et dans Caméléon. On l'ouvre depuis le menu du site (Mon personnage, adresse /personnage), depuis le hall de Caméléon, ou depuis le hall d'Arena FPS (bouton Mon personnage). Venant du site ou de Caméléon, l'atelier s'ouvre tout seul et, en le fermant, on revient d'où l'on vient. (Côté serveur : server/personnages.js, qui utilise les règles et la table d'Arena FPS.)
La liste des choix (couleurs, vêtements…) est dans games/fps/public/catalogue-apparence.json. Il n'y a pas de contrôle des visages dessinés ; si un élève abuse, tu peux toujours bloquer son compte depuis le panneau admin.
Sur l'accueil du site, la carte d'Arena FPS montre une boucle muette de 15 s (elle ne se charge que quand la carte est à l'écran) et un bouton Bande-annonce qui ouvre la vidéo complète (50 s, avec musique et bruitages). Les fichiers sont dans games/fps/public/ (bande-annonce.mp4, bande-annonce-boucle.mp4) et sont déclarés dans games/fps/manifest.json ("bandeAnnonce"). N'importe quel jeu peut avoir sa bande-annonce de la même façon.
La vidéo est fabriquée avec HyperFrames dans videos/arena-fps-casting/ (ce dossier n'est pas copié dans le site). Les images sont calculées en 3D avec les vrais modules du jeu (src/moteur.js), les textes sont dans compositions/, les bruitages viennent des sons du jeu (src/bruitages.py) et la musique du catalogue HeyGen. Pour la refaire après une modification :
cd ~/jeu-college/videos/arena-fps-casting
~/.local/bin/hyperframes check
~/.local/bin/hyperframes render --quality delivery --output renders/bande-annonce.mp4
Cache-cache en blocs, façon « Meccha Chameleon » : les cacheurs se peignent aux couleurs du décor pour devenir invisibles, les chercheurs les trouvent au pistolet à peinture. Dossier games/cameleon/.
games/cameleon/public/cartes/, fabriquées par python3 games/cameleon/outils/cartes.py) : Maison (salon, cuisine, couloir, chambre, salle de bain, garage, jardin), Jardin (labyrinthe de haies, massifs de fleurs, fontaine, serre, cabane, aire de jeux, potager), (rayonnages pleins de caisses colorées, conteneurs où l'on peut entrer, chariot élévateur, quai, bureau vitré). Les matières de couleur (, , , , ) sont dessinées par .Ma pose et ma taille (cacheurs, touche M ou bouton « Ma pose ») : on choisit sa taille (de 60 % à 140 %, réglage tailleMin / tailleMax dans games/cameleon/public/reglages.json) et sa propre pose : position de départ (debout, accroupi, allongé) puis tête, corps, chaque bras (lever, écarter) et chaque jambe. Touche 4 pour reprendre sa pose. Le serveur vérifie les valeurs, la zone de touche suit la taille (plus petit = plus dur à toucher), les autres joueurs voient la même pose et le leurre la copie. C'est gardé dans le navigateur (code : games/cameleon/public/js/pose-perso.js).
Sur tablette, les boutons se personnalisent : Réglages → Personnaliser les boutons (tablette). On glisse chaque bouton (et le joystick) où on veut, on le touche puis « Plus grand » / « Plus petit », et « Voir les boutons du chercheur » montre l'autre jeu de boutons. C'est gardé dans le navigateur (code : games/cameleon/public/js/disposition.js).
HttpOnly et SameSite, Secure en HTTPS. Les requêtes venant d'un autre site sont refusées.Content-Security-Policy (contre le XSS).Quand ton lien public HTTPS fonctionne, mets COOKIE_SECURE=true dans docker-compose.yml, puis relance avec docker compose up -d.
Il doit transmettre vers http://127.0.0.1:3000 avec le support WebSocket (sinon les statuts « en ligne » et les invitations ne marchent pas). Exemple pour nginx :
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Si ton proxy a une interface graphique (sur ton NAS UGREEN ou ailleurs), cherche une option « WebSocket » et active-la.
Le site peut avoir une adresse publique en HTTPS, du type https://jeu-sjdc.tailXXXX.ts.net, grâce à Tailscale Funnel : rien à ouvrir sur ta box, et les élèves n'ont rien à installer (pas de VPN, juste le lien). Le conteneur jeu-sjdc-tailscale (dans docker-compose.yml) s'en occupe ; le site reste aussi accessible chez toi par http://IP-DU-NAS:3000.
Une seule fois :
sudo docker compose up -d --buildsudo docker logs jeu-sjdc-tailscale → ouvre le lien https://login.tailscale.com/a/… affiché, et accepte.sudo docker exec jeu-sjdc-tailscale tailscale funnel --bg http://site:3000
Ensuite : rien à faire, tout redémarre tout seul avec le NAS. Pour voir l'état : sudo docker exec jeu-sjdc-tailscale tailscale funnel status. Pour fermer l'accès public : sudo docker exec jeu-sjdc-tailscale tailscale funnel reset.
Le site reste protégé comme avant : seuls les élèves qui ont un code d'invitation peuvent créer un compte. Le dossier ./tailscale contient les clés de connexion du NAS : ne le partage pas.
Le conteneur nas-tailscale relie le NAS lui-même à ton compte Tailscale. Depuis n'importe où, seulement depuis tes appareils (téléphone, PC) connectés à ton compte Tailscale, tu peux ouvrir l'interface du NAS et t'y connecter en SSH. Rien n'est ouvert sur internet et ta box n'est pas modifiée. Ça remplace UGREENlink.
Une seule fois, chez toi :
cd ~/jeu-college
sudo docker compose up -d
sudo docker compose logs tailscale-nas | grep -i login.tailscale.com
Ouvre le lien affiché (https://login.tailscale.com/a/…) et connecte-toi avec le même compte Tailscale que pour le site. Ensuite, dans https://login.tailscale.com/admin/machines : sur la ligne nas-maison, menu … → Disable key expiry, sinon l'accès s'arrête au bout de 6 mois.
Sur ton téléphone ou ton PC : installe l'application Tailscale et connecte-toi avec le même compte. Ensuite, de partout :
ssh Marcel@nas-maison (PowerShell sur PC, ou l'application Termius sur téléphone) ;Si nas-maison ne marche pas, utilise l'adresse en 100.x.x.x affichée dans l'application Tailscale. Si un Wi-Fi bloque Tailscale, passe par la 4G de ton téléphone. Protège bien ton compte Tailscale : c'est la clé pour entrer, alors active la validation en deux étapes sur le compte avec lequel tu t'y connectes (Google, Microsoft…). Après, il faut encore ton mot de passe du NAS.
Les conteneurs redémarrent tout seuls après une panne ou un redémarrage du NAS (restart: unless-stopped).
Le site s'affiche avec son propre nom, https://plycube.fr, grâce au conteneur jeu-sjdc-cloudflared qui le relie à Cloudflare (compte gratuit, sans carte bancaire, HTTPS automatique, aucun port à ouvrir sur la box). Tailscale (ci-dessus) reste disponible en secours.
L'ancienne adresse jeux-sjdc.fr marche encore : le site la renvoie vers la même page de plycube.fr (réglage ANCIENNES_ADRESSES dans docker-compose.yml), donc les anciennes affiches et les liens déjà envoyés restent bons. Les deux noms ont été achetés chez IONOS et sont gérés par Cloudflare (serveurs de noms ainsley et coen). Pense à garder jeux-sjdc.fr jusqu'à son renouvellement (septembre 2027), puis tu peux le laisser expirer.
Le tunnel a été créé depuis le NAS, sans passer par « Zero Trust » :
cd ~/jeu-college
# 1. Autoriser le NAS sur ton compte Cloudflare : ouvre le lien affiché, choisis jeux-sjdc.fr, « Authorize »
sudo docker run -it --rm --user "$(id -u):$(id -g)" -e HOME=/home/sjdc -v "$PWD/cloudflared":/home/sjdc/.cloudflared cloudflare/cloudflared:latest tunnel login
# 2. Créer le tunnel
sudo docker run --rm --user "$(id -u):$(id -g)" -e HOME=/home/sjdc -v "$PWD/cloudflared":/home/sjdc/.cloudflared cloudflare/cloudflared:latest tunnel create jeu-sjdc
# 3. Diriger l'ancien nom (et www) vers le tunnel
sudo docker run --rm --user "$(id -u):$(id -g)" -e HOME=/home/sjdc -v "$PWD/cloudflared":/home/sjdc/.cloudflared cloudflare/cloudflared:latest tunnel route dns jeu-sjdc jeux-sjdc.fr
sudo docker run --rm --user "$(id -u):$(id -g)" -e HOME=/home/sjdc -v "$PWD/cloudflared":/home/sjdc/.cloudflared cloudflare/cloudflared:latest tunnel route dns jeu-sjdc www.jeux-sjdc.fr
# 4. Démarrer
sudo docker compose up -d
Pour plycube.fr, la commande « route dns » ne marche pas (elle ne connaît que le premier domaine). Les deux enregistrements ont été faits à la main dans Cloudflare → plycube.fr → DNS : type CNAME, nom @ puis www, cible ec5a94e6-af4f-4a38-9aec-c3bf8f1cbe63.cfargotunnel.com, nuage orange (proxy) allumé. Pour un futur domaine, c'est pareil, plus une ligne hostname: dans cloudflared/config.yml, puis sudo docker compose restart cloudflared.
Dans Cloudflare, sur chaque domaine : Caching → Configuration → Browser Cache TTL = « Respect Existing Headers » (sinon, après une mise à jour, les navigateurs mélangent anciens et nouveaux fichiers du jeu), et SSL/TLS → mode Full.
Le réglage du tunnel est dans cloudflared/config.yml (il désigne le tunnel par son identifiant : si un jour tu recrées le tunnel, remplace-le par le nom du nouveau fichier .json) ; ses clés (cert.pem, <identifiant>.json) sont dans le même dossier : ne les partage pas (le dossier n'est pas copié dans l'image Docker). Pour voir l'état : sudo docker logs jeu-sjdc-cloudflared (on doit voir « Registered tunnel connection »).
Une affiche A4 à imprimer, avec le QR code qui mène au site, est dans le dossier affiche/ (affiche-plycube.pdf).
Changement d'adresse : quand le site passe sur un nouveau nom, tout le monde doit se reconnecter une fois (les connexions sont liées à l'adresse).
Seule la page de connexion de https://plycube.fr peut apparaître dans Google (réglage PUBLIC_URL dans docker-compose.yml). Les pages des élèves, les jeux, l'adresse Tailscale et l'adresse du réseau local restent cachées (noindex), www.plycube.fr renvoie vers plycube.fr, et l'ancienne adresse aussi. La page ne contient que le nom du site : elle sort quand on cherche « plycube », pas sur d'autres recherches. Pour tout cacher à nouveau : enlève la ligne PUBLIC_URL, puis sudo docker compose up -d.
Pour que Google la trouve vite (une seule fois, avec ton compte Google) :
plycube.fr.TXT (google-site-verification=…) dans Cloudflare → plycube.fr → DNS → Add record (Type TXT, Name @), puis Valider.sitemap.xml → Envoyer.https://plycube.fr/connexion → Demander l'indexation. Compte quelques jours à 2 semaines.jeux-sjdc.fr (si tu l'avais créée) : Paramètres → Changement d'adresse → choisis plycube.fr. Google transfère tout seul.Code : https://github.com/alue4/plycube (dépôt public : tout le monde peut le lire).
Adresse gratuite : https://alue4.github.io/plycube/ renvoie tout de suite vers l'adresse Tailscale du site (https://plycube.lleyn-bass.ts.net), même page (ex. …/plycube/games/fps/ → Arena FPS). C'est le dossier docs/ (GitHub Pages) : index.html et 404.html font la redirection, presentation.html est une page de présentation de secours. Pour changer d'adresse de destination, remplace-la dans ces deux fichiers.
Jamais envoyé (liste dans .gitignore) : la base des joueurs data/, les clés cloudflared/, tailscale/, tailscale-nas/, node_modules/, les rendus vidéo et la musique HeyGen de la bande-annonce.
Envoyer les nouveautés (git et l'outil gh sont installés dans ton dossier, sans sudo ; tu es connecté avec gh) :
git add -A
git commit -m "Ce qui a changé"
git push
Les commits sont signés avec l'adresse anonyme de GitHub (pas ton e-mail). Pour couper l'accès du NAS à ton compte : GitHub → Settings → Applications → GitHub CLI → Revoke.
Pour que Claude puisse reconstruire et relancer le site tout seul sans avoir accès à Docker (Docker donnerait tout le NAS), une seule commande lui est autorisée : /usr/local/sbin/plycube-maj (source : scripts/plycube-maj.sh). Elle appartient à root, Claude ne peut pas la modifier, et elle utilise une copie verrouillée du réglage Docker (/etc/plycube/docker-compose.yml).
| Commande | Effet |
|---|---|
sudo plycube-maj | reconstruit et relance le site (comme sudo docker compose up -d --build) |
sudo plycube-maj redemarrer | relance seulement le site |
sudo plycube-maj etat | état des conteneurs |
sudo plycube-maj journal | les 150 dernières lignes du journal du site |
Installation (une seule fois, dans le dossier du projet) :
sudo mkdir -p /etc/plycube
sudo install -o root -g root -m 0644 docker-compose.yml /etc/plycube/docker-compose.yml
sudo install -o root -g root -m 0644 /dev/null /etc/plycube/vide.env
sudo install -o root -g root -m 0755 scripts/plycube-maj.sh /usr/local/sbin/plycube-maj
sudo install -o root -g root -m 0440 scripts/plycube.sudoers /etc/plycube/plycube.sudoers
sudo visudo -cf /etc/plycube/plycube.sudoers && sudo cp -p /etc/plycube/plycube.sudoers /etc/sudoers.d/plycube
docker-compose.yml : recopie-le dans la version verrouillée (2e ligne ci-dessus), sinon l'ancien réglage reste utilisé.sudo rm /etc/sudoers.d/plycube.Avec Node.js 18 ou plus :
npm install
npm start # lance le site sur le port 3000
npm test # lance les tests automatiques
npm run admin -- creer-admin TonPseudo
docker compose ps puis docker compose logs --tail 50.3000 dans docker-compose.yml (ex. "127.0.0.1:3100:3000").sudo devant la commande (ex. sudo docker compose up -d --build).COOKIE_SECURE=true : normal, ce réglage exige le HTTPS. Remets auto pour tester en local.#rrggbbraye:damier:pois:tissu:games/fps/public/js/textures.jsgames/cameleon/public/reglages.json (durées, pénalités, nombre de bots, points…), puis sudo docker compose restart.games/cameleon/serveur/salon.js, bots dans serveur/bots.js) : il vérifie les vitesses, les tirs (pas à travers les murs), la peinture (seulement une image PNG, seulement pour un cacheur) et les rôles.