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를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.