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 browser-based, Pixel-Gun-3D–inspired voxel first-person shooter. Single self-contained
index.html built with three.js — no build step required.
Open index.html in a browser, or serve the folder and visit it:
Press START to play. (Needs an internet connection the first time — three.js loads from a CDN.)
Desktop
• WASD — move
• Mouse — look (click to lock the pointer)
• Click — shoot (hold for the auto rifle)
• 1 / 2 / 3 or mouse wheel — switch weapon檢視完整 README ↗A browser-based voxel first-person shooter that walks Egypt's own history — Old Kingdom to Mamluk
Cairo — and then sells you passage out of it. Single self-contained index.html built with
three.js, no build step.
Open index.html in a browser, or serve the folder and visit it:
python3 -m http.server 8000
# then open http://localhost:8000
Press PLAY to play. (Needs an internet connection the first time — three.js loads from a CDN. The
desktop build in electron/ vendors it and runs fully offline.)
SETTINGS (on the title screen and the pause screen) holds mouse or look sensitivity, invert look, field of view, master / music / effects volume, and graphics: HIGH, or FAST (no sun shadows, 1x resolution ceiling) for weaker machines.
Desktop
Movement follows the physical keys, so on an AZERTY keyboard it is ZQSD — and the on-screen key captions say so once the game has seen the layout.
Mobile / touch
Egypt runs as one continuous ladder of waves across four eras, each with its own map, enemies and weapons, and each handing on to the next when its boss falls:
| Waves | Era | Ends with |
|---|---|---|
| 1–3 | Old Kingdom — the pyramid and the chamber beneath it | The Colossus |
| 4–6 | Greek — the agora, and the marsh the Hydra lives in | The Hydra |
| 7–9 | Roman — the frontier fort and the Colosseum | The Champion |
| 10 | Mamluk Cairo | the hub, and the travel booth |
Cairo has no enemies of its own. It is where a run ends and where the rest of the game is bought.
Kills bank ⭐ across the whole run. The booth in the Cairo bazaar spends it on passage to a real destination, each of which is two maps on one ticket and ends somewhere new:
| Destination | ⭐ | The trip | |
|---|---|---|---|
| 🗿 | Mexico | 50 | Olmec La Venta → Aztec Tenochtitlan → the Aztec Market, a second booth |
| 🛡️ | Sweden | 60 | Birka → the fjord and the Skerry Troll → Aldeigjuborg, a third booth |
| 🐉 | China | 70 | Xiangyang's wall and its breach → the chained, burning fleet at Yamen |
Each destination carries its own weapons, its own roster of enemies, and its own bosses. Clearing all three opens the way to the game's ending — see The ending.
Every era and destination swaps the whole loadout:
| Loadout | Weapons |
|---|---|
| Old Kingdom | Bow · Khopesh · Was Scepter |
| The Nile | Harpoon |
| Greek | Sling · Xiphos · Trident |
| Roman | Javelin · Pugio · Greek Fire |
| Mamluk | Qaws · Saif · Naft Pot |
| Olmec | Macana · Blowgun · Atlatl |
| Aztec | Tecpatl · Chimalli · Smoking Mirror |
| Viking | Dane Axe · Hunnish Bow · Throwing Seax |
| Song | Zhanmadao · Repeating Crossbow · Thunderclap Bomb |
Several carry a second mode — the Hunnish Bow draws and holds, the Atlatl and Throwing Seax slash at close range instead of throwing.
Press Z · X · X · C · C · C in order. Toggles god mode, infinite ammo, infinite money, insta-kill
and flight; jumps to any wave or destination. The same flags are reachable as /god, /fly, /tp
and friends in the console (two C presses in a row). The sequence is deliberately awkward so a cheat
cannot fire by accident mid-run.
Both are off in the portal build (the copy that carries the CrazyGames SDK): most shooters bind C to
crouch, and a player reaching for it would open a cheat console. Add #dev to the URL to turn them back
on there for testing.
electron/ wraps this same file in an Electron window with a vendored three.js, so it
runs with no network. See electron/README.md. Current build: 1.1.0, macOS
arm64 only.
tools/portal/build-portal.js (or build_portal.py, the same build for a machine without Node) produces
the self-contained copy for CrazyGames or a similar portal — three.js vendored locally the same way the
desktop build does it, so the game doesn't depend on a CDN inside a sandboxed iframe, plus the CrazyGames
SDK. The store covers and the preview videos are rendered from the game itself by scripts beside it. See
tools/portal/README.md.
tools/audit/ runs the game's whole script headlessly inside py_mini_racer against a stubbed three.js
and reads back real world-space bounding boxes — no browser, no build step. It checks that actors
stand on the floor, that no model renders as floating shards, that every map's ramps climb and its
decks hold you, and that nothing z-fights. See tools/audit/README.md.
pip install py-mini-racer
python3 tools/audit/fullcheck.py # the whole game
python3 tools/audit/chinacheck.py # one destination, end to end
python3 tools/audit/finalcheck.py # the endgame: gate, boss, and the Nile bank
China is the last road. The moment the Yamen Admiral goes down on his own flagship you are not sent home — the Gate of Ages opens where you stand and takes you straight to the final fight. Mexico and Sweden are optional side-roads and neither opens it.
The gate also stands, unlocked, in whichever hub you are in — Cairo, the Aztec Market or Aldeigjuborg — so there is a way back in if you die in the arena. It is never sold at the booth and costs nothing.
Through it is one fight and no waves: THE SUM OF AGES, 5200 HP, a lapis-and-gold monument carrying a rack of trophies from every boss it remembers. It spends its health walking down through four ages, and quotes the fight each trophy came from — the Colossus' heaving ground, the Hydra's venom, the Bearer's fire serpent, the Admiral's burning floor — calling that era's own minions up beside it as it goes. The age is read off its health rather than latched, so dying and coming back resumes the one your damage earned.
When it falls you land on the bank of the Nile: a small, quiet map with a river, a low sun and a stele that names every boss you put down. Nothing to fight, nothing to buy. Press E at the stele to read the roll, and again to begin a new run.
Progress saves by itself at checkpoints — the start of an era, a hub, the start of a trip's leg — and the
title screen offers CONTINUE (and NEW GAME, which asks twice). On CrazyGames it is kept in their Data
module, so it follows a player who logs in; everywhere else in localStorage. Dying rolls you back to the
start of the current era and no further, keeps credit for bosses already beaten, respawns you on the leg
you died on if you were away on a trip, and never touches your banked ⭐.
© 2026 Rafea el Ansary. All rights reserved — the source is public to read, not to reuse. See LICENSE, which also carries the notices for the only third-party pieces in here: three.js (MIT), Natural Earth's coastline data (public domain), and the Rubik and Cinzel typefaces (SIL OFL 1.1, full text in OFL.txt). Everything else — every model, texture, sound and note of music — is generated by the code itself.