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.