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 standalone, zero-dependency playable jam prototype using the SLU Web Shell's Survivor Frame as its template contract. The game does not live inside or modify the shell repository.
Open http://localhost:4173. npm run build runs the deploy gate used by Vercel.
npm run build is a chain of string-rewrite passes (prepare-build.mjs, then
pass-*.mjs) that patch five files in place. Those five files are authored in
src/ and the build copies them into public/ before patching:檢視完整 README ↗A standalone, zero-dependency playable jam prototype using the SLU Web Shell's Survivor Frame as its template contract. The game does not live inside or modify the shell repository.
npm run dev
Open http://localhost:4173. npm run build runs the deploy gate used by Vercel.
npm run build is a chain of string-rewrite passes (prepare-build.mjs, then
pass-*.mjs) that patch five files in place. Those five files are authored in
src/ and the build copies them into public/ before patching:
| authored | generated |
|---|---|
src/game.js | public/game.js |
src/meta.js | public/meta.js |
src/retention.js | public/retention.js |
src/celestial-frame.js | public/celestial-frame.js |
src/arsenal-runtime.js | public/arsenal-runtime.js |
Edit src/, never the five generated files in public/ — they are
git-ignored and overwritten on every build. Every other file in public/ is a
hand-written source served as-is.
Restoring from src/ first is what makes the build repeatable: the passes anchor
on exact source text, so re-patching already-patched output fails. Because the
generated files are not committed, the deployed bundle can no longer drift from
the build output.
npm run seam-audit re-runs the pass chain and reports any pass whose anchor
text matches in more than one place — the failure mode that once injected the
dash hook into the wrong function.
A sector commander reads the frame it is about to fight, once, at the moment it spawns, and picks how to answer. It never re-reads the build mid-fight — that reads as the boss cheating rather than responding.
Each of the 30 arsenal families carries a primary archetype tag from {SIEGE,
MOBILE, CLOSE, CONTROL, SUMMON, PRECISION, AOE/SWARM, TEMPORAL}, and some carry
a secondary at half weight. The score for an archetype is the sum of
family_tier_level x weight over the families the build owns. If the leader is
ahead of the runner-up by at least 40% relative it answers alone; otherwise the
top two responses are blended.
Shipping resolution collapses the eight archetypes into three super-buckets —
RANGED (PRECISION+SIEGE+TEMPORAL), CLOSE (CLOSE+MOBILE) and CONTROL
(CONTROL+SUMMON+AOE/SWARM) — so fairness and feel can be validated on three
response sets first. Flip COMMANDER_DOCTRINE.mode in pass-u-commander.mjs
from 'buckets' to 'archetypes' to split into the full eight; nothing else
has to change.
| Archetype | Response |
|---|---|
| SIEGE | Displacement telegraph, then a long exposed punish window |
| MOBILE | Predictive intercept lanes; exposed during its own reposition |
| CLOSE | Dangerous outer ring, then a clear close-range punish window |
| CONTROL | Adds stay manipulable; the core resists lockdown but breaks under pressure |
| SUMMON | Multi-point pylons any weapon can clear; occasional anti-summon pulse |
| PRECISION | Break plates that spend aimed damage into an execution window |
| AOE/SWARM | Split/merge formations, and calling one costs the commander a beat |
| TEMPORAL | Safe/unsafe cadence windows — timing advantage, not immunity |
A response may make a build work harder; it may never switch one off.
DOCTRINE_LIMITS in public/commander-doctrine.js states that as numbers —
control always moves the core, pylons gate damage rather than stopping it,
anti-summon pressure is occasional, and every response opens a readable window
that pays out. commander.test.mjs enforces those limits against every
response and every pairwise blend, and proves each archetype opens to ordinary
play within 25 seconds.
The arrival ceremony runs over live gameplay — the HUD yields, the sky darkens, the camera eases back, and the frame keeps taking input the whole time. A commander is introduced in full only the first time it is met; after that the card is abbreviated, and it is always skippable with any input.
Controls: WASD, arrow keys, or the left gamepad stick. Dash with Space/Shift or gamepad B/RB. Weapons fire automatically. Level-up choices support mouse/touch or number keys 1–3. Open the in-game VFX Lab with F8 (fn + F8 on Mac media-key layouts) or Command + Shift + V.
The prototype's player state is a compact genome:
Every chosen upgrade mutates both combat behavior and the rendered mech silhouette.
Arcane enemies now use a deterministic CreatureGenome defined in public/creatures.js. Body plan, appendages, organs, mutations, behavior, palette and derived gameplay stats are generated from a seed. The main menu includes a Creature Lab for batch generation, seed inspection and one-trait mutation. See CREATURE_SYSTEM.md for the reusable contract.
The player frame now uses the separate celestial visual renderer in the same module: strict symmetry/radial construction for the frame versus broken/asymmetric biological construction for enemies.