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
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證One-button endless runner for the Seismic community. Rocky rides the seismograph; your score is your magnitude.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 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.