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。 以下為已儲存的摘錄。
Prove the greybox. Then dress it.
AI that cannot break your level design.
Live: https://playbound-eta.vercel.app · Built for the Tencent × Arcade AI Hackathon (Cambridge, Oct 2026), Game Tech track.
Level designers block out levels with grey boxes to test gameplay, then wait weeks for art. Text-to-3D tools make one object at a time with no idea of the level. World generators invent a layout the designer never approved.
PLAYBOUND keeps the designer's layout as a contract, and puts AI at every step, always as a proposal the designer accepts or rejects:檢視完整 README ↗Prove the greybox. Then dress it. AI that cannot break your level design.
Live: https://playbound-eta.vercel.app · Built for the Tencent × Arcade AI Hackathon (Cambridge, Oct 2026), Game Tech track.
Level designers block out levels with grey boxes to test gameplay, then wait weeks for art. Text-to-3D tools make one object at a time with no idea of the level. World generators invent a layout the designer never approved.
PLAYBOUND keeps the designer's layout as a contract, and puts AI at every step, always as a proposal the designer accepts or rejects:
level.json + GLB models) for Unity, Unreal or Godot.src/core/prove/constants.ts.fitToVolume scales each one uniformly (plus at most 25% sideways stretch) to sit inside its box. Odd-shaped models leave some empty space in the box (fill 37–100% on the hero level).Requires Node 22+.
npm install
npm run dev # http://localhost:5173
npm test # Prove, line of sight, fit, dress, store, share and export tests (no network, no credits)
npm run build # typecheck + production build
Create a free key at https://aistudio.google.com and put it in .env (copy .env.example):
GEMINI_API_KEY=...
The dev server exposes /api/ai/* (sketch, style, command, fix). On Vercel the same handler runs as a function (api/ai/[action].ts); set GEMINI_API_KEY in the project's environment variables. The key never reaches the browser.
npm install --global @hyper3d/cli
hyper3d auth login # browser login; uses your account credits (~0.5 per model)
npm run dev # the dev server now exposes /api/rodin
With the dev server running, Dress generates any box that isn't prebaked (about 2 minutes each, 3 at a time), and Regenerate makes a new variant. Each model is downloaded, shrunk (~28 MB → ~1 MB with meshopt and WebP) and cached in public/assets/gen/ by a hash of (prompt, size, variant). The same request never spends credits twice.
npm run dev
npx tsx scripts/prebake.ts http://localhost:5173 # generate every dressable box of the presets
npx tsx scripts/prebake.ts --prune # remove models no preset uses
Then open /dev-viewer.html to see every model fitted inside its wireframe box.
| Part | Where |
|---|---|
| Level contract (types, coordinates) | src/core/types.ts |
| Market Square presets (fail / pass) | src/presets/marketSquare.ts |
| Prove: A* on a 0.5 m grid, line of sight + exposure heatmap, cover check | src/core/prove/ |
| Editing, AI proposals (accept / reject) | src/core/store.ts |
| AI co-designer: Gemini client, validation, suggest-fix agent loop | server/ai/, src/core/ai/, api/ai/ |
| Share links + local saves | src/core/share.ts |
| Shared collision (player and bot use the same boxes) | src/core/geometry.ts |
| Dress: prompt builder, queue, prebaked → live → error | src/core/dress/ |
| Fit any model inside its box | src/core/dress/fit.ts |
| Hyper3D CLI route, incl. image-to-3D (dev only) | server/rodinDevPlugin.ts |
| Export zip | src/core/export/exportLevel.ts |
| UI: three.js / react-three-fiber scene and panels | src/ui/ |
Stack: Vite, React 19, TypeScript, three.js, @react-three/fiber, drei, zustand, vitest, Gemini (REST), Hyper3D Rodin (CLI). Deployed on Vercel.
This was built by one person with two AI coding agents working in parallel: Claude Code on src/core, the server and deploy, and Cursor on src/ui. They coordinated through PLAN.md (task board and human feedback per milestone) and HANDOFF.md (append-only log).
| Time | Beat |
|---|---|
| 0:00 | A paper sketch of a market square → Sketch → level → ghost greybox → Accept |
| 0:20 | Prove → fails: death corridor, red route, heatmap of what the defenders see |
| 0:35 | Suggest fix → AI proposes a cart, Prove re-checks it → Accept → pass → Lock |
| 0:55 | Style image → AI style notes → Dress → Rodin models fill the boxes (each ~2 min live; prebaked here) |
| 1:25 | FPS walk; Show colliders: collision still matches the greybox; regenerate one prop live |
| 1:45 | Share link + Export zip. "AI that cannot break your level design." |