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.