Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
A tactical path-drawing battle game
Translation pending
GamesTypeScript · JavaScriptGitHub @johannesjoOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Terrain matters: elevation grants range bonuses, obstacles block movement and line of sight, and flanking deals extra damage.
Every battle is fought on the same 360×640 map, whatever the device; the board is scaled to fit the screen, so ranges and distances play the same everywhere.
| Unit | Role |
|---|---|
| Soldier | Balanced all-rounder |
| Sniper | Long range, slow, fragile |
| Blade | Fast melee attacker |
| Shielder | Tanky frontline |
| Bomber | Area damage |
| Mortar | Lobs shells over cover at where enemies stand; can't hit close targets |
| Rocketeer | No gun; you draw its rocket's flight path, which launches at the end of its move |
| Menu | Planning | Battle | Result |
|---|---|---|---|
| Planning | Battle |
|---|---|
match-referee Edge Function that plays each round; see docs/online-play.md)Zero runtime CSS frameworks. Two themes (paper day mode, dark night mode) via CSS custom properties.
Sound effects and music are synthesized at runtime with WebAudio (no audio assets). Phones vibrate on kills and explosions (Capacitor Haptics on Android, the Vibration API on the web). Sound, music, vibration, reduced motion and theme are toggled from the main menu and saved locally; reduced motion follows the system setting by default.
npm install
npm run dev # start dev server
npm run build # production build
npm run test:run # run tests
npm run typecheck # app and integration-test types
npm run screenshots # capture every main screen at phone and desktop size into output/screenshots/
npm run screenshots needs Playwright with Chromium installed globally (npm i -g playwright && npx playwright install chromium) and fails if the page throws an error.
Online play talks to the shared Supabase project. To develop against a local
stack instead, set VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY for
npm run dev. The database and referee integration tests need a PostgreSQL 16
server: SEVEN_PG_URL=postgresql://postgres@localhost:5432/postgres npm run test:db.
After changing the engine or the referee, run npm run referee:bundle and
commit supabase/functions/match-referee/referee.mjs. Deployment: DEPLOYMENT.md.
After a battle, Share clip on the result screen plays the replay while recording it (with sound). When it's done, a second tap on Share recorded clip opens the share sheet (browsers only allow sharing straight after a tap); where sharing files isn't supported the video downloads instead. It's hidden in the Android app, whose WebView can't share or download the recording.
Append ?record to the URL to enable the built-in screen recorder. Press R during battle or replay to capture a WebM clip (max 15 seconds).
Run npm run video:capture to regenerate the square and 9:16 mobile action clips in store-assets/. The Playwright-driven capture includes path drawing before the battle and requires ffmpeg/ffprobe.