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 cute physics-flavoured endless runner for desktop and mobile browsers. Built with Phaser 3, TypeScript and Vite.
Add ?debug to the URL to draw the collision shapes and expose the scene as window.__scene.檢視完整 README ↗Hop, dash and splash down an endless river as a wobbly little duck. A cheerful 2D endless runner for desktop and mobile browsers, published on Poki. Built with Phaser 3, TypeScript and Vite.
Guide a chubby, squishy duck down a never-ending river. Jump over logs and rocks, double jump over crate stacks, and dash to smash crates. Collect corn kernels for points, then spend them on new ducks.
The duck swims by itself. On a player's first run the river pauses at the first log and the first crate, and a callout shows exactly what to press; on later runs the DASH button (or the D key) glows whenever a crate is coming and the dash is ready.
| Action | Desktop | Touch |
|---|---|---|
| Jump (press again in the air to double jump) | W, ↑ or Space | JUMP button (bottom-left), or tap the left half |
| Dash (smashes crates) | D or → | DASH button (bottom-right), or tap the right half |
| Start | Enter, a jump key or D | Play button, or any tap on the menu |
| Play again | Enter | Play Again button |
| Pause / resume | Esc or P | Pause button |
Needs Node.js 20+. The asset tools also need Python 3 with pillow and numpy.
npm install
npm run dev # http://localhost:5173 (also printed as a LAN URL for phone testing)
| Script | What it does |
|---|---|
npm run dev | Dev server with hot reload |
npm run typecheck | TypeScript check (must pass before committing) |
npm run build | Production build into dist/ |
npm run preview | Serve the last production build |
npm run build:poki | Poki build into dist-poki/ and a zip ready to upload (see below) |
Debug mode: add ?debug to the URL to draw hit boxes, log Game Events to the console and
expose the scene as window.__scene. Debug mode is stripped from the Poki build.
npm run build:poki builds with the real Poki HTML5 SDK
and zips the result as wobbly-duck-poki-v<version>-<commit>.zip, with index.html at the zip
root. The dev build uses a local stand-in instead (fake ads, events logged in debug mode).
package.json version + git commit (e.g. v0.1.0+3f5c2d1). It shows small
in the corner of the main menu and in the browser console, and it's in the zip name, so a bug
report or screenshot always tells you which build it came from. A build made with uncommitted
changes is marked -dirty.npm version patch (or minor), then npm run build:poki, then
upload the zip.gameplayStart; later runs and resumes get a commercial
break first. The SDK starts in parallel with the game (it can take seconds), and SDK calls queue
behind it in order. It uses rewarded breaks for the revive,
and sends Game Events. If the SDK is blocked (ad blocker) the game still
plays, without revives.src/config.ts: speeds, jump, water, spawning,
scoring, skins, prices, biomes, celebrations.src/game/Patterns.ts) are timed in seconds of
travel, so fairness holds at any speed. Obstacle spacing, food arcs and the crate-stack heights
were checked against the real jump physics and with in-game bots.index.html, src/ui/, src/style.css), not canvas text. It's
crisp at any pixel density and respects phone safe areas.src/platform/. Gameplay code never calls the
Poki SDK directly.index.html DOM overlay markup (menus, HUD, shop, revive)
src/main.ts Phaser game config, version label
src/config.ts All gameplay tuning
src/core/ Viewport, InputManager, Storage, Audio
src/platform/ Platform adapter: LocalPlatform (dev) / PokiPlatform (Poki build)
src/art/ Duck sheet layout and animations
src/game/ Duck, DuckView, Water, Background, ObstacleManager, FoodManager,
Parade, LilyPads, Patterns + Spawner, Skins, BestMarker, Confetti,
Analytics, effects (Splashes, ScorePopups, CameraShake, DashMeter)
src/scenes/ BootScene (loading), GameScene (state machine + game loop)
src/ui/ DOM UI and icons
assets-src/ High-res source art (versioned, not shipped)
public/assets/ Optimised WebPs (everything here ships)
tools/ Asset and build scripts (not shipped)
docs/ Specs, notes, screenshots (not shipped)
Source art lives in assets-src/. tools/optimize-images.py crops,
resizes and converts it to WebP in public/assets/, the only images the game loads. Art that
isn't used stays in assets-src/ and is listed under UNUSED in that script. The first load is
about 700 KB. Duck skins and the lake scenery load later, only when needed.
| Tool | Purpose |
|---|---|
tools/optimize-images.py | Export every runtime image (the MANIFEST) |
tools/process-duck-strip.py | Turn a duck strip on white into a transparent, eye-aligned sheet |
tools/pack-duck-variants.py | Pack generated duck variants into the duck sheet layout |
tools/pack-strip.py | Pack a sprite strip into equal cells (frog, lily pads) |
tools/split-kernel-sheet.py | Split the corn-kernel sheet into single images |
tools/zip-build.py | Zip a build for upload, with the version in the name |
Every asset's source and licence is recorded in docs/ASSET_LOG.md.
| Doc | For |
|---|---|
| AGENTS.md | Architecture rules, layout, gotchas, status. Read first when changing code (Claude Code loads it via CLAUDE.md) |
| docs/UI_SPEC.md | Menus, HUD, shop, revive and game-over spec |
| docs/DUCKLING_PARADE.md | The Duckling Parade twist: rules, fairness, scoring |
| docs/ASSET_SPEC.md | Art and audio style guide, sizes, pivots, what's still wanted |
| docs/ASSET_LOG.md | Source and licence of every asset |
| docs/ANALYTICS.md | The Poki Game Events the game sends, and why |
| docs/DUCK_CATALOG.md | Worldwide duck checklist for future skins |
| docs/publishing/ | Poki thumbnail |
Game by Saiss. Third-party code and fonts:
Game art is project-owned (see docs/ASSET_LOG.md).