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,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A fast, mobile-first, touch-first physics soccer game — the classic style discs, built to be played
with two thumbs on a phone (and great on desktop and arcade "cocktail" setups too). It's a single
self-contained index.html: no build step, no dependencies, no server. Graphics are drawn on a
, sound is synthesized with the Web Audio API, and it installs & runs offline as a PWA.
Play: open index.html, or host it anywhere static (GitHub Pages, Netlify, an S3 bucket…).查看完整 README ↗Shipped under the working title Magnetball; the repository, the storage keys and the file format strings keep that name, by design.
A fast, mobile-first, touch-first physics soccer game — the classic style discs, built to be played
with two thumbs on a phone (and great on desktop and arcade "cocktail" setups too). It's a single
self-contained index.html: no build step, no dependencies, no server. Graphics are drawn on a
<canvas>, sound is synthesized with the Web Audio API, and it installs & runs offline as a PWA.
Play: open index.html, or host it anywhere static (GitHub Pages, Netlify, an S3 bucket…).
assets/ is absent./menu page (/settings redirects there), synced live with the game tab.It's plain static files. Either:
# open directly
open index.html # macOS (or just double-click)
# …or serve (recommended, so the service worker + fetches behave like production)
python3 -m http.server 8000 # then visit http://localhost:8000
Any static host. For GitHub Pages: push these files to the repo root, then
Settings → Pages → Deploy from branch → main / root.
The board reads from a Google Sheet with zero backend, and can write scores/replays via a small
Google Apps Script. Full setup — sheet sharing, the script to paste, and mock data — is in
LEADERBOARD_SETUP.md. The script lives in leaderboard.gs.
index.html The entire game (HTML + CSS + JS + canvas engine)
sw.js Service worker (offline / PWA, network-first for HTML)
manifest.json PWA manifest
icon.svg App icon
assets/ Optional art (flags, animal faces, controller icons) — see assets/README.md
menu/ The /menu route (the same document with the game switched off)
settings/ The old name of that route — a redirect to ../menu/
tests/ Headless Playwright suites — see tests/README.md
docs/ TODO, terminology, and the audit reports
leaderboard.gs Google Apps Script for the live leaderboard (paste into the Sheet)
LEADERBOARD_SETUP.md How to wire up the Google Sheet leaderboard
mock-scores.tsv Paste-in sample rows for the leaderboard sheet
ROADMAP.md Shipped log + backlog
CLAUDE.md Notes for working on this codebase — start at its START HERE section
CONTROLS.md Every input and what it does
server/, infrastructure/ The online match server, lockstep relay and Azure setup (not the game)
tools/ Dev-only scripts (commercial filming, goal seeds)
Vanilla HTML/CSS/JS. Fixed-timestep physics (1/60s) with sub-stepped collisions; elastic
disc/wall/arc collisions; theme engine driving both CSS variables and the canvas palette;
localStorage for all saves. No frameworks, no bundler, no network required to play.
The game exposes a debug hook when window.__MAGNETDEBUG = true (set before load) via
window.__magnet. 150 headless Playwright suites drive the real page — node tests/run.mjs.
See tests/README.md for what each covers, and CLAUDE.md
for how to write one.
Design & code: Ammar. Everything is programmatic — the pitch, the discs, the ball and every cosmetic are drawn on the canvas, and all audio is synthesised at runtime. The only image assets are optional: country flags and a few CC0 Kenney packs (animal faces, controller icons), each with a drawn fallback.