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,即可验证所有权并自行管理介绍。
一分钟完成验证CAKE WALK - a 60-second pixel-art wedding-cake balancing game. Hold to walk. Move to balance.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
60 seconds to save the wedding. Hold to walk. Move to balance.
🏆 1st prize winner at the TinkerHub x Devin event in Kochi 🏆
Seven tiers, sixty seconds, and not a single cake dropped.
You are a nervous waiter carrying a 7-tier wedding cake from the kitchen to the cake table
across a chaotic reception. The best man's toast happens at 0:00. If the cake isn't on the table
by then, or if it falls, the wedding is ruined.查看完整 README ↗60 seconds to save the wedding. Hold to walk. Move to balance.
___________
'._==_==_=_.' .------------------------------------.
.-\: /-. | |
| (|:. 1st |) | | * W I N N E R * |
'-|:. |-' | |
\::. / | TINKERHUB KOCHI |
'::. .' | DEVIN EVENT - 1ST PRIZE |
) ( | |
_.' '._ | 7 TIERS . 60 SECONDS . 0 DROPPED |
'-------' '------------------------------------'
You are a nervous waiter carrying a 7-tier wedding cake from the kitchen to the cake table across a chaotic reception. The best man's toast happens at 0:00. If the cake isn't on the table by then, or if it falls, the wedding is ruined.
Made for the "60 Seconds to Save It" game jam (Night Out with Devin): one minute, one level, two inputs, a clear win or loss, and a cake that almost falls a lot but rarely actually does.
Play: https://cake-walk-two.vercel.app
Both inputs act on the same horizontal axis: speeding up tips the cake back, stopping tips it forward. Slide the tray under the lean.
| Desktop | Mobile | |
|---|---|---|
| Walk | Hold Space / W / ↑ or the left mouse button | Touch and hold the right half of the screen |
| Balance | Move the mouse left/right, or A/D / ←/→ | Tilt the phone (tap Enable tilt controls), or drag on the left half |
| Retry | R | Retry button |
| Pause | P / Esc (also automatic when the tab loses focus) | ❚❚ button |
| Mute | M | ♪ button |
| Fullscreen | F | ⛶ button |
Stop inside the glowing zone in front of the cake table, slow and upright, and hold still for half a second to set the cake down.
Pick a world on the title screen with the three square picture buttons under the menu (or
← / → on a keyboard). The choice is remembered, and ?world=pirate or ?world=space links
straight to it.
The same 60-second walk across two ships lashed together at sunset, to the captain's table.
An astronaut is marrying an alien on the observation deck. Carry the cake there from the docking bay, past windows full of planets, while the station does its best to stop you.
Every obstacle telegraphs itself about a second ahead with a ! bubble or animation.
YYYY-MM-DD).?seed=anything forces a seed (great for replaying a friend's run).The layout is fixed; the seed varies the uncle's rhythm, the Roomba's route, the toddler's delay, grandma's patience, the bass-drop direction, the bouquet's landing offset and the conga timing. On the ship it varies the swell, where the cannonballs, barrel, plank and kraken sit, the barrel's swing, how long the parrot stays and when the wave breaks. On the station it varies the walkway's length and speed, the laser's rhythm, the gravity cycle, how far the teleporter throws you, the saucer's sway and the meteors' count, timing and first side.
Win: cake set down before 0:00 with at least 4 tiers.
Lose: the tower topples ("The cake has left the building."), fewer than 4 tiers remain ("That's not a wedding cake. That's a cupcake."), or time runs out ("The best man toasted an empty table.").
Every try scores, win or lose, with no ceiling. The score adds up:
So two runs that end at the same spot still score differently. The parts are on the results
card; the formula is src/score/formula.ts and its constants live in tuning.ts.
Grades: S = 7 tiers and ≥ 15 s left, A = 6+, B = 5, C = 4, F = loss.
Personal best: one per world (Daily Challenge and Random share it), kept in IndexedDB with the player's name and id. The title shows it next to a link to the scoreboard.
Scoreboard: top 10 per world, this week (ISO week, UTC) and all time. Each player gets a
random name (e.g. WobblyOtter42) that they can change under Controls or on the
scoreboard. See Scoreboard for how it is stored.
Share sends a score card (the final frame plus the score) through the Web Share API, copies
it to the clipboard on desktop, or saves it, along with text like
🎂 CAKE WALK — Daily Challenge 2026-09-30 — 19,880 pts — Grade S — 7/7 tiers — 17.3s left.
Requires Node 20+.
npm install
npm run dev # http://localhost:5173
| Script | What it does |
|---|---|
npm run dev | Vite dev server |
npm run build | Type-check and build to dist/ |
npm run preview | Serve the production build |
npm test | Vitest unit tests + the 30-seed headless bot run |
npm run lint | ESLint + Prettier check |
npm run typecheck | tsc --noEmit (strict) |
npm run e2e | Playwright smoke test against the built site (run npx playwright install chromium once) |
?debug=1 - overlay with FPS, θ, ω, L, aTray, per-tier slides, hitboxes, block line and the
seed. Keys 1-9, 0 skip to each zone.?bot=1 - the autopilot plays the real round (handy for demos and recording GIFs).src/game/tuning.ts, commented.imageSmoothingEnabled = false, devicePixelRatio aware.src/physics/, pure and unit-tested): the cake is an inverted pendulum on the
tray, θ'' = (G/L)·sinθ − (aTray/L)·cosθ − DAMP·ω − GLUE·θ + impulses, with L recomputed
from the tiers still standing (so losing tiers makes the cake twitchier). Each tier slides on
the one below with a damped spring; past 45 % of the lower tier's width it falls off along with
everything above it.src/input/) reduces keyboard, mouse, touch and gyro into one
Intent { walk, trayTarget } per tick - the simulation never sees raw input.src/game/World.ts) is completely headless, so the autopilot
(src/bot/autopilot.ts, a PD controller on the lean plus predictive hazard gating) can play it
in tests and in the title-screen attract mode.The feel was tuned with headless parameter sweeps against controllers with simulated human reaction delays:
| Constant | Value | Why |
|---|---|---|
G / L_SCALE | 135 / 2.4 | Full cake L ≈ 61 px, G/L ≈ 2.2: an unbalanced full-throttle start topples in ~2.3 s |
DAMP | 1.0 | Low on purpose - high damping makes slow tray corrections useless |
GLUE / GLUE_ZONE | 9 / 8.5° | Frosting "catch net": small wobbles self-correct, big ones don't |
ARM_COUPLING | 0.5 | Half the walking jolt reaches the tray |
TRAY_SPEED / RESPONSE | 60 px/s / 7 | Smooth tray = forgiving of late, jerky corrections |
SLIDE_GAIN | 4.1 | Top tier slides off after a sustained ~22° lean |
TOPPLE_ANGLE | 40° | Whole cake falls |
A naive "hold walk and ignore the tray" run always topples; a tray controller with a 0.3 s reaction delay still wins. The perfect bot wins all 30 test seeds with 7 tiers in 35.5-37.8 s (22+ s to spare).
The repo deploys with zero configuration beyond importing it. vercel.json pins the Vite preset,
npm ci, npm run build, output dist, SPA-safe rewrites and immutable long-cache headers for
/assets/*.
cake-walk GitHub repository.npm run build, output dist).main then deploys to production, and PRs get previews.Or from the CLI:
npx vercel@latest # first run links the project
npx vercel@latest --prod
api/scores.ts is a Vercel Function backed by a free Upstash Redis
database. Until the database is connected it answers 503 and the game simply hides the
scoreboard; personal bests always work offline.
One-time setup: in the Vercel project open Storage → Create Database → Upstash for Redis
(free plan) and connect it to the project. That adds KV_REST_API_URL and KV_REST_API_TOKEN
(plain UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN work too). Redeploy.
cw:all:<world> and cw:week:<week>:<world> sorted
sets, plus a cw:names hash). Weekly boards expire 40 days after their last write.ZREM in the Upstash
console.?bot=1) and debug (?debug=1) rounds are never recorded.index.html carries the Open Graph and Twitter tags that WhatsApp, iMessage, Slack, Discord and
X read for link previews, plus a canonical URL and VideoGame structured data for search engines.
public/ holds the share image (og-image.png, 1200×630), icons, site.webmanifest,
robots.txt and sitemap.xml. These use the absolute production URL
https://cake-walk-two.vercel.app; if the domain changes, update it in index.html,
robots.txt and sitemap.xml.