Underground 2 Revived
Chrome과 Firefox에서 Need for Speed Underground 2를 WebGPU로 두고 팬 프로젝트입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗
Jeu de drift mobile en 3D, jouable dans le navigateur. Inspiration FR Legends. Lance la voiture, tiens l'angle, clippe les murs, encaisse le combo. Aucune installation, aucun compte, aucune pub. Tout reste sur ton appareil.
| 🛣️ 6 pistes | Docks de Minato (nuit), Col d'Akane (coucher de soleil), Piton Volcan (jour), Quai de Shiohama (aube), Col de Yukimi (neige, adhérence ×0,88), Corniche de Kaigan (crépuscule). |
| 🏝️ L'île, monde ouvert | 2,1 × 1,5 km, 15 routes, 10 carrefours, 9 km de bitume, relief jusqu'à 110 m. Circulation (5 modèles, roulage à gauche), 4 pilotes rivaux à défier (touge, tandem de rue), 6 habitants à qui parler, radars, zones de glisse, belvédères photo, 12 daruma dorés, carte et GPS. |
| 👥 Multijoueur | Jusqu'à 4 pilotes sur l'île, pair à pair (WebRTC), sans compte ni serveur de jeu : invitation par code ou lien, messages rapides, course et battle de drift lancées par l'hôte. |
| 📖 Aventure | « Le Tour de l'Île » : 6 chapitres × 3 missions, 7 personnages, archives à collectionner, défis de rue. |
| 🎯 3 modes | Run noté (note de S à D), Tandem (chasse le leader), Libre (entraînement). En run noté, ton fantôme (meilleur run de la piste) roule en transparence et le HUD affiche l'écart de points en direct. |
| 🔧 Atelier | 3 voitures, carrosserie, 12 peintures × 5 finitions, 6 livrées, 5 jantes, fumée colorée, 6 pièces de perf × 3 niveaux, réglages freins et suspension. |
| 🎬 Moments forts | En fin de run, les 3 meilleurs instants (gros combo, clip, frôlé, angle record) ; replay cinématique (poursuite, travelling, bord de piste, ralenti sur les clips et les frôlés). Les 8 derniers enregistrements des pistes se revoient depuis la Carrière. |
| 💴 Carrière | Yens fictifs (aucun achat réel), 36 défis, bonus quotidien, records par piste. |
| 📱 Tactile d'abord | Boutons déplaçables et redimensionnables, miroir gauche/droite, clavier et manette aussi. |
| ⚡ Fluide sur petit Android | Physique à 120 Hz interpolée, résolution dynamique, 65–68 appels de dessin par image. |
| Action | Tactile | Clavier |
|---|---|---|
| Gaz / frein | GAZ / FREIN | ↑ ↓ ou Z S / W S |
| Braquer | ‹ › | ← → ou Q D / A D |
| Frein à main (lancer la glisse) | FREIN À MAIN | Espace |
| Vue (caméra) | 👁 | C |
| Se replacer | menu pause | R |
| Interagir (île) | bouton contextuel en bas | E |
| Carte et GPS (île) | menu pause | M |
| Klaxon · messages rapides (session) | 📯 👋 GG ➜ 🔥 | H · 1 à 4 |
Manette compatible. Le geste de base : prends de la vitesse, braque, tire le frein à main un court instant, puis tiens les gaz.
Moteur et rendu
InstancedMesh, shaders précompilésSimulation
Son et interface
Qualité et livraison
node:test (106) : économie, physique, tracés, île, vie de l'île, multijoueur, aventurebuild.mjs assemble src/* en un seul index.htmlmainZéro dépendance npm en production. Pas de framework, pas de bundler : un script Node concatène les sources, le navigateur fait le reste.
flowchart LR
A["src/*.js<br>src/head.html<br>src/body.html"] -->|node build.mjs| B["index.html<br>(fichier unique)"]
L["assets/logo.webp<br>assets/favicon.svg"] -->|intégrés en data URI| B
B -->|push sur main| V["Vercel"]
V --> P["sideways-drift-club.vercel.app"]
C["Three.js r128<br>cdnjs"] -.chargé au runtime.-> P
| Outil | Usage |
|---|---|
| Node.js ≥ 18 | Build (build.mjs) et tests (node --test) |
| Playwright + Chromium | Captures, bot expert, mesures de perf et d'audio (tools/) |
| Vercel | Hébergement statique, déploiement à chaque merge sur main |
| Claude (Anthropic) | Conception et code assistés par IA (mention dans l'écran d'aide) |
| Outils d'IA générative | Logo et visuels |
Le jeu est une PWA : il s'installe comme une appli, en plein écran, sans store.
| Appareil | Étapes |
|---|---|
| Android (Chrome) | Ouvre le jeu → menu ⋮ → Installer l'application (ou Ajouter à l'écran d'accueil). |
| iPhone / iPad (Safari) | Ouvre le jeu → bouton Partager → Sur l'écran d'accueil. |
| Ordinateur (Chrome, Edge) | Icône d'installation dans la barre d'adresse, ou joue directement dans l'onglet. |
Mise à jour côté joueur : rien à faire. Le jeu n'a pas de cache hors ligne (pas de service worker) : chaque ouverture charge la dernière version. Ta progression (localStorage) est conservée.
git clone https://github.com/shanlihenriderussy-rgb/Sideways-Drift-Club.git
cd Sideways-Drift-Club
node build.mjs # régénère index.html
npx serve . # ou : python3 -m http.server 8000
Ouvre http://localhost:3000 (ou :8000). Un simple double-clic sur index.html fonctionne aussi.
Hors ligne (tests, captures) :
mkdir -p vendor
curl -o vendor/three.min.js https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js
node build.mjs --local # test.html, Three.js depuis vendor/
node --test tests/*.test.js # 80 tests
git checkout main && git pull.src/ (jamais dans index.html, il est généré).node --test tests/*.test.js # tout doit passer
node build.mjs # régénère index.html
Nouveau tracé → tests/tracks.test.js impose : pas de recoupement, ≥ 5 virages, 900–1 900 m, un seul type de clip par virage.src/ et index.html ensemble (conventional commits : feat(piste): …, fix(atelier): …).main. Au merge, Vercel redéploie en ligne en ~1 min.node build.mjs --local
node tools/readme-shots.js # docs/screenshots/*.jpg (bot au volant)
node tools/readme-banner.js # docs/brand/banner.jpg
| Rôle | Couleur |
|---|---|
| Action, argent, combo | |
| Rubriques, tandem | |
| Alertes | |
| Fond |
Direction : « Télémétrie de nuit ». La 3D est le sujet, l'interface s'efface.
| Fichier | Rôle |
|---|---|
src/physics.js | Modèle bicyclette, pneus saturés, régulateur d'angle de drift (assistance) ; lit les champs de fiche tunée (steerRate, driftSteer, angleBoost, rollK, brakeK, brakeRear, hbK, latBal, damp, camber) et l'adhérence de piste (grip) |
src/economy.js | Portefeuille en yens, catalogue de l'atelier, gains de fin de run, défis, bonus quotidien, fiche tunée. Logique pure, testée |
src/track.js | 6 tracés, échantillonnage, virages et clips (un type par virage, règle des tracés officiels), barème (par), adhérence (grip, neige) |
src/world.js | Ciel (nuages, étoiles), crêtes, route et murs par lieu, décor instancié par thème, tribune, eau animée. Thèmes dawn, snow, dusk = palettes posées sur une famille de décor (decor) |
src/car.js | Voitures procédurales : caisse lissée (loft), habitacle, livrée peinte, pièces modulaires, roues instanciées |
src/fx.js | Fumée colorée (points), traces de gomme (envoi GPU partiel), étincelles |
src/audio.js | Moteur, turbo, crissement synthétisés (Web Audio) |
src/ai.js | Leader tandem sur trajectoire précalculée |
src/story.js | Aventure « Le Tour de l'Île » : 6 chapitres × 3 missions, dialogues, objectifs, exploration (archives, défis de rue, rencontres). Logique pure, testée |
src/island.js | L'île : monde ouvert continu (9 km de routes, carrefours, relief, volcan, mer), recherche de route, terrain (partie pure, testée) et rendu Three.js, dont circulation instanciée (~15 appels de dessin pour tout le trafic), habitants, radars, arches de zone, étiquettes flottantes |
src/isleai.js | Vie de l'île : GPS (plus court chemin), circulation (suivi de voie, distance d'arrêt, klaxon, dépassement), rivaux en glisse, activités à étoiles, habitants et belvédères. Logique pure, testée |
src/ghost.js | Fantôme du record : échantillon toutes les 0,1 s (position, cap, dérive, points), stockage compact vérifié (), relecture interpolée. Logique pure, testée |
sdc:profile.story.sdc:profile.isle.Réglages → Personnaliser : déplacer chaque bouton, taille générale + taille par bouton, transparence, miroir, réinitialisation. Disposition enregistrée par orientation (localStorage, clé sdc:touchLayout). Un doigt peut glisser d'un bouton à l'autre sans lâcher (hit-test + hystérésis de 28 px). Zoom : bloqué sur la surface de jeu (touch-action: none, garde touchend, gesture*), autorisé dans les menus (pan-y pinch-zoom) ; le viewport ne l'interdit pas (WCAG 1.4.4).
sdc:profile : solde, voitures, pièces, défis, 40 derniers mouvements) restent en localStorage sur l'appareil du joueur.sdc:ghostssrc/replay.js | Moments forts : choix des 3 meilleurs instants sans chevauchement, découpe de la trajectoire, enregistrements vérifiés (sdc:recs, 8 au plus), lecture interpolée. Logique pure, testée |
src/net.js | Multijoueur pair à pair : session hôte/invités avec relais, état compact à 15 Hz, interpolation 120 ms, filtrage de tout ce qui vient du réseau, codes d'invitation compressés, transport WebRTC. Partie pure testée |
src/shop.js | Atelier : 6 rayons, aperçu avant achat, barre d'achat |
src/game.js | Boucle (pas fixe 120 Hz + interpolation), caméra, score, collisions, entrées, interface, carrière |
assets/favicon.svg, icons/, manifest.webmanifest | Favicon (intégré au build), icônes d'application, manifeste PWA |
docs/ | Visuels de cette page : screenshots/, brand/ (bannière, logos PNG, boutons) |
tests/ | node --test tests/*.test.js : économie, effets physiques des réglages, tracés, île, vie de l'île, multijoueur, aventure |
tools/ | Bancs d'essai : physique (Node), captures, tour complet, bot expert, perf, CPU ralenti, analyse audio, visuels du README (Playwright) |