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
One-button runner for the Seismic community. Rocky rides the seismograph; your score is your magnitude.
GamesJavaScript · HTMLGitHub @hossein6191OnlineOwner 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
One-button endless runner for the Seismic community. Rocky rides the seismograph; your score is your magnitude.
Taken from the repository README
Loading the full README.
Read the full README ↗Endless runner for the Seismic community. Rocky, a stone golem with a Seismic crystal in his chest, runs along a seismograph trace through the city: Bank District, The Exchange, Glass City and The Enclave. Every jump is written to the trace behind him, and the score is a Richter-style magnitude from M 1.0 upward.
Fan-made. Not an official Seismic product.
| hazard | from | answer |
|---|---|---|
| Glass Golem, Glass Spire | ground | jump (spire needs a held jump) |
| fault line (gap) | below | jump |
| Watcher, low | air | jump, or stomp it |
| Watcher, high | air | run under |
| Watcher beam, chest | air | slide |
| Watcher beam, shin | air | jump |
| Fangs | ceiling | slide |
| Glass Moth | air, flying at you | slide |
| Probe | above, dives at a marked spot | jump the stuck spike, or stomp it |
| Burrower | below, cracks then erupts | jump |
| Rock (rockfall event) | above, lands on a marked spot | jump the rubble |
| Vent | below | ride it up to the shard arcs |
Aftershocks every 600 m step the speed up and, from zone 2, start an event: Tremor, Watcher swarm, Rockfall, Glass storm. Biomes change every two zones.
Shielded (one hit absorbed), Resonance (shard magnet, 10 s), Overclock (4.5 s invulnerable dash, fault lines are bridged), Amplifier (shards count double, 12 s), Repair (heals a crack; only offered when cracked).
M = 1 + 2.2 · log10(1 + (metres + 20 · shards) / 50), capped at 9.9, with USGS
classes. Shard chains build a multiplier (×2 at 5, ×3 at 10, ×4 at 15; 3 s
timer; a crack resets it). Passing a hazard within 18 px is a close call
worth 2 shards. Stomping several things at once is a combo.
Missions (three at a time, from a pool of 43) raise your rank from Magnitude 1.0 to 9.0 and unlock skins (Obsidian, Rose Quartz, Glass, Enclave).
The first visit asks for a runner name. The name is the player's row on both leaderboards and the key to their save on the server (rank, missions, skins, best runs), so entering the same name on another phone or browser brings the progress back. If a name already has a save, the game shows it and asks "is this you?" before loading it. There is no password: a save can only grow (counters merge by maximum, finished missions by union), so playing under someone else's name can add to their progress but never erase it.
The first Run opens a How to play guide (controls for phone and keyboard, every hazard and pick-up drawn with the game's own art, zones, modes, missions); the title has a How to play button for later.
Static files, no build step. The local server also runs the leaderboard API against an in-memory store, so the whole online flow works without Vercel:
node serve.mjs 5173
Then open http://127.0.0.1:5173/. Handy URL flags: ?start=1200 begins an
endless run 1200 m in (practice; not posted), ?nopause=1 keeps running when
the tab loses focus, ?pwa=1 enables the service worker on localhost.
.).UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN (the KV_REST_API_*
names also work).RUN_SECRET with a long random string
(openssl rand -hex 32). Without it the Redis token is used as the signing
secret, which works but is weaker.Hosting the static files elsewhere (GitHub Pages) while the API lives on
Vercel also works: set window.MR_API_BASE = 'https://your-app.vercel.app'
before src/main.js loads.
| endpoint | purpose |
|---|---|
POST /api/start | issues a signed run token that carries the start time |
POST /api/submit | validates a run (token, single use, elapsed time vs distance, zone and magnitude recomputed, shard plausibility, rate limits) and stores the best per runner name |
GET /api/board?board=global|daily&limit=25&name= | top list plus the runner's own rank |
GET /api/profile?name= / POST /api/profile | a runner's save: read it, or merge this device's save into it |
A runner is their name (case-insensitive), never an account. Names are 2 to 14 characters, filtered server-side; "Rocky" is reserved. This is honest-player anti-cheat: the input-log replay verification in the roadmap is what would make it strict.
| file | what |
|---|---|
index.html, styles.css | shell, title, result, leaderboard, missions and settings panels |
src/game.js | loop, physics, spawner, events, collisions, HUD |
src/hazards.js | hazard registry (update/draw/hit per type), patterns, events, power-ups |
src/rocky.js | Rocky, Shard, Watchers and Glass Golems as procedural vectors; poses; skins |
src/world.js | the four city districts (parallax layers, baked to bitmaps on phones) |
src/input.js | keyboard, mouse, touch zones and swipe → jump / down |
src/audio.js, src/music.js | WebAudio cues and the adaptive procedural score |
src/missions.js | missions, lifetime stats, ranks, skin unlocks |
src/net.js | leaderboard and profile client |
src/save.js | the runner save and its merge, shared by the browser and api/profile.js |
src/howto.js | How to play illustrations, drawn with the hazards' own art |
src/card.js | 1200×630 share card |
src/ui.js, src/main.js | DOM panels and wiring |
api/ | Vercel functions (_lib is shared code, not a function) |
design/ | Rocky character brief and turnaround for designers |
sw.js, manifest.webmanifest | installable, offline-capable shell |
favicon.ico, favicon-*.png, icon-*.png, maskable-512.png | the logo at every size, drawn by design/logo.html from the in-game Rocky |
design/CHARACTER.md.Palette and type follow the Seismic Brand Kit v2: Mauve #825A6D,
Purple #523542, greys from #FCFCFC to #161616. Suisse Intl and Suisse
Works are licensed faces, so the web build uses Instrument Sans and
Instrument Serif as free stand-ins, with JetBrains Mono for readouts.